From 1a1a1b8fecba729ba673f17cd155b8f4868c7e41 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 27 Jul 2023 00:54:19 +0530 Subject: [PATCH 01/50] [Ritesh] | 1. Repo set up. 2. Created Slot and Schedule entity 3.Saving IPD Medication Schedule without creating slots. --- .github/workflows/build_publish.yaml | 24 + .github/workflows/validate_pr.yml | 22 + .gitignore | 22 + LICENSE | 661 ++++++++++++++++++ api/pom.xml | 181 +++++ .../org/bahmni/module/ipd/IPDActivator.java | 22 + .../bahmni/module/ipd/dao/ScheduleDAO.java | 15 + .../org/bahmni/module/ipd/dao/SlotDAO.java | 15 + .../ipd/dao/impl/HibernateScheduleDAO.java | 38 + .../module/ipd/dao/impl/HibernateSlotDAO.java | 48 ++ .../bahmni/module/ipd/model/Reference.java | 36 + .../org/bahmni/module/ipd/model/Schedule.java | 70 ++ .../org/bahmni/module/ipd/model/Slot.java | 111 +++ .../module/ipd/service/ScheduleService.java | 21 + .../module/ipd/service/SlotService.java | 21 + .../ipd/service/impl/ScheduleServiceImpl.java | 42 ++ .../ipd/service/impl/SlotServiceImpl.java | 42 ++ .../module/ipd/util/PrivilegeConstants.java | 13 + api/src/main/resources/liquibase.xml | 111 +++ .../resources/moduleApplicationContext.xml | 29 + mvnw | 287 ++++++++ mvnw.cmd | 187 +++++ omod/pom.xml | 133 ++++ .../bahmni/module/ipd/ModuleDescriptor.java | 3 + .../module/ipd/contract/MedicationSlot.java | 18 + .../contract/ScheduleMedicationRequest.java | 29 + .../contract/ScheduleMedicationResponse.java | 36 + .../ScheduleMedicationController.java | 46 ++ .../ipd/mapper/ScheduleMapperService.java | 45 ++ .../service/ScheduleMedicationService.java | 8 + .../impl/ScheduleMedicationServiceImpl.java | 72 ++ omod/src/main/resources/config.xml | 19 + .../resources/webModuleApplicationContext.xml | 6 + .../module/ipd/BaseIntegrationTest.java | 7 + .../module/ipd/BaseWebControllerTest.java | 175 +++++ ...leMedicationControllerIntegrationTest.java | 53 ++ omod/src/test/resources/config.xml | 21 + .../resources/webModuleApplicationContext.xml | 6 + pom.xml | 370 ++++++++++ 39 files changed, 3065 insertions(+) create mode 100644 .github/workflows/build_publish.yaml create mode 100644 .github/workflows/validate_pr.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 api/pom.xml create mode 100644 api/src/main/java/org/bahmni/module/ipd/IPDActivator.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/model/Reference.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/model/Schedule.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/model/Slot.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/service/SlotService.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java create mode 100644 api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java create mode 100644 api/src/main/resources/liquibase.xml create mode 100644 api/src/main/resources/moduleApplicationContext.xml create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 omod/pom.xml create mode 100644 omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java create mode 100644 omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java create mode 100644 omod/src/main/resources/config.xml create mode 100644 omod/src/main/resources/webModuleApplicationContext.xml create mode 100644 omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java create mode 100644 omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java create mode 100644 omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java create mode 100644 omod/src/test/resources/config.xml create mode 100644 omod/src/test/resources/webModuleApplicationContext.xml create mode 100644 pom.xml diff --git a/.github/workflows/build_publish.yaml b/.github/workflows/build_publish.yaml new file mode 100644 index 0000000..0a569fe --- /dev/null +++ b/.github/workflows/build_publish.yaml @@ -0,0 +1,24 @@ +name: Build and Publish package +on: + push: + branches: [ main ] + workflow_dispatch: + +jobs: + build-publish-package: + name: Build and Publish package + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + server-id: nexus-sonatype + server-username: NEXUS_USERNAME + server-password: NEXUS_PASSWORD + - name: Build and deploy with Maven + run: ./mvnw --no-transfer-progress clean -U deploy + env: + NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} + NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} diff --git a/.github/workflows/validate_pr.yml b/.github/workflows/validate_pr.yml new file mode 100644 index 0000000..2c20d1c --- /dev/null +++ b/.github/workflows/validate_pr.yml @@ -0,0 +1,22 @@ +# This workflow will build a Java project with Maven +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: Java CI with Maven + +on: + pull_request: + branches: [ Bahmni-IPD-master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn clean package diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ef96046 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +*.class +.settings +.project +.classpath +.talismanrc +target + +# Package Files # +*.jar +*.marker +*.war +*.ear +.idea +.DS_Store + +/omod/target/* +/api/target/* +*.iml +*/logs/* +logs/* +classes/ +.mvn/wrapper/*.jar diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 0000000..b28f5db --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,181 @@ + + + 4.0.0 + + org.bahmni.module + bahmni-ipd + 1.0.0-SNAPSHOT + + + bahmni-ipd-api + jar + Bahmni IPD API + Bahmni IPD API contains all backend APIs for IPD + + + + + src/main/resources + true + + + + + + src/test/resources + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + test-jar + + + + + + + + + + + org.openmrs.api + openmrs-api + + + org.projectlombok + lombok + + + org.openmrs.web + openmrs-web + + + org.openmrs.module + webservices.rest-omod-common + provided + + + + org.openmrs.module + webservices.rest-omod-2.0 + provided + + + + org.openmrs.module + webservices.rest-omod-common + test-jar + test + + + org.openmrs.test + openmrs-test + pom + + + org.openmrs.web + openmrs-web + test-jar + test + + + org.openmrs.api + openmrs-api + test-jar + test + + + org.powermock + powermock-api-mockito2 + test + + + org.mockito + mockito-core + test + + + org.powermock + powermock-module-junit4 + test + + + junit + junit + + + org.hamcrest + hamcrest-core + + + test + + + + + + diff --git a/api/src/main/java/org/bahmni/module/ipd/IPDActivator.java b/api/src/main/java/org/bahmni/module/ipd/IPDActivator.java new file mode 100644 index 0000000..4feb3e4 --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/IPDActivator.java @@ -0,0 +1,22 @@ +package org.bahmni.module.ipd; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.openmrs.module.BaseModuleActivator; + +/** + * This class contains the logic that is run every time this module is either started or shutdown + */ +public class IPDActivator extends BaseModuleActivator { + + private final Log log = LogFactory.getLog(this.getClass()); + + public void startup() { + log.info("Starting Basic Module"); + } + + public void shutdown() { + log.info("Shutting down Basic Module"); + } + +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java b/api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java new file mode 100644 index 0000000..be0618d --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java @@ -0,0 +1,15 @@ +package org.bahmni.module.ipd.dao; + +import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.api.db.DAOException; +import org.springframework.stereotype.Repository; + +@Repository +public interface ScheduleDAO { + + Schedule getSchedule(Integer scheduleId) throws DAOException; + + Schedule saveSchedule(Schedule schedule) throws DAOException; + + void purgeSchedule(Schedule schedule) throws DAOException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java b/api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java new file mode 100644 index 0000000..7a1abce --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java @@ -0,0 +1,15 @@ +package org.bahmni.module.ipd.dao; + +import org.bahmni.module.ipd.model.Slot; +import org.openmrs.api.db.DAOException; +import org.springframework.stereotype.Repository; + +@Repository +public interface SlotDAO { + + Slot getSlot(Integer slotId) throws DAOException; + + Slot saveSlot(Slot slot) throws DAOException; + + void purgeSlot(Slot slot) throws DAOException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java new file mode 100644 index 0000000..0d8f011 --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java @@ -0,0 +1,38 @@ +package org.bahmni.module.ipd.dao.impl; + +import org.bahmni.module.ipd.dao.ScheduleDAO; +import org.bahmni.module.ipd.model.Schedule; +import org.hibernate.SessionFactory; +import org.openmrs.api.db.DAOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class HibernateScheduleDAO implements ScheduleDAO { + + private static final Logger log = LoggerFactory.getLogger(HibernateScheduleDAO.class); + private final SessionFactory sessionFactory; + + @Autowired + public HibernateScheduleDAO(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + @Override + public Schedule getSchedule(Integer scheduleId) throws DAOException { + return sessionFactory.getCurrentSession().get(Schedule.class, scheduleId); + } + + @Override + public Schedule saveSchedule(Schedule schedule) throws DAOException { + sessionFactory.getCurrentSession().saveOrUpdate(schedule); + return schedule; + } + + @Override + public void purgeSchedule(Schedule schedule) throws DAOException { + sessionFactory.getCurrentSession().delete(schedule); + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java new file mode 100644 index 0000000..06577ed --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java @@ -0,0 +1,48 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under + * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. + * + * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS + * graphic logo is a trademark of OpenMRS Inc. + */ +package org.bahmni.module.ipd.dao.impl; + +import org.bahmni.module.ipd.dao.SlotDAO; +import org.bahmni.module.ipd.model.Slot; +import org.hibernate.SessionFactory; +import org.openmrs.api.db.DAOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class HibernateSlotDAO implements SlotDAO { + + private static final Logger log = LoggerFactory.getLogger(HibernateSlotDAO.class); + + private final SessionFactory sessionFactory; + + @Autowired + public HibernateSlotDAO(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + @Override + public Slot getSlot(Integer slotId) throws DAOException { + return sessionFactory.getCurrentSession().get(Slot.class, slotId); + } + + @Override + public Slot saveSlot(Slot slot) throws DAOException { + sessionFactory.getCurrentSession().saveOrUpdate(slot); + return slot; + } + + @Override + public void purgeSlot(Slot slot) throws DAOException { + sessionFactory.getCurrentSession().delete(slot); + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Reference.java b/api/src/main/java/org/bahmni/module/ipd/model/Reference.java new file mode 100644 index 0000000..33530ad --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/model/Reference.java @@ -0,0 +1,36 @@ +package org.bahmni.module.ipd.model; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import org.openmrs.BaseOpenmrsMetadata; + +import javax.persistence.*; + +@Getter +@Setter +@Entity +@Table(name = "ipd_reference") +public class Reference extends BaseOpenmrsMetadata { + + private static final long serialVersionUID = 1L; + + public Reference() { + setName(""); + } + + @EqualsAndHashCode.Include + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "reference_id") + private Integer id; + + @Column(name = "target_type") + private String type; + + @Column(name = "target_uuid") + private String targetUuid; + + @Column(name = "reference") + private String reference; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Schedule.java b/api/src/main/java/org/bahmni/module/ipd/model/Schedule.java new file mode 100644 index 0000000..2e1be9b --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/model/Schedule.java @@ -0,0 +1,70 @@ +package org.bahmni.module.ipd.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.openmrs.BaseChangeableOpenmrsData; +import org.openmrs.Concept; + +import javax.persistence.*; +import java.util.Date; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +@Entity +@Table(name = "ipd_schedule") +public class Schedule extends BaseChangeableOpenmrsData { + + private static final long serialVersionUID = 1L; + + @EqualsAndHashCode.Include + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "schedule_id") + private Integer id; + + /** + * The entity who benefits from the performance of the service specified in the task (e.g., the + * patient). + */ + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id") + private Reference forReference; + + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id") + private Reference byReference; + + /** + * Whether this schedule is in active use + */ + @Column(name = "active", nullable = false) + private boolean active = Boolean.TRUE; + + /** + * The Service Type of the Schedule + */ + @OneToOne + @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") + private Concept serviceType; + + /** + * The Start Date the Schedule + */ + @Column(name = "start_date", nullable = false) + private Date startDate; + + /** + * The End Date the Schedule + */ + @Column(name = "end_date", nullable = false) + private Date endDate; + + /** + * Any Comment for the Schedule + */ + @Column(name = "comments") + private String comments; + +} diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Slot.java b/api/src/main/java/org/bahmni/module/ipd/model/Slot.java new file mode 100644 index 0000000..408ab13 --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/model/Slot.java @@ -0,0 +1,111 @@ +package org.bahmni.module.ipd.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.openmrs.BaseChangeableOpenmrsData; +import org.openmrs.Concept; +import org.openmrs.Location; +import org.openmrs.Order; + +import javax.persistence.*; +import java.util.Date; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +@Entity +@Table(name = "ipd_slot") +public class Slot extends BaseChangeableOpenmrsData { + + private static final long serialVersionUID = 1L; + + public enum SlotStatus { + SCHEDULED, + MISSED, + COMPLETED, + CANCELLED + } + + @EqualsAndHashCode.Include + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "slot_id") + private Integer id; + + /** + * The location Where schedule occurs + */ + @ManyToOne(optional = false) + @JoinColumn(referencedColumnName = "location_id") + private Location location; + + /** + * The Service Category of the Schedule + */ + @OneToOne + @JoinColumn(name = "service_category_id", referencedColumnName = "concept_id") + private Concept serviceCategoryId; + + /** + * The Service Type of the Schedule + */ + @OneToOne + @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") + private Concept serviceTypeId; + + /** + * The Speciality of the Schedule + */ + @OneToOne + @JoinColumn(name = "speciality_id", referencedColumnName = "concept_id") + private Concept specialityId; + + /** + * The Appointment Type of the Schedule + */ + @OneToOne + @JoinColumn(name = "appointment_type_id", referencedColumnName = "concept_id") + private Concept appointmentTypeId; + + /** + * The entity that belongs to a Schedule + */ + @ManyToOne + @JoinColumn(name = "schedule_reference_id", referencedColumnName = "schedule_id") + private Schedule schedule; + + /** + * The Start Date the Slot + */ + @Column(name = "start_date", nullable = false) + private Date startDate; + + /** + * The End Date the Slot + */ + @Column(name = "end_date", nullable = false) + private Date endDate; + + /** + * Any Comment for the Slot + */ + @Column(name = "comment") + private String comment; + + /** + * The current status of the slot. + */ + @Column(name = "status", nullable = false) + @Enumerated(EnumType.STRING) + private SlotStatus status; + + /** + * Order of the Slot + */ + @OneToOne + @JoinColumn(name = "order_id", referencedColumnName = "order_id") + private Order orderId; +} + + diff --git a/api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java b/api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java new file mode 100644 index 0000000..3ed46ee --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java @@ -0,0 +1,21 @@ +package org.bahmni.module.ipd.service; + +import org.bahmni.module.ipd.model.Schedule; +import org.bahmni.module.ipd.util.PrivilegeConstants; +import org.openmrs.annotation.Authorized; +import org.openmrs.api.APIException; +import org.openmrs.api.OpenmrsService; +import org.springframework.stereotype.Service; + +@Service +public interface ScheduleService extends OpenmrsService { + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + Schedule getSchedule(Integer scheduleId) throws APIException; + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + Schedule saveSchedule(Schedule schedule) throws APIException; + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + void purgeSchedule(Schedule schedule) throws APIException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/service/SlotService.java b/api/src/main/java/org/bahmni/module/ipd/service/SlotService.java new file mode 100644 index 0000000..5e7654b --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/service/SlotService.java @@ -0,0 +1,21 @@ +package org.bahmni.module.ipd.service; + +import org.bahmni.module.ipd.model.Slot; +import org.bahmni.module.ipd.util.PrivilegeConstants; +import org.openmrs.annotation.Authorized; +import org.openmrs.api.APIException; +import org.openmrs.api.OpenmrsService; +import org.springframework.stereotype.Service; + +@Service +public interface SlotService extends OpenmrsService { + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + Slot getSlot(Integer slotId) throws APIException; + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) + Slot saveSlot(Slot slot) throws APIException; + +// @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) + void purgeSlot(Slot slot) throws APIException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java new file mode 100644 index 0000000..977e6db --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java @@ -0,0 +1,42 @@ +package org.bahmni.module.ipd.service.impl; + +import org.bahmni.module.ipd.dao.ScheduleDAO; +import org.bahmni.module.ipd.model.Schedule; +import org.bahmni.module.ipd.service.ScheduleService; +import org.openmrs.api.APIException; +import org.openmrs.api.impl.BaseOpenmrsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class ScheduleServiceImpl extends BaseOpenmrsService implements ScheduleService { + + private static final Logger log = LoggerFactory.getLogger(ScheduleServiceImpl.class); + + private final ScheduleDAO scheduleDAO; + + @Autowired + public ScheduleServiceImpl(ScheduleDAO scheduleDAO) { + this.scheduleDAO = scheduleDAO; + } + + @Override + @Transactional(readOnly = true) + public Schedule getSchedule(Integer scheduleId) throws APIException { + return scheduleDAO.getSchedule(scheduleId); + } + + @Override + public Schedule saveSchedule(Schedule schedule) throws APIException { + return scheduleDAO.saveSchedule(schedule); + } + + @Override + public void purgeSchedule(Schedule schedule) throws APIException { + scheduleDAO.purgeSchedule(schedule); + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java b/api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java new file mode 100644 index 0000000..0c28c4a --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java @@ -0,0 +1,42 @@ +package org.bahmni.module.ipd.service.impl; + +import org.bahmni.module.ipd.dao.SlotDAO; +import org.bahmni.module.ipd.model.Slot; +import org.bahmni.module.ipd.service.SlotService; +import org.openmrs.api.APIException; +import org.openmrs.api.impl.BaseOpenmrsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class SlotServiceImpl extends BaseOpenmrsService implements SlotService { + + private static final Logger log = LoggerFactory.getLogger(SlotServiceImpl.class); + + private final SlotDAO slotDAO; + + @Autowired + public SlotServiceImpl(SlotDAO slotDAO) { + this.slotDAO = slotDAO; + } + + @Override + @Transactional(readOnly = true) + public Slot getSlot(Integer slotId) throws APIException { + return slotDAO.getSlot(slotId); + } + + @Override + public Slot saveSlot(Slot slot) throws APIException { + return slotDAO.saveSlot(slot); + } + + @Override + public void purgeSlot(Slot slot) throws APIException { + slotDAO.purgeSlot(slot); + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java b/api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java new file mode 100644 index 0000000..b442636 --- /dev/null +++ b/api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java @@ -0,0 +1,13 @@ +package org.bahmni.module.ipd.util; + +import org.openmrs.annotation.AddOnStartup; + +public class PrivilegeConstants { + + @AddOnStartup(description = "Able to save ipd schedules") + public static final String EDIT_IPD_SCHEDULES = "Edit IPD Schedules"; + + @AddOnStartup(description = "Able to save ipd slots") + public static final String EDIT_IPD_SLOTS = "Edit IPD Slots"; + +} diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml new file mode 100644 index 0000000..b944b49 --- /dev/null +++ b/api/src/main/resources/liquibase.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add concept Medication Request + + insert into concept (retired, short_name, description, datatype_id, class_id, is_set, creator, date_created, + changed_by, date_changed, uuid) + values (0, 'MedicationRequest', 'MedicationRequest', + (select concept_datatype_id from concept_datatype where name = 'Text'), + (select concept_class_id from concept_class where name = 'Misc'), + 0, 1, now(), 1, now(), uuid()); + + + + + Add concept-name Medication Request + + insert into concept_name (concept_id, name, locale, locale_preferred, creator, date_created, + concept_name_type, voided, uuid) + values ((select concept_id from concept where short_name='MedicationRequest'), + 'MedicationRequest', 'en', 1, 1, now(), 'FULLY_SPECIFIED', 0, uuid()); + + + diff --git a/api/src/main/resources/moduleApplicationContext.xml b/api/src/main/resources/moduleApplicationContext.xml new file mode 100644 index 0000000..ad98cb5 --- /dev/null +++ b/api/src/main/resources/moduleApplicationContext.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + classpath:hibernate.cfg.xml + + + + + org.openmrs + org.bahmni.module.ipd.model + + + + + + + + \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..b7f0646 --- /dev/null +++ b/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..474c9d6 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/omod/pom.xml b/omod/pom.xml new file mode 100644 index 0000000..c06a686 --- /dev/null +++ b/omod/pom.xml @@ -0,0 +1,133 @@ + + + + 4.0.0 + + bahmni-ipd + org.bahmni.module + 1.0.0-SNAPSHOT + + + bahmni-ipd-omod + jar + Bahmni IPD omod + Bahmni IPD module contains all backend APIs for IPD + + + bahmni-ipd + ${project.name} + ${project.version} + ${project.groupId}.${MODULE_ID} + + + + ${project.parent.artifactId}-${project.parent.version} + + + + maven-resources-plugin + + true + + + + + + + + org.openmrs.maven.plugins + maven-openmrs-plugin + true + + + init + initialize + + initialize-module + + + + pack + package + + package-module + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + Expand moduleApplicationContext and messages + + unpack-dependencies + + generate-resources + + ${project.parent.groupId} + ${project.parent.artifactId}-api + true + **/* + ${project.build.directory}/classes + + + + + + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api + ${project.parent.version} + + + org.projectlombok + lombok + + + org.openmrs.web + openmrs-web + provided + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + org.openmrs.module + webservices.rest-omod-common + 2.39.0-SNAPSHOT + provided + + + org.openmrs.test + openmrs-test + pom + + + org.openmrs.web + openmrs-web + test-jar + test + + + org.openmrs.api + openmrs-api + test-jar + test + + + javax.servlet + servlet-api + test + + + + \ No newline at end of file diff --git a/omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java b/omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java new file mode 100644 index 0000000..6be6ea8 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java @@ -0,0 +1,3 @@ +package org.bahmni.module.ipd; + +public class ModuleDescriptor {} diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java b/omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java new file mode 100644 index 0000000..ae1d6c1 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java @@ -0,0 +1,18 @@ +package org.bahmni.module.ipd.contract; + +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Getter +@Builder +public class MedicationSlot { + private String uuid; + private String orderId; + private String serviceType; + private String status; + private Date startTime; + private Date endTime; + private String notes; +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java new file mode 100644 index 0000000..e434aa9 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java @@ -0,0 +1,29 @@ +package org.bahmni.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ScheduleMedicationRequest { + + private String patientUuid; + private String orderUuid; + private String providerUuid; + private String comments; + private Date slotStartTime; + private List firstDaySlotsStartTime; + private List dayWiseSlotsStartTime; + private ScheduleStrategy scheduleStrategy; + + public enum ScheduleStrategy { + SCHEDULE_BY_HOUR, SCHEDULE_BY_DAY + } +} \ No newline at end of file diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java new file mode 100644 index 0000000..8ae24c9 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java @@ -0,0 +1,36 @@ +package org.bahmni.module.ipd.contract; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.Concept; + +import java.util.Date; + +@Builder +@Getter +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) +@AllArgsConstructor +@NoArgsConstructor +public class ScheduleMedicationResponse { + private Integer id; + private String patientUuid; + private String comments; + private Date startDate; + private Date endDate; + private Concept scheduleServiceType; + + public static ScheduleMedicationResponse constructFrom(Schedule schedule) { + return ScheduleMedicationResponse.builder() + .id(schedule.getId()) + .patientUuid(schedule.getForReference().getUuid()) + .comments(schedule.getComments()) + .startDate(schedule.getStartDate()) + .endDate(schedule.getEndDate()) + .scheduleServiceType(schedule.getServiceType()) + .build(); + } +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java b/omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java new file mode 100644 index 0000000..9550a3b --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java @@ -0,0 +1,46 @@ +package org.bahmni.module.ipd.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; +import org.bahmni.module.ipd.contract.ScheduleMedicationResponse; +import org.bahmni.module.ipd.model.Schedule; +import org.bahmni.module.ipd.service.ScheduleMedicationService; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.openmrs.module.webservices.rest.web.RestUtil; +import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; + +@Controller +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication") +@Slf4j +public class ScheduleMedicationController extends BaseRestController { + + private final ScheduleMedicationService scheduleMedicationService; + + @Autowired + public ScheduleMedicationController(ScheduleMedicationService scheduleMedicationService) { + this.scheduleMedicationService = scheduleMedicationService; + } + + @RequestMapping(method = RequestMethod.POST) + @ResponseBody + public ResponseEntity createMedicationSchedule(@Valid @RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { + try { + Schedule schedule = scheduleMedicationService.createSchedule(scheduleMedicationRequest); + return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), HttpStatus.OK); + } catch (Exception e) { + log.error("Runtime error while trying to create new appointment", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java b/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java new file mode 100644 index 0000000..031f292 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java @@ -0,0 +1,45 @@ +package org.bahmni.module.ipd.mapper; + +import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; +import org.bahmni.module.ipd.model.Reference; +import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.api.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ScheduleMapperService { + + private final OrderService orderService; + + @Autowired + public ScheduleMapperService(OrderService orderService) { + this.orderService = orderService; + } + + public Schedule mapScheduleMedicationRequestToSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + Schedule schedule = new Schedule(); + + DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); + + Reference openmrsForReference = new Reference(); + openmrsForReference.setType(Patient.class.getTypeName()); + openmrsForReference.setTargetUuid(scheduleMedicationRequest.getPatientUuid()); + openmrsForReference.setName(openmrsForReference.getType() + "/" + openmrsForReference.getReference()); + + Reference openmrsByReference = new Reference(); + openmrsByReference.setType(Patient.class.getTypeName()); + openmrsByReference.setTargetUuid(scheduleMedicationRequest.getProviderUuid()); + openmrsByReference.setName(openmrsByReference.getType() + "/" + openmrsByReference.getReference()); + + schedule.setForReference(openmrsForReference); + schedule.setByReference(openmrsByReference); + schedule.setStartDate(drugOrder.getEffectiveStartDate()); + schedule.setEndDate(drugOrder.getEffectiveStopDate()); + schedule.setActive(true); + + return schedule; + } +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java b/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java new file mode 100644 index 0000000..1d31e06 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java @@ -0,0 +1,8 @@ +package org.bahmni.module.ipd.service; + +import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; +import org.bahmni.module.ipd.model.Schedule; + +public interface ScheduleMedicationService { + Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest); +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java b/omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java new file mode 100644 index 0000000..14e8857 --- /dev/null +++ b/omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java @@ -0,0 +1,72 @@ +package org.bahmni.module.ipd.service.impl; + +import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; +import org.bahmni.module.ipd.mapper.ScheduleMapperService; +import org.bahmni.module.ipd.model.Schedule; +import org.bahmni.module.ipd.service.ScheduleMedicationService; +import org.bahmni.module.ipd.service.ScheduleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ScheduleMedicationServiceImpl implements ScheduleMedicationService { + + private final ScheduleService scheduleService; + private final ScheduleMapperService scheduleMapperService; + + @Autowired + public ScheduleMedicationServiceImpl(ScheduleService scheduleService, ScheduleMapperService scheduleMapperService) { + this.scheduleService = scheduleService; + this.scheduleMapperService = scheduleMapperService; + } + + @Override + public Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + + Schedule schedule = scheduleMapperService.mapScheduleMedicationRequestToSchedule(scheduleMedicationRequest); + return scheduleService.saveSchedule(schedule); + } +} + + + /*FhirReference openmrsForReference = new FhirReference(); + openmrsForReference.setType(Patient.class.getTypeName()); + openmrsForReference.setReference(scheduleMedicationRequest.getPatientUuid()); + openmrsForReference.setName(openmrsForReference.getType() + "/" + openmrsForReference.getReference()); + + FhirReference openmrsByReference = new FhirReference(); + openmrsByReference.setType(Patient.class.getTypeName()); + openmrsByReference.setReference(scheduleMedicationRequest.getPatientUuid()); + openmrsByReference.setName(openmrsByReference.getType() + "/" + openmrsByReference.getReference());*/ + + /* + List slots = new ArrayList<>(); + for (int i = 0; i < scheduleMedicationRequest.getSlots().size(); i++) { + Slot slot = new Slot(); + slot.setStartDate(scheduleMedicationRequest.getSlots().get(i)); + slot.setEndDate(scheduleMedicationRequest.getSlots().get(i)); + slot.setStatus(SCHEDULED); + slot.setSchedule(schedule); + slot.setServiceTypeId(concept); + slot.setOrderId(order); + //fhirSlot.location + slots.add(slot); + } + return null; + */ + + /* + Patient patient = patientService.getPatientByUuid(scheduleMedicationRequest.getPatientUuid()); + Provider provider = providerService.getProviderByUuid(scheduleMedicationRequest.getProviderUuid()); + Concept concept = conceptService.getConceptByName(MAR_CONCEPT_NAME); + */ + + /* + private final ConceptService conceptService; + + private final PatientService patientService; + + private final ProviderService providerService; + private final String MAR_CONCEPT_NAME = "MAR"; + private final SlotService slotService; + */ \ No newline at end of file diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml new file mode 100644 index 0000000..6729f5d --- /dev/null +++ b/omod/src/main/resources/config.xml @@ -0,0 +1,19 @@ + + + + + bahmni-ipd + Bahmni IPD + 1.0.0-SNAPSHOT + ${MODULE_PACKAGE} + Bahmni + ${project.parent.description} + + + org.openmrs.module.webservices.rest + org.bahmni.module.bahmnicore + + + org.bahmni.module.ipd.IPDActivator + + diff --git a/omod/src/main/resources/webModuleApplicationContext.xml b/omod/src/main/resources/webModuleApplicationContext.xml new file mode 100644 index 0000000..60a76f3 --- /dev/null +++ b/omod/src/main/resources/webModuleApplicationContext.xml @@ -0,0 +1,6 @@ + + + diff --git a/omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java b/omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java new file mode 100644 index 0000000..6348834 --- /dev/null +++ b/omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java @@ -0,0 +1,7 @@ +package org.bahmni.module.ipd; + +import org.springframework.test.context.ContextConfiguration; + +@ContextConfiguration(locations = {"classpath:TestingApplicationContext.xml"}) +public abstract class BaseIntegrationTest extends BaseWebControllerTest { +} diff --git a/omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java b/omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java new file mode 100644 index 0000000..46afd21 --- /dev/null +++ b/omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java @@ -0,0 +1,175 @@ +package org.bahmni.module.ipd; + +import junit.framework.Assert; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.junit.Ignore; +import org.openmrs.web.test.BaseModuleWebContextSensitiveTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +@Ignore +@ContextConfiguration(locations = {"classpath:TestingApplicationContext.xml"}) +public class BaseWebControllerTest extends BaseModuleWebContextSensitiveTest { + + @Autowired + private RequestMappingHandlerAdapter handlerAdapter; + + @Autowired + private List handlerMappings; + + private ObjectMapper objectMapper = new ObjectMapper(); + + /** + * Creates a request from the given parameters. + *

+ * The requestURI is automatically preceded with "/rest/" + RestConstants.VERSION_1. + * + * @param method + * @param requestURI + * @return + */ + public MockHttpServletRequest request(RequestMethod method, String requestURI) { + MockHttpServletRequest request = new MockHttpServletRequest(method.toString(), requestURI); + request.addHeader("content-type", "application/json"); + request.addHeader("accept", "application/json"); + return request; + } + + public static class Parameter { + + public String name; + + public String value; + + public Parameter(String name, String value) { + this.name = name; + this.value = value; + } + } + + public MockHttpServletRequest newRequest(RequestMethod method, String requestURI, Parameter... parameters) { + MockHttpServletRequest request = request(method, requestURI); + for (Parameter parameter : parameters) { + request.addParameter(parameter.name, parameter.value); + } + return request; + } + + public MockHttpServletRequest newRequest(RequestMethod method, String requestURI, Map headers, Parameter... parameters) { + MockHttpServletRequest request = newRequest(method, requestURI, parameters); + for (String key : headers.keySet()) { + request.addHeader(key, headers.get(key)); + } + return request; + } + + public MockHttpServletRequest newDeleteRequest(String requestURI, Parameter... parameters) { + return newRequest(RequestMethod.DELETE, requestURI, parameters); + } + + public MockHttpServletRequest newGetRequest(String requestURI, Parameter... parameters) { + return newRequest(RequestMethod.GET, requestURI, parameters); + } + + public MockHttpServletRequest newGetRequest(String requestURI, Map headers, Parameter... parameters) { + return newRequest(RequestMethod.GET, requestURI, headers, parameters); + } + + public MockHttpServletRequest newPostRequest(String requestURI, Object content) { + return newWriteRequest(requestURI, content, RequestMethod.POST); + } + + public MockHttpServletRequest newPutRequest(String requestURI, Object content) { + return newWriteRequest(requestURI, content, RequestMethod.PUT); + } + + private MockHttpServletRequest newWriteRequest(String requestURI, Object content, RequestMethod requestMethod) { + MockHttpServletRequest request = request(requestMethod, requestURI); + try { + String json = new ObjectMapper().writeValueAsString(content); + request.setContent(json.getBytes("UTF-8")); + } catch (Exception e) { + throw new RuntimeException(e); + } + return request; + } + + public MockHttpServletRequest newPostRequest(String requestURI, String content) { + MockHttpServletRequest request = request(RequestMethod.POST, requestURI); + try { + request.setContent(content.getBytes("UTF-8")); + } catch (Exception e) { + throw new RuntimeException(e); + } + return request; + } + + public MockHttpServletRequest newPutRequest(String requestURI, String content) { + MockHttpServletRequest request = request(RequestMethod.PUT, requestURI); + try { + request.setContent(content.getBytes("UTF-8")); + } catch (Exception e) { + throw new RuntimeException(e); + } + return request; + } + + /** + * Passes the given request to a proper controller. + * + * @param request + * @return + * @throws Exception + */ + public MockHttpServletResponse handle(HttpServletRequest request) throws Exception { + MockHttpServletResponse response = new MockHttpServletResponse(); + + HandlerExecutionChain handlerExecutionChain = null; + for (RequestMappingHandlerMapping handlerMapping : handlerMappings) { + handlerExecutionChain = handlerMapping.getHandler(request); + if (handlerExecutionChain != null) { + break; + } + } + Assert.assertNotNull("The request URI does not exist", handlerExecutionChain); + + handlerAdapter.handle(request, response, handlerExecutionChain.getHandler()); + + return response; + } + + /** + * Deserializes the JSON response. + * + * @param response + * @param type + * @return + * @throws Exception + */ + public T deserialize(MockHttpServletResponse response, Class type) throws Exception { + return objectMapper.readValue(response.getContentAsString(), type); + } + + /** + * Deserializes the JSON response. + * + * @param response + * @param typeReference + * @return + * @throws Exception + */ + public T deserialize(MockHttpServletResponse response, final TypeReference typeReference) throws Exception { + return objectMapper.readValue(response.getContentAsString(), typeReference); + } +} \ No newline at end of file diff --git a/omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java b/omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java new file mode 100644 index 0000000..79a7eba --- /dev/null +++ b/omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java @@ -0,0 +1,53 @@ +package org.bahmni.module.ipd.controller; + +import org.bahmni.module.ipd.BaseIntegrationTest; +import org.bahmni.module.ipd.contract.ScheduleMedicationResponse; +import org.bahmni.module.ipd.model.Schedule; +import org.bahmni.module.ipd.service.ScheduleService; +import org.codehaus.jackson.type.TypeReference; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.junit.Test; +import org.openmrs.DrugOrder; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletResponse; + +import java.util.List; + +public class ScheduleMedicationControllerIntegrationTest extends BaseIntegrationTest { + + @Autowired + private ScheduleService scheduleService; + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void shouldSaveMedicationSchedule() throws Exception { + + List allDrugOrders = getAllDrudOrders(); + + String content = "{ \"providerUuid\": \"823fdcd7-3f10-11e4-adec-0800271c1b75\", " + + "\"patientUuid\": \"2c33920f-7aa6-48d6-998a-60412d8ff7d5\", " + + "\"orderUuid\": \""+allDrugOrders.get(0).getUuid()+"\", " + + "\"slotStartTime\": \"2107-07-15T17:30:00.0\"," + + "\"firstDaySlotsStartTime\": [\"2107-07-15T17:30:00.0\"]," + + "\"dayWiseSlotsStartTime\": [\"2107-07-15T17:30:00.0\"]," + + "\"comments\":\"changes the schedule\"," + + "\"scheduleStrategy\":\"SCHEDULE_BY_HOUR\"" + + "}"; + + MockHttpServletResponse response = handle(newPostRequest("/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication", content)); + ScheduleMedicationResponse scheduleMedicationResponse = deserialize(response, new TypeReference() {}); + Schedule savedSchedule = scheduleService.getSchedule(scheduleMedicationResponse.getId()); + System.out.println("DB value ======== "+ savedSchedule); + System.out.println("DB value ======== "+ savedSchedule.getVoided() + "===="+savedSchedule.getDateCreated() +"===="+savedSchedule.getCreator().getUuid() + "====="+savedSchedule.getUuid()); + scheduleService.purgeSchedule(savedSchedule); + } + + private List getAllDrudOrders() { + Query query = sessionFactory.getCurrentSession().createQuery("FROM org.openmrs.DrugOrder"); + return (List) query.getResultList(); + } +} \ No newline at end of file diff --git a/omod/src/test/resources/config.xml b/omod/src/test/resources/config.xml new file mode 100644 index 0000000..134c35c --- /dev/null +++ b/omod/src/test/resources/config.xml @@ -0,0 +1,21 @@ + + + + + + bahmni-ipd + Bahmni IPD + 1.0.0-SNAPSHOT + Provides bahmni ipd services + ${MODULE_PACKAGE} + Bahmni + + + org.openmrs.module.webservices.rest + org.bahmni.module.bahmnicore + + + org.bahmni.module.ipd.IPDActivator + + 1.11.6 + \ No newline at end of file diff --git a/omod/src/test/resources/webModuleApplicationContext.xml b/omod/src/test/resources/webModuleApplicationContext.xml new file mode 100644 index 0000000..266cbe1 --- /dev/null +++ b/omod/src/test/resources/webModuleApplicationContext.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c505e04 --- /dev/null +++ b/pom.xml @@ -0,0 +1,370 @@ + + + 4.0.0 + + org.bahmni.module + bahmni-ipd + 1.0.0-SNAPSHOT + pom + Bahmni IPD + Bahmni IPD module contains all backend APIs for IPD + https://demo.mybahmni.org/bahmni/home/index.html + + + + GNU AFFERO GENERAL PUBLIC LICENSE + https://www.gnu.org/licenses/agpl-3.0.txt + + + + + Bahmnitw + bahmnicommunity@gmail.com + Bahmni + https://github.com/Bahmni + + + + scm:git:git@github.com:Bahmni/openmrs-module-ipd.git + scm:git:https://github.com/Bahmni/openmrs-module-ipd.git + https://github.com/Bahmni/openmrs-module-ipd + + + + api + omod + + + + 2.5.10 + 2.39.0 + 5.2.14.RELEASE + 4.13 + 2.0.7 + 1.3 + 3.5.11 + -Xmx1024m + 0.7.9 + 1.18.26 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.openmrs.maven.plugins + maven-openmrs-plugin + 1.0.1 + + + org.apache.maven.plugins + maven-dependency-plugin + 2.4 + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + test-jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.10 + + + **/*Test.java + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.5.1 + true + + + default-deploy + deploy + + deploy + + + + + nexus-sonatype + https://oss.sonatype.org + + + + + + + + + + org.projectlombok + lombok + ${lombokVersion} + provided + + + + org.openmrs.api + openmrs-api + ${openmrsPlatformVersion} + jar + provided + + + javax.servlet + servlet-api + + + + + org.openmrs.module + webservices.rest-omod-common + ${openMRSWebServicesVersion} + jar + provided + + + org.openmrs.module + webservices.rest-omod-2.0 + ${openMRSWebServicesVersion} + provided + + + org.openmrs.web + openmrs-web + ${openmrsPlatformVersion} + provided + + + + + org.openmrs.module + webservices.rest-omod-common + ${openMRSWebServicesVersion} + test-jar + test + + + org.openmrs.web + openmrs-web + ${openmrsPlatformVersion} + test-jar + test + + + org.openmrs.api + openmrs-api + ${openmrsPlatformVersion} + test-jar + test + + + javax.servlet + servlet-api + + + + + org.openmrs.test + openmrs-test + ${openmrsPlatformVersion} + pom + test + + + javax.servlet + servlet-api + 2.5 + test + + + + + junit + junit + ${junitVersion} + + + org.hamcrest + hamcrest-core + + + test + + + + + org.powermock + powermock-api-mockito2 + ${powerMockVersion} + test + + + mockito-all + org.mockito + + + + + org.powermock + powermock-module-junit4 + ${powerMockVersion} + test + + + + + org.mockito + mockito-core + ${mockitoVersion} + + + org.hamcrest + hamcrest-core + + + test + + + + + + + openmrs-repo + OpenMRS Nexus Repository + https://mavenrepo.openmrs.org/public + + + central + Maven Repository Switchboard + default + https://repo1.maven.org/maven2 + + + sonatype-nexus-releases + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/releases + + false + + + true + + + + + + + openmrs-repo + OpenMRS Nexus Repository + https://mavenrepo.openmrs.org/public + + false + + + + + + + nexus-sonatype + https://oss.sonatype.org/content/repositories/snapshots + + + nexus-sonatype + https://oss.sonatype.org/service/local/staging/deploy/maven2 + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.17 + + + + integration-test + verify + + + -Xmx512m + + **/*IT.java + + + + + + + + + + From 5624b6834236670798c4a577f0a3f0112319421c Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 28 Jul 2023 02:46:32 +0530 Subject: [PATCH 02/50] [Ritesh] | 1. Update package name 2. Added Dao and Service layer for reference 3. Minor fixes --- .../module/ipd/api}/IPDActivator.java | 2 +- .../module/ipd/api/dao/ReferenceDAO.java | 15 +++++ .../module/ipd/api}/dao/ScheduleDAO.java | 4 +- .../module/ipd/api}/dao/SlotDAO.java | 4 +- .../api/dao/impl/HibernateReferenceDAO.java | 48 ++++++++++++++ .../api}/dao/impl/HibernateScheduleDAO.java | 6 +- .../ipd/api}/dao/impl/HibernateSlotDAO.java | 15 +---- .../module/ipd/api}/model/Reference.java | 5 +- .../module/ipd/api}/model/Schedule.java | 39 +++-------- .../module/ipd/api}/model/Slot.java | 2 +- .../ipd/api/service/ReferenceService.java | 20 ++++++ .../ipd/api}/service/ScheduleService.java | 6 +- .../module/ipd/api}/service/SlotService.java | 6 +- .../service/impl/ReferenceServiceImpl.java | 39 +++++++++++ .../service/impl/ScheduleServiceImpl.java | 8 +-- .../api}/service/impl/SlotServiceImpl.java | 8 +-- .../ipd/api}/util/PrivilegeConstants.java | 2 +- api/src/main/resources/liquibase.xml | 17 +++-- .../resources/moduleApplicationContext.xml | 20 +----- .../ipd/mapper/ScheduleMapperService.java | 45 ------------- .../service/ScheduleMedicationService.java | 8 --- .../module/ipd/ModuleDescriptor.java | 2 +- .../module/ipd/contract/MedicationSlot.java | 2 +- .../contract/ScheduleMedicationRequest.java | 2 +- .../contract/ScheduleMedicationResponse.java | 6 +- .../ScheduleMedicationController.java | 13 ++-- .../ipd/mapper/ScheduleMapperService.java | 64 +++++++++++++++++++ .../service/ScheduleMedicationService.java | 8 +++ .../impl/ScheduleMedicationServiceImpl.java | 12 ++-- omod/src/main/resources/config.xml | 2 +- .../resources/webModuleApplicationContext.xml | 7 +- .../module/ipd/BaseIntegrationTest.java | 2 +- .../module/ipd/BaseWebControllerTest.java | 2 +- ...leMedicationControllerIntegrationTest.java | 18 ++++-- omod/src/test/resources/config.xml | 2 +- .../resources/webModuleApplicationContext.xml | 7 +- 36 files changed, 284 insertions(+), 184 deletions(-) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/IPDActivator.java (93%) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/dao/ReferenceDAO.java rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/dao/ScheduleDAO.java (78%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/dao/SlotDAO.java (76%) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/dao/impl/HibernateScheduleDAO.java (87%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/dao/impl/HibernateSlotDAO.java (62%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/model/Reference.java (86%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/model/Schedule.java (71%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/model/Slot.java (98%) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/service/ScheduleService.java (75%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/service/SlotService.java (74%) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/service/impl/ScheduleServiceImpl.java (83%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/service/impl/SlotServiceImpl.java (83%) rename api/src/main/java/org/{bahmni/module/ipd => openmrs/module/ipd/api}/util/PrivilegeConstants.java (89%) delete mode 100644 omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java delete mode 100644 omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/ModuleDescriptor.java (51%) rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/contract/MedicationSlot.java (88%) rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/contract/ScheduleMedicationRequest.java (93%) rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/contract/ScheduleMedicationResponse.java (83%) rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/controller/ScheduleMedicationController.java (83%) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java rename omod/src/main/java/org/{bahmni => openmrs}/module/ipd/service/impl/ScheduleMedicationServiceImpl.java (88%) rename omod/src/test/java/org/{bahmni => openmrs}/module/ipd/BaseIntegrationTest.java (87%) rename omod/src/test/java/org/{bahmni => openmrs}/module/ipd/BaseWebControllerTest.java (99%) rename omod/src/test/java/org/{bahmni => openmrs}/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java (79%) diff --git a/api/src/main/java/org/bahmni/module/ipd/IPDActivator.java b/api/src/main/java/org/openmrs/module/ipd/api/IPDActivator.java similarity index 93% rename from api/src/main/java/org/bahmni/module/ipd/IPDActivator.java rename to api/src/main/java/org/openmrs/module/ipd/api/IPDActivator.java index 4feb3e4..730babb 100644 --- a/api/src/main/java/org/bahmni/module/ipd/IPDActivator.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/IPDActivator.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd; +package org.openmrs.module.ipd.api; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ReferenceDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ReferenceDAO.java new file mode 100644 index 0000000..983d639 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ReferenceDAO.java @@ -0,0 +1,15 @@ +package org.openmrs.module.ipd.api.dao; + +import org.openmrs.api.db.DAOException; +import org.openmrs.module.ipd.api.model.Reference; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface ReferenceDAO { + + Optional getReferenceByTypeAndTargetUUID(String type, String targetUUID) throws DAOException; + + Reference saveReference(Reference reference) throws DAOException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java similarity index 78% rename from api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java rename to api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index be0618d..4426f01 100644 --- a/api/src/main/java/org/bahmni/module/ipd/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -1,6 +1,6 @@ -package org.bahmni.module.ipd.dao; +package org.openmrs.module.ipd.api.dao; -import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java similarity index 76% rename from api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java rename to api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 7a1abce..d4eb15c 100644 --- a/api/src/main/java/org/bahmni/module/ipd/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -1,6 +1,6 @@ -package org.bahmni.module.ipd.dao; +package org.openmrs.module.ipd.api.dao; -import org.bahmni.module.ipd.model.Slot; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java new file mode 100644 index 0000000..b39a2ed --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java @@ -0,0 +1,48 @@ +package org.openmrs.module.ipd.api.dao.impl; + +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.openmrs.api.db.DAOException; +import org.openmrs.module.ipd.api.dao.ReferenceDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.util.Optional; + +@Repository +public class HibernateReferenceDAO implements ReferenceDAO { + + private static final Logger log = LoggerFactory.getLogger(HibernateReferenceDAO.class); + + private final SessionFactory sessionFactory; + + @Autowired + public HibernateReferenceDAO(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + + @Override + public Optional getReferenceByTypeAndTargetUUID(String type, String targetUuid) throws DAOException { + + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Reference ref WHERE ref.type=:type and ref.targetUuid=:targetUuid"); + + query.setParameter("type", type); + query.setParameter("targetUuid", targetUuid); + + return query.uniqueResultOptional(); + } + + @Override + public Reference saveReference(Reference reference) throws DAOException { + sessionFactory.getCurrentSession().saveOrUpdate(reference); + return reference; + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java similarity index 87% rename from api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java rename to api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 0d8f011..3402c4a 100644 --- a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -1,7 +1,7 @@ -package org.bahmni.module.ipd.dao.impl; +package org.openmrs.module.ipd.api.dao.impl; -import org.bahmni.module.ipd.dao.ScheduleDAO; -import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Schedule; import org.hibernate.SessionFactory; import org.openmrs.api.db.DAOException; import org.slf4j.Logger; diff --git a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java similarity index 62% rename from api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java rename to api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 06577ed..43c2c15 100644 --- a/api/src/main/java/org/bahmni/module/ipd/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -1,16 +1,7 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public License, - * v. 2.0. If a copy of the MPL was not distributed with this file, You can - * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under - * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. - * - * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS - * graphic logo is a trademark of OpenMRS Inc. - */ -package org.bahmni.module.ipd.dao.impl; +package org.openmrs.module.ipd.api.dao.impl; -import org.bahmni.module.ipd.dao.SlotDAO; -import org.bahmni.module.ipd.model.Slot; +import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Slot; import org.hibernate.SessionFactory; import org.openmrs.api.db.DAOException; import org.slf4j.Logger; diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Reference.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java similarity index 86% rename from api/src/main/java/org/bahmni/module/ipd/model/Reference.java rename to api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java index 33530ad..e0bbba5 100644 --- a/api/src/main/java/org/bahmni/module/ipd/model/Reference.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.model; +package org.openmrs.module.ipd.api.model; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -30,7 +30,4 @@ public Reference() { @Column(name = "target_uuid") private String targetUuid; - - @Column(name = "reference") - private String reference; } diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java similarity index 71% rename from api/src/main/java/org/bahmni/module/ipd/model/Schedule.java rename to api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index 2e1be9b..2e113cd 100644 --- a/api/src/main/java/org/bahmni/module/ipd/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.model; +package org.openmrs.module.ipd.api.model; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,47 +23,28 @@ public class Schedule extends BaseChangeableOpenmrsData { @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "schedule_id") private Integer id; - - /** - * The entity who benefits from the performance of the service specified in the task (e.g., the - * patient). - */ - @OneToOne(cascade = CascadeType.ALL) + + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id") private Reference forReference; - - @OneToOne(cascade = CascadeType.ALL) + + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id") private Reference byReference; - - /** - * Whether this schedule is in active use - */ + @Column(name = "active", nullable = false) private boolean active = Boolean.TRUE; - - /** - * The Service Type of the Schedule - */ + @OneToOne @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") private Concept serviceType; - - /** - * The Start Date the Schedule - */ + @Column(name = "start_date", nullable = false) private Date startDate; - - /** - * The End Date the Schedule - */ + @Column(name = "end_date", nullable = false) private Date endDate; - - /** - * Any Comment for the Schedule - */ + @Column(name = "comments") private String comments; diff --git a/api/src/main/java/org/bahmni/module/ipd/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java similarity index 98% rename from api/src/main/java/org/bahmni/module/ipd/model/Slot.java rename to api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index 408ab13..a672d59 100644 --- a/api/src/main/java/org/bahmni/module/ipd/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.model; +package org.openmrs.module.ipd.api.model; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java new file mode 100644 index 0000000..a006d08 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java @@ -0,0 +1,20 @@ +package org.openmrs.module.ipd.api.service; + +import org.openmrs.api.APIException; +import org.openmrs.api.OpenmrsService; +import org.openmrs.api.db.DAOException; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Slot; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public interface ReferenceService extends OpenmrsService { + + // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + Optional getReferenceByTypeAndTargetUUID(String type, String targetUuid) throws APIException; + + // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) + Reference saveReference(Reference reference) throws APIException; +} diff --git a/api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java similarity index 75% rename from api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java rename to api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 3ed46ee..317bf53 100644 --- a/api/src/main/java/org/bahmni/module/ipd/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -1,8 +1,6 @@ -package org.bahmni.module.ipd.service; +package org.openmrs.module.ipd.api.service; -import org.bahmni.module.ipd.model.Schedule; -import org.bahmni.module.ipd.util.PrivilegeConstants; -import org.openmrs.annotation.Authorized; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; import org.springframework.stereotype.Service; diff --git a/api/src/main/java/org/bahmni/module/ipd/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java similarity index 74% rename from api/src/main/java/org/bahmni/module/ipd/service/SlotService.java rename to api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 5e7654b..6bc7777 100644 --- a/api/src/main/java/org/bahmni/module/ipd/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -1,8 +1,6 @@ -package org.bahmni.module.ipd.service; +package org.openmrs.module.ipd.api.service; -import org.bahmni.module.ipd.model.Slot; -import org.bahmni.module.ipd.util.PrivilegeConstants; -import org.openmrs.annotation.Authorized; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; import org.springframework.stereotype.Service; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java new file mode 100644 index 0000000..c8a0564 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java @@ -0,0 +1,39 @@ +package org.openmrs.module.ipd.api.service.impl; + +import org.openmrs.api.APIException; +import org.openmrs.api.impl.BaseOpenmrsService; +import org.openmrs.module.ipd.api.dao.impl.HibernateReferenceDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +@Transactional +public class ReferenceServiceImpl extends BaseOpenmrsService implements ReferenceService { + + private static final Logger log = LoggerFactory.getLogger(ReferenceServiceImpl.class); + + private final HibernateReferenceDAO hibernateReferenceDAO; + + @Autowired + public ReferenceServiceImpl(HibernateReferenceDAO hibernateReferenceDAO) { + this.hibernateReferenceDAO = hibernateReferenceDAO; + } + + @Override + @Transactional(readOnly = true) + public Optional getReferenceByTypeAndTargetUUID(String type, String targetUuid) throws APIException { + return hibernateReferenceDAO.getReferenceByTypeAndTargetUUID(type, targetUuid); + } + + @Override + public Reference saveReference(Reference reference) throws APIException { + return hibernateReferenceDAO.saveReference(reference); + } +} diff --git a/api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java similarity index 83% rename from api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java rename to api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 977e6db..16a07f3 100644 --- a/api/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -1,8 +1,8 @@ -package org.bahmni.module.ipd.service.impl; +package org.openmrs.module.ipd.api.service.impl; -import org.bahmni.module.ipd.dao.ScheduleDAO; -import org.bahmni.module.ipd.model.Schedule; -import org.bahmni.module.ipd.service.ScheduleService; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.service.ScheduleService; import org.openmrs.api.APIException; import org.openmrs.api.impl.BaseOpenmrsService; import org.slf4j.Logger; diff --git a/api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java similarity index 83% rename from api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java rename to api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 0c28c4a..9e9e30c 100644 --- a/api/src/main/java/org/bahmni/module/ipd/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -1,8 +1,8 @@ -package org.bahmni.module.ipd.service.impl; +package org.openmrs.module.ipd.api.service.impl; -import org.bahmni.module.ipd.dao.SlotDAO; -import org.bahmni.module.ipd.model.Slot; -import org.bahmni.module.ipd.service.SlotService; +import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.api.APIException; import org.openmrs.api.impl.BaseOpenmrsService; import org.slf4j.Logger; diff --git a/api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java b/api/src/main/java/org/openmrs/module/ipd/api/util/PrivilegeConstants.java similarity index 89% rename from api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java rename to api/src/main/java/org/openmrs/module/ipd/api/util/PrivilegeConstants.java index b442636..ede0449 100644 --- a/api/src/main/java/org/bahmni/module/ipd/util/PrivilegeConstants.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/util/PrivilegeConstants.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.util; +package org.openmrs.module.ipd.api.util; import org.openmrs.annotation.AddOnStartup; diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index b944b49..531bc75 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd"> - + @@ -13,7 +13,7 @@ - + @@ -44,7 +44,7 @@ referencedTableName="concept" referencedColumnNames="concept_id"/> - + @@ -54,8 +54,7 @@ - - + @@ -77,12 +76,12 @@ - - diff --git a/api/src/main/resources/moduleApplicationContext.xml b/api/src/main/resources/moduleApplicationContext.xml index ad98cb5..a91ef45 100644 --- a/api/src/main/resources/moduleApplicationContext.xml +++ b/api/src/main/resources/moduleApplicationContext.xml @@ -8,22 +8,6 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - - - - - classpath:hibernate.cfg.xml - - - - - org.openmrs - org.bahmni.module.ipd.model - - - - - - - + + \ No newline at end of file diff --git a/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java b/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java deleted file mode 100644 index 031f292..0000000 --- a/omod/src/main/java/org/bahmni/module/ipd/mapper/ScheduleMapperService.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bahmni.module.ipd.mapper; - -import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; -import org.bahmni.module.ipd.model.Reference; -import org.bahmni.module.ipd.model.Schedule; -import org.openmrs.DrugOrder; -import org.openmrs.Patient; -import org.openmrs.api.OrderService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class ScheduleMapperService { - - private final OrderService orderService; - - @Autowired - public ScheduleMapperService(OrderService orderService) { - this.orderService = orderService; - } - - public Schedule mapScheduleMedicationRequestToSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { - Schedule schedule = new Schedule(); - - DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); - - Reference openmrsForReference = new Reference(); - openmrsForReference.setType(Patient.class.getTypeName()); - openmrsForReference.setTargetUuid(scheduleMedicationRequest.getPatientUuid()); - openmrsForReference.setName(openmrsForReference.getType() + "/" + openmrsForReference.getReference()); - - Reference openmrsByReference = new Reference(); - openmrsByReference.setType(Patient.class.getTypeName()); - openmrsByReference.setTargetUuid(scheduleMedicationRequest.getProviderUuid()); - openmrsByReference.setName(openmrsByReference.getType() + "/" + openmrsByReference.getReference()); - - schedule.setForReference(openmrsForReference); - schedule.setByReference(openmrsByReference); - schedule.setStartDate(drugOrder.getEffectiveStartDate()); - schedule.setEndDate(drugOrder.getEffectiveStopDate()); - schedule.setActive(true); - - return schedule; - } -} diff --git a/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java b/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java deleted file mode 100644 index 1d31e06..0000000 --- a/omod/src/main/java/org/bahmni/module/ipd/service/ScheduleMedicationService.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bahmni.module.ipd.service; - -import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; -import org.bahmni.module.ipd.model.Schedule; - -public interface ScheduleMedicationService { - Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest); -} diff --git a/omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java b/omod/src/main/java/org/openmrs/module/ipd/ModuleDescriptor.java similarity index 51% rename from omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java rename to omod/src/main/java/org/openmrs/module/ipd/ModuleDescriptor.java index 6be6ea8..7b43171 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/ModuleDescriptor.java +++ b/omod/src/main/java/org/openmrs/module/ipd/ModuleDescriptor.java @@ -1,3 +1,3 @@ -package org.bahmni.module.ipd; +package org.openmrs.module.ipd; public class ModuleDescriptor {} diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java similarity index 88% rename from omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java rename to omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java index ae1d6c1..289b80c 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/contract/MedicationSlot.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.contract; +package org.openmrs.module.ipd.contract; import lombok.Builder; import lombok.Getter; diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java similarity index 93% rename from omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java rename to omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index e434aa9..724a409 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd.contract; +package org.openmrs.module.ipd.contract; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java similarity index 83% rename from omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java rename to omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 8ae24c9..b33b6e8 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -1,11 +1,11 @@ -package org.bahmni.module.ipd.contract; +package org.openmrs.module.ipd.contract; import com.fasterxml.jackson.annotation.JsonAutoDetect; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.bahmni.module.ipd.model.Schedule; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.Concept; import java.util.Date; @@ -21,7 +21,6 @@ public class ScheduleMedicationResponse { private String comments; private Date startDate; private Date endDate; - private Concept scheduleServiceType; public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() @@ -30,7 +29,6 @@ public static ScheduleMedicationResponse constructFrom(Schedule schedule) { .comments(schedule.getComments()) .startDate(schedule.getStartDate()) .endDate(schedule.getEndDate()) - .scheduleServiceType(schedule.getServiceType()) .build(); } } diff --git a/omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java similarity index 83% rename from omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java rename to omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java index 9550a3b..a3925c2 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/controller/ScheduleMedicationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java @@ -1,11 +1,10 @@ -package org.bahmni.module.ipd.controller; +package org.openmrs.module.ipd.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; -import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; -import org.bahmni.module.ipd.contract.ScheduleMedicationResponse; -import org.bahmni.module.ipd.model.Schedule; -import org.bahmni.module.ipd.service.ScheduleMedicationService; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.service.ScheduleMedicationService; import org.openmrs.module.webservices.rest.web.RestConstants; import org.openmrs.module.webservices.rest.web.RestUtil; import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; @@ -39,7 +38,7 @@ public ResponseEntity createMedicationSchedule(@Valid @RequestBody Sched Schedule schedule = scheduleMedicationService.createSchedule(scheduleMedicationRequest); return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), HttpStatus.OK); } catch (Exception e) { - log.error("Runtime error while trying to create new appointment", e); + log.error("Runtime error while trying to create new schedule", e); return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), HttpStatus.BAD_REQUEST); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java b/omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java new file mode 100644 index 0000000..0ca3950 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java @@ -0,0 +1,64 @@ +package org.openmrs.module.ipd.mapper; + +import org.openmrs.Provider; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.Concept; +import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.api.ConceptService; +import org.openmrs.api.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public class ScheduleMapperService { + + private final OrderService orderService; + private final ConceptService conceptService; + + private final ReferenceService referenceService; + + @Autowired + public ScheduleMapperService(OrderService orderService, ConceptService conceptService, ReferenceService referenceService) { + this.orderService = orderService; + this.conceptService = conceptService; + this.referenceService = referenceService; + } + + public Schedule mapScheduleMedicationRequestToSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + Schedule schedule = new Schedule(); + + DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); + Concept medicationRequest = conceptService.getConceptByName("MedicationRequest"); + + Reference openmrsForReference = getReference(Patient.class.getTypeName(), scheduleMedicationRequest.getPatientUuid()); + Reference openmrsByReference = getReference(Provider.class.getTypeName(), scheduleMedicationRequest.getProviderUuid()); + + schedule.setForReference(openmrsForReference); + schedule.setByReference(openmrsByReference); + schedule.setStartDate(drugOrder.getEffectiveStartDate()); + schedule.setEndDate(drugOrder.getEffectiveStopDate()); + schedule.setServiceType(medicationRequest); + schedule.setActive(true); + + return schedule; + } + + private Reference getReference(String type, String targetUuid) { + Optional reference = referenceService.getReferenceByTypeAndTargetUUID(type, targetUuid); + if(reference.isPresent()) + return reference.get(); + + Reference openmrsReference = new Reference(); + openmrsReference.setType(type); + openmrsReference.setTargetUuid(targetUuid); + openmrsReference.setName(type + "/" + targetUuid); + + return openmrsReference; + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java new file mode 100644 index 0000000..fc24814 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java @@ -0,0 +1,8 @@ +package org.openmrs.module.ipd.service; + +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.api.model.Schedule; + +public interface ScheduleMedicationService { + Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest); +} diff --git a/omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java similarity index 88% rename from omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java rename to omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java index 14e8857..91bc7fc 100644 --- a/omod/src/main/java/org/bahmni/module/ipd/service/impl/ScheduleMedicationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java @@ -1,10 +1,10 @@ -package org.bahmni.module.ipd.service.impl; +package org.openmrs.module.ipd.service.impl; -import org.bahmni.module.ipd.contract.ScheduleMedicationRequest; -import org.bahmni.module.ipd.mapper.ScheduleMapperService; -import org.bahmni.module.ipd.model.Schedule; -import org.bahmni.module.ipd.service.ScheduleMedicationService; -import org.bahmni.module.ipd.service.ScheduleService; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.mapper.ScheduleMapperService; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.service.ScheduleMedicationService; +import org.openmrs.module.ipd.api.service.ScheduleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 6729f5d..b646e8e 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -14,6 +14,6 @@ org.bahmni.module.bahmnicore - org.bahmni.module.ipd.IPDActivator + org.openmrs.module.ipd.api.IPDActivator diff --git a/omod/src/main/resources/webModuleApplicationContext.xml b/omod/src/main/resources/webModuleApplicationContext.xml index 60a76f3..82e84de 100644 --- a/omod/src/main/resources/webModuleApplicationContext.xml +++ b/omod/src/main/resources/webModuleApplicationContext.xml @@ -1,6 +1,11 @@ + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + + + diff --git a/omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/BaseIntegrationTest.java similarity index 87% rename from omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java rename to omod/src/test/java/org/openmrs/module/ipd/BaseIntegrationTest.java index 6348834..642bc1f 100644 --- a/omod/src/test/java/org/bahmni/module/ipd/BaseIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/BaseIntegrationTest.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd; +package org.openmrs.module.ipd; import org.springframework.test.context.ContextConfiguration; diff --git a/omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java b/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java similarity index 99% rename from omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java rename to omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java index 46afd21..5768fe0 100644 --- a/omod/src/test/java/org/bahmni/module/ipd/BaseWebControllerTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java @@ -1,4 +1,4 @@ -package org.bahmni.module.ipd; +package org.openmrs.module.ipd; import junit.framework.Assert; import org.codehaus.jackson.map.ObjectMapper; diff --git a/omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java similarity index 79% rename from omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java rename to omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java index 79a7eba..4b230c5 100644 --- a/omod/src/test/java/org/bahmni/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java @@ -1,9 +1,10 @@ -package org.bahmni.module.ipd.controller; +package org.openmrs.module.ipd.controller; -import org.bahmni.module.ipd.BaseIntegrationTest; -import org.bahmni.module.ipd.contract.ScheduleMedicationResponse; -import org.bahmni.module.ipd.model.Schedule; -import org.bahmni.module.ipd.service.ScheduleService; +import org.junit.jupiter.api.BeforeEach; +import org.openmrs.module.ipd.BaseIntegrationTest; +import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.service.ScheduleService; import org.codehaus.jackson.type.TypeReference; import org.hibernate.SessionFactory; import org.hibernate.query.Query; @@ -23,6 +24,11 @@ public class ScheduleMedicationControllerIntegrationTest extends BaseIntegration @Autowired private SessionFactory sessionFactory; + @BeforeEach + public void setUp() { + + } + @Test public void shouldSaveMedicationSchedule() throws Exception { @@ -41,8 +47,6 @@ public void shouldSaveMedicationSchedule() throws Exception { MockHttpServletResponse response = handle(newPostRequest("/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication", content)); ScheduleMedicationResponse scheduleMedicationResponse = deserialize(response, new TypeReference() {}); Schedule savedSchedule = scheduleService.getSchedule(scheduleMedicationResponse.getId()); - System.out.println("DB value ======== "+ savedSchedule); - System.out.println("DB value ======== "+ savedSchedule.getVoided() + "===="+savedSchedule.getDateCreated() +"===="+savedSchedule.getCreator().getUuid() + "====="+savedSchedule.getUuid()); scheduleService.purgeSchedule(savedSchedule); } diff --git a/omod/src/test/resources/config.xml b/omod/src/test/resources/config.xml index 134c35c..040350d 100644 --- a/omod/src/test/resources/config.xml +++ b/omod/src/test/resources/config.xml @@ -15,7 +15,7 @@ org.bahmni.module.bahmnicore - org.bahmni.module.ipd.IPDActivator + org.openmrs.module.ipd.api.IPDActivator 1.11.6 \ No newline at end of file diff --git a/omod/src/test/resources/webModuleApplicationContext.xml b/omod/src/test/resources/webModuleApplicationContext.xml index 266cbe1..ca1219e 100644 --- a/omod/src/test/resources/webModuleApplicationContext.xml +++ b/omod/src/test/resources/webModuleApplicationContext.xml @@ -1,6 +1,11 @@ + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + + + \ No newline at end of file From d660acaf9739eed92ad2ec1453cc68a9acede5c4 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 28 Jul 2023 16:10:04 +0530 Subject: [PATCH 03/50] [Ritesh] | 1.Rename Schedule Strategy to MedicationFrequency --- .../contract/ScheduleMedicationRequest.java | 7 +-- .../impl/ScheduleMedicationServiceImpl.java | 45 +------------------ ...leMedicationControllerIntegrationTest.java | 7 +-- 3 files changed, 6 insertions(+), 53 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index 724a409..cc1b4e4 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -21,9 +21,10 @@ public class ScheduleMedicationRequest { private Date slotStartTime; private List firstDaySlotsStartTime; private List dayWiseSlotsStartTime; - private ScheduleStrategy scheduleStrategy; + private MedicationFrequency medicationFrequency; - public enum ScheduleStrategy { - SCHEDULE_BY_HOUR, SCHEDULE_BY_DAY + public enum MedicationFrequency { + START_TIME_DURATION_FREQUENCY, + FIXED_SCHEDULE_FREQUENCY } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java index 91bc7fc..25036f1 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java @@ -26,47 +26,4 @@ public Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationReque Schedule schedule = scheduleMapperService.mapScheduleMedicationRequestToSchedule(scheduleMedicationRequest); return scheduleService.saveSchedule(schedule); } -} - - - /*FhirReference openmrsForReference = new FhirReference(); - openmrsForReference.setType(Patient.class.getTypeName()); - openmrsForReference.setReference(scheduleMedicationRequest.getPatientUuid()); - openmrsForReference.setName(openmrsForReference.getType() + "/" + openmrsForReference.getReference()); - - FhirReference openmrsByReference = new FhirReference(); - openmrsByReference.setType(Patient.class.getTypeName()); - openmrsByReference.setReference(scheduleMedicationRequest.getPatientUuid()); - openmrsByReference.setName(openmrsByReference.getType() + "/" + openmrsByReference.getReference());*/ - - /* - List slots = new ArrayList<>(); - for (int i = 0; i < scheduleMedicationRequest.getSlots().size(); i++) { - Slot slot = new Slot(); - slot.setStartDate(scheduleMedicationRequest.getSlots().get(i)); - slot.setEndDate(scheduleMedicationRequest.getSlots().get(i)); - slot.setStatus(SCHEDULED); - slot.setSchedule(schedule); - slot.setServiceTypeId(concept); - slot.setOrderId(order); - //fhirSlot.location - slots.add(slot); - } - return null; - */ - - /* - Patient patient = patientService.getPatientByUuid(scheduleMedicationRequest.getPatientUuid()); - Provider provider = providerService.getProviderByUuid(scheduleMedicationRequest.getProviderUuid()); - Concept concept = conceptService.getConceptByName(MAR_CONCEPT_NAME); - */ - - /* - private final ConceptService conceptService; - - private final PatientService patientService; - - private final ProviderService providerService; - private final String MAR_CONCEPT_NAME = "MAR"; - private final SlotService slotService; - */ \ No newline at end of file +} \ No newline at end of file diff --git a/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java index 4b230c5..cfdfa91 100644 --- a/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java @@ -24,11 +24,6 @@ public class ScheduleMedicationControllerIntegrationTest extends BaseIntegration @Autowired private SessionFactory sessionFactory; - @BeforeEach - public void setUp() { - - } - @Test public void shouldSaveMedicationSchedule() throws Exception { @@ -41,7 +36,7 @@ public void shouldSaveMedicationSchedule() throws Exception { "\"firstDaySlotsStartTime\": [\"2107-07-15T17:30:00.0\"]," + "\"dayWiseSlotsStartTime\": [\"2107-07-15T17:30:00.0\"]," + "\"comments\":\"changes the schedule\"," + - "\"scheduleStrategy\":\"SCHEDULE_BY_HOUR\"" + + "\"medicationFrequency\":\"START_TIME_DURATION_FREQUENCY\"" + "}"; MockHttpServletResponse response = handle(newPostRequest("/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication", content)); From f1f7c8450cd4e0626d740cc19416222506b379a3 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Mon, 31 Jul 2023 23:03:42 +0530 Subject: [PATCH 04/50] [Ritesh] | 1. Migration for slot. 2. Slot creation from schedule --- .../module/ipd/api/model/Schedule.java | 29 +++++-- .../openmrs/module/ipd/api/model/Slot.java | 43 +++++----- .../module/ipd/api/service/SlotService.java | 2 +- api/src/main/resources/liquibase.xml | 78 ++++++++++++++++++- omod/pom.xml | 7 +- .../contract/ScheduleMedicationRequest.java | 7 +- .../contract/ScheduleMedicationResponse.java | 8 +- ...roller.java => IPDScheduleController.java} | 26 ++++--- .../ScheduleFactory.java} | 30 +++---- .../module/ipd/factory/SlotFactory.java | 55 +++++++++++++ ...onService.java => IPDScheduleService.java} | 8 +- .../service/impl/IPDScheduleServiceImpl.java | 47 +++++++++++ .../impl/ScheduleMedicationServiceImpl.java | 29 ------- .../service/impl/SlotTimeCreationService.java | 59 ++++++++++++++ omod/src/main/resources/config.xml | 1 + ...IPDScheduleControllerIntegrationTest.java} | 6 +- pom.xml | 7 ++ 17 files changed, 337 insertions(+), 105 deletions(-) rename omod/src/main/java/org/openmrs/module/ipd/controller/{ScheduleMedicationController.java => IPDScheduleController.java} (67%) rename omod/src/main/java/org/openmrs/module/ipd/{mapper/ScheduleMapperService.java => factory/ScheduleFactory.java} (69%) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java rename omod/src/main/java/org/openmrs/module/ipd/service/{ScheduleMedicationService.java => IPDScheduleService.java} (55%) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java rename omod/src/test/java/org/openmrs/module/ipd/controller/{ScheduleMedicationControllerIntegrationTest.java => IPDScheduleControllerIntegrationTest.java} (94%) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index 2e113cd..ac6a1a9 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -5,9 +5,10 @@ import lombok.NoArgsConstructor; import org.openmrs.BaseChangeableOpenmrsData; import org.openmrs.Concept; +import org.openmrs.Order; import javax.persistence.*; -import java.util.Date; +import java.time.LocalDate; @Data @NoArgsConstructor @@ -15,9 +16,9 @@ @Entity @Table(name = "ipd_schedule") public class Schedule extends BaseChangeableOpenmrsData { - + private static final long serialVersionUID = 1L; - + @EqualsAndHashCode.Include @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -26,26 +27,38 @@ public class Schedule extends BaseChangeableOpenmrsData { @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id") - private Reference forReference; + private Reference forReference; // actor in fhir reference @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id") - private Reference byReference; + private Reference byReference; // actor in fhir reference @Column(name = "active", nullable = false) private boolean active = Boolean.TRUE; + @OneToOne + @JoinColumn(name = "service_category_id", referencedColumnName = "concept_id") + private Concept serviceCategory; // null not in use + @OneToOne @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") private Concept serviceType; + @OneToOne + @JoinColumn(name = "speciality_id", referencedColumnName = "concept_id") + private Concept speciality; // null not in use + + @OneToOne + @JoinColumn(name = "order_id", referencedColumnName = "order_id") + private Order order; + @Column(name = "start_date", nullable = false) - private Date startDate; + private LocalDate startDate; @Column(name = "end_date", nullable = false) - private Date endDate; + private LocalDate endDate; @Column(name = "comments") private String comments; - + } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index a672d59..4870c8b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -6,10 +6,9 @@ import org.openmrs.BaseChangeableOpenmrsData; import org.openmrs.Concept; import org.openmrs.Location; -import org.openmrs.Order; import javax.persistence.*; -import java.util.Date; +import java.time.LocalDateTime; @Data @NoArgsConstructor @@ -36,76 +35,72 @@ public enum SlotStatus { /** * The location Where schedule occurs */ - @ManyToOne(optional = false) - @JoinColumn(referencedColumnName = "location_id") - private Location location; + @ManyToOne + @JoinColumn(name = "location_id", referencedColumnName = "location_id") + private Location location; // bed location for patient /** * The Service Category of the Schedule */ @OneToOne @JoinColumn(name = "service_category_id", referencedColumnName = "concept_id") - private Concept serviceCategoryId; + private Concept serviceCategory; // null not in use /** * The Service Type of the Schedule */ @OneToOne @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") - private Concept serviceTypeId; + private Concept serviceType; // as per schedule service type /** * The Speciality of the Schedule */ @OneToOne @JoinColumn(name = "speciality_id", referencedColumnName = "concept_id") - private Concept specialityId; + private Concept speciality; // null not in sue /** * The Appointment Type of the Schedule */ @OneToOne @JoinColumn(name = "appointment_type_id", referencedColumnName = "concept_id") - private Concept appointmentTypeId; + private Concept appointmentType; // null not in use /** * The entity that belongs to a Schedule */ @ManyToOne - @JoinColumn(name = "schedule_reference_id", referencedColumnName = "schedule_id") + @JoinColumn(name = "schedule_id", referencedColumnName = "schedule_id") private Schedule schedule; /** * The Start Date the Slot */ - @Column(name = "start_date", nullable = false) - private Date startDate; + @Column(name = "start_date_time", nullable = false) + private LocalDateTime startDateTime; // slot start time /** * The End Date the Slot */ - @Column(name = "end_date", nullable = false) - private Date endDate; + @Column(name = "end_date_time") + private LocalDateTime endDateTime; // can be null for now /** * Any Comment for the Slot */ - @Column(name = "comment") - private String comment; + @Column(name = "comments") + private String comments; // null not is use /** * The current status of the slot. */ @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) - private SlotStatus status; - - /** - * Order of the Slot - */ - @OneToOne - @JoinColumn(name = "order_id", referencedColumnName = "order_id") - private Order orderId; + private SlotStatus status = SlotStatus.SCHEDULED; + + @Column(name = "overbooked") + private Boolean overbooked = false; // not is use } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 6bc7777..92d0ba2 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -8,7 +8,7 @@ @Service public interface SlotService extends OpenmrsService { -// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) +// @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) Slot getSlot(Integer slotId) throws APIException; // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 531bc75..1fe5fba 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -16,7 +16,10 @@ - + + + + @@ -42,6 +45,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76,11 +148,11 @@ - - diff --git a/omod/pom.xml b/omod/pom.xml index c06a686..ff83e3b 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -103,9 +103,14 @@ org.openmrs.module webservices.rest-omod-common - 2.39.0-SNAPSHOT provided + + org.openmrs.module + bedmanagement-api + provided + + org.openmrs.test openmrs-test diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index cc1b4e4..9413357 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -18,9 +19,9 @@ public class ScheduleMedicationRequest { private String orderUuid; private String providerUuid; private String comments; - private Date slotStartTime; - private List firstDaySlotsStartTime; - private List dayWiseSlotsStartTime; + private LocalDateTime slotStartTime; + private List firstDaySlotsStartTime; + private List dayWiseSlotsStartTime; private MedicationFrequency medicationFrequency; public enum MedicationFrequency { diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index b33b6e8..90de4e6 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -6,9 +6,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.Concept; -import java.util.Date; +import java.time.LocalDate; @Builder @Getter @@ -19,8 +18,9 @@ public class ScheduleMedicationResponse { private Integer id; private String patientUuid; private String comments; - private Date startDate; - private Date endDate; + private LocalDate startDate; + private LocalDate endDate; + // Add list of default Slot response. public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java similarity index 67% rename from omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java rename to omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index a3925c2..ec88933 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/ScheduleMedicationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -1,15 +1,14 @@ package org.openmrs.module.ipd.controller; import lombok.extern.slf4j.Slf4j; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; -import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.service.ScheduleMedicationService; +import org.openmrs.module.ipd.service.IPDScheduleService; import org.openmrs.module.webservices.rest.web.RestConstants; import org.openmrs.module.webservices.rest.web.RestUtil; import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; @@ -19,27 +18,30 @@ import javax.validation.Valid; +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.OK; + @Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication") +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd/schedule") @Slf4j -public class ScheduleMedicationController extends BaseRestController { +public class IPDScheduleController extends BaseRestController { - private final ScheduleMedicationService scheduleMedicationService; + private final IPDScheduleService ipdScheduleService; @Autowired - public ScheduleMedicationController(ScheduleMedicationService scheduleMedicationService) { - this.scheduleMedicationService = scheduleMedicationService; + public IPDScheduleController(IPDScheduleService ipdScheduleService) { + this.ipdScheduleService = ipdScheduleService; } - @RequestMapping(method = RequestMethod.POST) + @RequestMapping(value = "/medication", method = RequestMethod.POST) @ResponseBody public ResponseEntity createMedicationSchedule(@Valid @RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { try { - Schedule schedule = scheduleMedicationService.createSchedule(scheduleMedicationRequest); - return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), HttpStatus.OK); + Schedule schedule = ipdScheduleService.saveMedicationSchedule(scheduleMedicationRequest); + return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), OK); } catch (Exception e) { log.error("Runtime error while trying to create new schedule", e); - return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), HttpStatus.BAD_REQUEST); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java similarity index 69% rename from omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java rename to omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java index 0ca3950..dbb53ab 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/mapper/ScheduleMapperService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java @@ -1,49 +1,53 @@ -package org.openmrs.module.ipd.mapper; +package org.openmrs.module.ipd.factory; -import org.openmrs.Provider; -import org.openmrs.module.ipd.api.service.ReferenceService; -import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; -import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.Concept; import org.openmrs.DrugOrder; import org.openmrs.Patient; +import org.openmrs.Provider; import org.openmrs.api.ConceptService; import org.openmrs.api.OrderService; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.ZoneId; import java.util.Optional; @Component -public class ScheduleMapperService { +public class ScheduleFactory { private final OrderService orderService; private final ConceptService conceptService; private final ReferenceService referenceService; + private final String IPD_MEDICATION_SERVICE_TYPE = "MedicationRequest"; + @Autowired - public ScheduleMapperService(OrderService orderService, ConceptService conceptService, ReferenceService referenceService) { + public ScheduleFactory(OrderService orderService, ConceptService conceptService, ReferenceService referenceService) { this.orderService = orderService; this.conceptService = conceptService; this.referenceService = referenceService; } - public Schedule mapScheduleMedicationRequestToSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest scheduleMedicationRequest) { Schedule schedule = new Schedule(); DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); - Concept medicationRequest = conceptService.getConceptByName("MedicationRequest"); + Concept medicationRequestServiceType = conceptService.getConceptByName(IPD_MEDICATION_SERVICE_TYPE); Reference openmrsForReference = getReference(Patient.class.getTypeName(), scheduleMedicationRequest.getPatientUuid()); Reference openmrsByReference = getReference(Provider.class.getTypeName(), scheduleMedicationRequest.getProviderUuid()); schedule.setForReference(openmrsForReference); schedule.setByReference(openmrsByReference); - schedule.setStartDate(drugOrder.getEffectiveStartDate()); - schedule.setEndDate(drugOrder.getEffectiveStopDate()); - schedule.setServiceType(medicationRequest); + schedule.setStartDate(drugOrder.getEffectiveStartDate().toInstant().atZone(ZoneId.of("UTC")).toLocalDate()); + schedule.setEndDate(drugOrder.getEffectiveStopDate().toInstant().atZone(ZoneId.of("UTC")).toLocalDate()); + schedule.setServiceType(medicationRequestServiceType); + schedule.setOrder(drugOrder); schedule.setActive(true); return schedule; diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java new file mode 100644 index 0000000..31287e3 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -0,0 +1,55 @@ +package org.openmrs.module.ipd.factory; + +import org.openmrs.Concept; +import org.openmrs.Location; +import org.openmrs.Patient; +import org.openmrs.api.ConceptService; +import org.openmrs.api.PatientService; +import org.openmrs.module.bedmanagement.service.BedManagementService; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static org.openmrs.module.ipd.api.model.Slot.SlotStatus.SCHEDULED; + +@Component +public class SlotFactory { + + private final BedManagementService bedManagementService; + private final ConceptService conceptService; + private final PatientService patientService; + + private final String IPD_MEDICATION_SERVICE_TYPE = "MedicationRequest"; + + @Autowired + public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService) { + this.bedManagementService = bedManagementService; + this.conceptService = conceptService; + this.patientService = patientService; + } + + public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime) { + + return slotsStartTime.stream().map(slotStartTime -> { + Slot slot = new Slot(); + + String patientUuid = savedSchedule.getForReference().getTargetUuid(); + Patient patient = patientService.getPatientByUuid(patientUuid); + Location patientLocation = bedManagementService.getBedAssignmentDetailsByPatient(patient).getPhysicalLocation(); + slot.setLocation(patientLocation); + + Concept medicationRequestServiceType = conceptService.getConceptByName(IPD_MEDICATION_SERVICE_TYPE); + slot.setServiceType(medicationRequestServiceType); + + slot.setSchedule(savedSchedule); + slot.setStartDateTime(slotStartTime); + slot.setStatus(SCHEDULED); + return slot; + }).collect(Collectors.toList()); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java similarity index 55% rename from omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java rename to omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index fc24814..98c4233 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/ScheduleMedicationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -1,8 +1,8 @@ package org.openmrs.module.ipd.service; -import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; -public interface ScheduleMedicationService { - Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest); -} +public interface IPDScheduleService { + Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java new file mode 100644 index 0000000..8a26ddf --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -0,0 +1,47 @@ +package org.openmrs.module.ipd.service.impl; + +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.service.ScheduleService; +import org.openmrs.module.ipd.api.service.SlotService; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.factory.ScheduleFactory; +import org.openmrs.module.ipd.factory.SlotFactory; +import org.openmrs.module.ipd.service.IPDScheduleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +@Transactional +public class IPDScheduleServiceImpl implements IPDScheduleService { + + private final ScheduleService scheduleService; + private final ScheduleFactory scheduleFactory; + private final SlotFactory slotFactory; + private final SlotService slotService; + private final SlotTimeCreationService slotTimeCreationService; + + @Autowired + public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory scheduleFactory, SlotFactory slotFactory, SlotService slotService, SlotTimeCreationService slotTimeCreationService) { + this.scheduleService = scheduleService; + this.scheduleFactory = scheduleFactory; + this.slotFactory = slotFactory; + this.slotService = slotService; + this.slotTimeCreationService = slotTimeCreationService; + } + + @Override + public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + + Schedule schedule = scheduleFactory.createScheduleForMedicationFrom(scheduleMedicationRequest); + Schedule savedSchedule = scheduleService.saveSchedule(schedule); + List slotsStartTime = slotTimeCreationService.createSlotsStartTimeFrom(scheduleMedicationRequest, savedSchedule); + slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime) + .forEach(slotService::saveSlot); + + return savedSchedule; + } +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java deleted file mode 100644 index 25036f1..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/ScheduleMedicationServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.openmrs.module.ipd.service.impl; - -import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; -import org.openmrs.module.ipd.mapper.ScheduleMapperService; -import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.service.ScheduleMedicationService; -import org.openmrs.module.ipd.api.service.ScheduleService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class ScheduleMedicationServiceImpl implements ScheduleMedicationService { - - private final ScheduleService scheduleService; - private final ScheduleMapperService scheduleMapperService; - - @Autowired - public ScheduleMedicationServiceImpl(ScheduleService scheduleService, ScheduleMapperService scheduleMapperService) { - this.scheduleService = scheduleService; - this.scheduleMapperService = scheduleMapperService; - } - - @Override - public Schedule createSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { - - Schedule schedule = scheduleMapperService.mapScheduleMedicationRequestToSchedule(scheduleMedicationRequest); - return scheduleService.saveSchedule(schedule); - } -} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java new file mode 100644 index 0000000..3fc229f --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -0,0 +1,59 @@ +package org.openmrs.module.ipd.service.impl; + +import org.openmrs.DrugOrder; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.openmrs.module.ipd.contract.ScheduleMedicationRequest.MedicationFrequency.FIXED_SCHEDULE_FREQUENCY; +import static org.openmrs.module.ipd.contract.ScheduleMedicationRequest.MedicationFrequency.START_TIME_DURATION_FREQUENCY; + +@Component +public class SlotTimeCreationService { + public List createSlotsStartTimeFrom(ScheduleMedicationRequest scheduleMedicationRequest, Schedule savedSchedule) { + DrugOrder order = (DrugOrder) savedSchedule.getOrder(); + int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); + List slotsStartTime = new ArrayList<>(); + + if (scheduleMedicationRequest.getSlotStartTime() != null && scheduleMedicationRequest.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { + int slotDurationInHours = (int) (Math.floor(24 / order.getFrequency().getFrequencyPerDay())); + LocalDateTime slotStartTime = scheduleMedicationRequest.getSlotStartTime(); + while (numberOfSlotsStartTimeToBeCreated-- > 0) { + slotsStartTime.add(slotStartTime); + slotStartTime = slotStartTime.plusHours(slotDurationInHours); + } + } else if (scheduleMedicationRequest.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { + if (scheduleMedicationRequest.getFirstDaySlotsStartTime() != null && !scheduleMedicationRequest.getFirstDaySlotsStartTime().isEmpty()) { + if (numberOfSlotsStartTimeToBeCreated >= scheduleMedicationRequest.getFirstDaySlotsStartTime().size()) { + slotsStartTime.addAll(scheduleMedicationRequest.getFirstDaySlotsStartTime()); + numberOfSlotsStartTimeToBeCreated -= scheduleMedicationRequest.getFirstDaySlotsStartTime().size(); + } + } + if (scheduleMedicationRequest.getDayWiseSlotsStartTime() != null && !scheduleMedicationRequest.getDayWiseSlotsStartTime().isEmpty()) { + + if (numberOfSlotsStartTimeToBeCreated >= scheduleMedicationRequest.getDayWiseSlotsStartTime().size()) { + slotsStartTime.addAll(scheduleMedicationRequest.getDayWiseSlotsStartTime()); + numberOfSlotsStartTimeToBeCreated -= scheduleMedicationRequest.getDayWiseSlotsStartTime().size(); + } + + List nextSlotsStartTime = scheduleMedicationRequest.getDayWiseSlotsStartTime(); + while (numberOfSlotsStartTimeToBeCreated > 0) { + nextSlotsStartTime = nextSlotsStartTime.stream().map(slotStartTime -> slotStartTime.plusHours(24)).collect(Collectors.toList()); + if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { + slotsStartTime.addAll(nextSlotsStartTime); + numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.size(); + } else { + slotsStartTime.addAll(nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated)); + numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated).size(); + } + } + } + } + return slotsStartTime; + } +} diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index b646e8e..067eda0 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -12,6 +12,7 @@ org.openmrs.module.webservices.rest org.bahmni.module.bahmnicore + org.openmrs.module.bedmanagement org.openmrs.module.ipd.api.IPDActivator diff --git a/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java similarity index 94% rename from omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java rename to omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java index cfdfa91..8713439 100644 --- a/omod/src/test/java/org/openmrs/module/ipd/controller/ScheduleMedicationControllerIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java @@ -1,6 +1,5 @@ package org.openmrs.module.ipd.controller; -import org.junit.jupiter.api.BeforeEach; import org.openmrs.module.ipd.BaseIntegrationTest; import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; import org.openmrs.module.ipd.api.model.Schedule; @@ -16,7 +15,8 @@ import java.util.List; -public class ScheduleMedicationControllerIntegrationTest extends BaseIntegrationTest { +/* +public class IPDScheduleControllerIntegrationTest extends BaseIntegrationTest { @Autowired private ScheduleService scheduleService; @@ -49,4 +49,4 @@ private List getAllDrudOrders() { Query query = sessionFactory.getCurrentSession().createQuery("FROM org.openmrs.DrugOrder"); return (List) query.getResultList(); } -} \ No newline at end of file +}*/ diff --git a/pom.xml b/pom.xml index c505e04..d5873b0 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ 2.5.10 2.39.0 + 5.13.0 5.2.14.RELEASE 4.13 2.0.7 @@ -155,6 +156,12 @@ ${openmrsPlatformVersion} provided + + org.openmrs.module + bedmanagement-api + ${bedManagementVersion} + provided + From 631e13c406c633b8c60e3d28e18568df1e09808b Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Wed, 2 Aug 2023 12:11:02 +0530 Subject: [PATCH 05/50] [Ritesh] | 1. Refactor SlotTimeCreationService --- .../contract/ScheduleMedicationRequest.java | 1 - .../service/impl/SlotTimeCreationService.java | 81 ++++++++++++------- 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index 9413357..737b630 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -6,7 +6,6 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; -import java.util.Date; import java.util.List; @Getter diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 3fc229f..204be44 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -4,9 +4,11 @@ import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -15,45 +17,64 @@ @Component public class SlotTimeCreationService { - public List createSlotsStartTimeFrom(ScheduleMedicationRequest scheduleMedicationRequest, Schedule savedSchedule) { + public List createSlotsStartTimeFrom(ScheduleMedicationRequest request, Schedule savedSchedule) { DrugOrder order = (DrugOrder) savedSchedule.getOrder(); + + if (request.getSlotStartTime() != null && request.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { + return getSlotsStartTimeWithStartTimeDurationFrequency(request, order); + } else if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTime()) && request.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { + return getSlotsStartTimeWithFixedScheduleFrequency(request, order); + } + + return Collections.emptyList(); + } + + private List getSlotsStartTimeWithFixedScheduleFrequency(ScheduleMedicationRequest request, DrugOrder order) { int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); List slotsStartTime = new ArrayList<>(); - if (scheduleMedicationRequest.getSlotStartTime() != null && scheduleMedicationRequest.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { - int slotDurationInHours = (int) (Math.floor(24 / order.getFrequency().getFrequencyPerDay())); - LocalDateTime slotStartTime = scheduleMedicationRequest.getSlotStartTime(); - while (numberOfSlotsStartTimeToBeCreated-- > 0) { - slotsStartTime.add(slotStartTime); - slotStartTime = slotStartTime.plusHours(slotDurationInHours); - } - } else if (scheduleMedicationRequest.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { - if (scheduleMedicationRequest.getFirstDaySlotsStartTime() != null && !scheduleMedicationRequest.getFirstDaySlotsStartTime().isEmpty()) { - if (numberOfSlotsStartTimeToBeCreated >= scheduleMedicationRequest.getFirstDaySlotsStartTime().size()) { - slotsStartTime.addAll(scheduleMedicationRequest.getFirstDaySlotsStartTime()); - numberOfSlotsStartTimeToBeCreated -= scheduleMedicationRequest.getFirstDaySlotsStartTime().size(); - } - } - if (scheduleMedicationRequest.getDayWiseSlotsStartTime() != null && !scheduleMedicationRequest.getDayWiseSlotsStartTime().isEmpty()) { + if (!CollectionUtils.isEmpty(request.getFirstDaySlotsStartTime())) { + List slotsToBeAddedForFirstDay = numberOfSlotsStartTimeToBeCreated < request.getFirstDaySlotsStartTime().size() + ? request.getFirstDaySlotsStartTime().subList(0, numberOfSlotsStartTimeToBeCreated) + : request.getFirstDaySlotsStartTime(); - if (numberOfSlotsStartTimeToBeCreated >= scheduleMedicationRequest.getDayWiseSlotsStartTime().size()) { - slotsStartTime.addAll(scheduleMedicationRequest.getDayWiseSlotsStartTime()); - numberOfSlotsStartTimeToBeCreated -= scheduleMedicationRequest.getDayWiseSlotsStartTime().size(); - } + slotsStartTime.addAll(slotsToBeAddedForFirstDay); + numberOfSlotsStartTimeToBeCreated -= slotsToBeAddedForFirstDay.size(); + } - List nextSlotsStartTime = scheduleMedicationRequest.getDayWiseSlotsStartTime(); - while (numberOfSlotsStartTimeToBeCreated > 0) { - nextSlotsStartTime = nextSlotsStartTime.stream().map(slotStartTime -> slotStartTime.plusHours(24)).collect(Collectors.toList()); - if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { - slotsStartTime.addAll(nextSlotsStartTime); - numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.size(); - } else { - slotsStartTime.addAll(nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated)); - numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated).size(); - } + if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTime()) && numberOfSlotsStartTimeToBeCreated > 0) { + + List initialSlotsToBeAddedForSecondDay = numberOfSlotsStartTimeToBeCreated < request.getDayWiseSlotsStartTime().size() + ? request.getDayWiseSlotsStartTime().subList(0, numberOfSlotsStartTimeToBeCreated) + : request.getDayWiseSlotsStartTime(); + slotsStartTime.addAll(initialSlotsToBeAddedForSecondDay); + numberOfSlotsStartTimeToBeCreated -= initialSlotsToBeAddedForSecondDay.size(); + + List nextSlotsStartTime = request.getDayWiseSlotsStartTime(); + while (numberOfSlotsStartTimeToBeCreated > 0) { + nextSlotsStartTime = nextSlotsStartTime.stream().map(slotStartTime -> slotStartTime.plusHours(24)).collect(Collectors.toList()); + if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { + slotsStartTime.addAll(nextSlotsStartTime); + numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.size(); + } else { + slotsStartTime.addAll(nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated)); + numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated).size(); } } } + + return slotsStartTime; + } + + private List getSlotsStartTimeWithStartTimeDurationFrequency(ScheduleMedicationRequest request, DrugOrder order) { + int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); + List slotsStartTime = new ArrayList<>(); + int slotDurationInHours = (int) (Math.floor(24 / order.getFrequency().getFrequencyPerDay())); + LocalDateTime slotStartTime = request.getSlotStartTime(); + while (numberOfSlotsStartTimeToBeCreated-- > 0) { + slotsStartTime.add(slotStartTime); + slotStartTime = slotStartTime.plusHours(slotDurationInHours); + } return slotsStartTime; } } From b25f1ff4400ceba38b821a747c5e283bb5ed4cce Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 3 Aug 2023 14:19:03 +0530 Subject: [PATCH 06/50] [Ritesh] | 1. Handle time zone issue while creating slots and schedule. --- .../contract/ScheduleMedicationRequest.java | 18 ++++++++++++++ .../module/ipd/factory/ScheduleFactory.java | 4 ++-- .../module/ipd/factory/SlotFactory.java | 8 ++++--- .../service/impl/SlotTimeCreationService.java | 24 +++++++++---------- .../module/ipd/BaseWebControllerTest.java | 7 +++--- .../IPDScheduleControllerIntegrationTest.java | 16 +++++++++---- 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index 737b630..e1706a8 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -6,7 +6,9 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.List; +import java.util.stream.Collectors; @Getter @Builder @@ -27,4 +29,20 @@ public enum MedicationFrequency { START_TIME_DURATION_FREQUENCY, FIXED_SCHEDULE_FREQUENCY } + + public LocalDateTime getSlotStartTimeAsLocaltime() { + return slotStartTime != null ? convertUTCToLocalTimeZone(slotStartTime): null; + } + + public List getFirstDaySlotsStartTimeAsLocalTime() { + return firstDaySlotsStartTime != null ? firstDaySlotsStartTime.stream().map(this::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; + } + + public List getDayWiseSlotsStartTimeAsLocalTime() { + return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(this::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; + } + + private LocalDateTime convertUTCToLocalTimeZone(LocalDateTime slotStartTime) { + return slotStartTime.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java index dbb53ab..5d7f2f7 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java @@ -44,8 +44,8 @@ public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest schedu schedule.setForReference(openmrsForReference); schedule.setByReference(openmrsByReference); - schedule.setStartDate(drugOrder.getEffectiveStartDate().toInstant().atZone(ZoneId.of("UTC")).toLocalDate()); - schedule.setEndDate(drugOrder.getEffectiveStopDate().toInstant().atZone(ZoneId.of("UTC")).toLocalDate()); + schedule.setStartDate(drugOrder.getEffectiveStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + schedule.setEndDate(drugOrder.getEffectiveStopDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); schedule.setServiceType(medicationRequestServiceType); schedule.setOrder(drugOrder); schedule.setActive(true); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index 31287e3..9cce0af 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -1,10 +1,10 @@ package org.openmrs.module.ipd.factory; import org.openmrs.Concept; -import org.openmrs.Location; import org.openmrs.Patient; import org.openmrs.api.ConceptService; import org.openmrs.api.PatientService; +import org.openmrs.module.bedmanagement.BedDetails; import org.openmrs.module.bedmanagement.service.BedManagementService; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; @@ -40,8 +40,10 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List createSlotsStartTimeFrom(ScheduleMedicationRequest request, Schedule savedSchedule) { DrugOrder order = (DrugOrder) savedSchedule.getOrder(); - if (request.getSlotStartTime() != null && request.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { + if (request.getSlotStartTimeAsLocaltime() != null && request.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { return getSlotsStartTimeWithStartTimeDurationFrequency(request, order); - } else if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTime()) && request.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { + } else if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTimeAsLocalTime()) && request.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { return getSlotsStartTimeWithFixedScheduleFrequency(request, order); } @@ -33,24 +33,24 @@ private List getSlotsStartTimeWithFixedScheduleFrequency(Schedule int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); List slotsStartTime = new ArrayList<>(); - if (!CollectionUtils.isEmpty(request.getFirstDaySlotsStartTime())) { - List slotsToBeAddedForFirstDay = numberOfSlotsStartTimeToBeCreated < request.getFirstDaySlotsStartTime().size() - ? request.getFirstDaySlotsStartTime().subList(0, numberOfSlotsStartTimeToBeCreated) - : request.getFirstDaySlotsStartTime(); + if (!CollectionUtils.isEmpty(request.getFirstDaySlotsStartTimeAsLocalTime())) { + List slotsToBeAddedForFirstDay = numberOfSlotsStartTimeToBeCreated < request.getFirstDaySlotsStartTimeAsLocalTime().size() + ? request.getFirstDaySlotsStartTimeAsLocalTime().subList(0, numberOfSlotsStartTimeToBeCreated) + : request.getFirstDaySlotsStartTimeAsLocalTime(); slotsStartTime.addAll(slotsToBeAddedForFirstDay); numberOfSlotsStartTimeToBeCreated -= slotsToBeAddedForFirstDay.size(); } - if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTime()) && numberOfSlotsStartTimeToBeCreated > 0) { + if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTimeAsLocalTime()) && numberOfSlotsStartTimeToBeCreated > 0) { - List initialSlotsToBeAddedForSecondDay = numberOfSlotsStartTimeToBeCreated < request.getDayWiseSlotsStartTime().size() - ? request.getDayWiseSlotsStartTime().subList(0, numberOfSlotsStartTimeToBeCreated) - : request.getDayWiseSlotsStartTime(); + List initialSlotsToBeAddedForSecondDay = numberOfSlotsStartTimeToBeCreated < request.getDayWiseSlotsStartTimeAsLocalTime().size() + ? request.getDayWiseSlotsStartTimeAsLocalTime().subList(0, numberOfSlotsStartTimeToBeCreated) + : request.getDayWiseSlotsStartTimeAsLocalTime(); slotsStartTime.addAll(initialSlotsToBeAddedForSecondDay); numberOfSlotsStartTimeToBeCreated -= initialSlotsToBeAddedForSecondDay.size(); - List nextSlotsStartTime = request.getDayWiseSlotsStartTime(); + List nextSlotsStartTime = request.getDayWiseSlotsStartTimeAsLocalTime(); while (numberOfSlotsStartTimeToBeCreated > 0) { nextSlotsStartTime = nextSlotsStartTime.stream().map(slotStartTime -> slotStartTime.plusHours(24)).collect(Collectors.toList()); if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { @@ -70,7 +70,7 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); List slotsStartTime = new ArrayList<>(); int slotDurationInHours = (int) (Math.floor(24 / order.getFrequency().getFrequencyPerDay())); - LocalDateTime slotStartTime = request.getSlotStartTime(); + LocalDateTime slotStartTime = request.getSlotStartTimeAsLocaltime(); while (numberOfSlotsStartTimeToBeCreated-- > 0) { slotsStartTime.add(slotStartTime); slotStartTime = slotStartTime.plusHours(slotDurationInHours); diff --git a/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java b/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java index 5768fe0..169b6e5 100644 --- a/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/BaseWebControllerTest.java @@ -1,8 +1,9 @@ package org.openmrs.module.ipd; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import junit.framework.Assert; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; import org.junit.Ignore; import org.openmrs.web.test.BaseModuleWebContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +29,7 @@ public class BaseWebControllerTest extends BaseModuleWebContextSensitiveTest { @Autowired private List handlerMappings; - private ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); /** * Creates a request from the given parameters. diff --git a/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java index 8713439..fa2305f 100644 --- a/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java @@ -1,14 +1,15 @@ package org.openmrs.module.ipd.controller; -import org.openmrs.module.ipd.BaseIntegrationTest; -import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; -import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.api.service.ScheduleService; -import org.codehaus.jackson.type.TypeReference; +import com.fasterxml.jackson.core.type.TypeReference; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import org.junit.Test; import org.openmrs.DrugOrder; +import org.openmrs.module.bedmanagement.entity.BedPatientAssignment; +import org.openmrs.module.ipd.BaseIntegrationTest; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.service.ScheduleService; +import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; import org.openmrs.module.webservices.rest.web.RestConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletResponse; @@ -49,4 +50,9 @@ private List getAllDrudOrders() { Query query = sessionFactory.getCurrentSession().createQuery("FROM org.openmrs.DrugOrder"); return (List) query.getResultList(); } + + private List getAllBedsAssignedToPatient() { + Query query = sessionFactory.getCurrentSession().createQuery("FROM org.openmrs.module.bedmanagement.entity.BedPatientAssignment"); + return (List) query.getResultList(); + } }*/ From 164d2f67997f1526cdcb2288ee6c658a97e6fe60 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 3 Aug 2023 15:41:01 +0530 Subject: [PATCH 07/50] [Ritesh] | 1. Changing the url of saving medication --- .../module/ipd/contract/ScheduleMedicationResponse.java | 1 - .../openmrs/module/ipd/controller/IPDScheduleController.java | 2 +- .../ipd/controller/IPDScheduleControllerIntegrationTest.java | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 90de4e6..674300d 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -20,7 +20,6 @@ public class ScheduleMedicationResponse { private String comments; private LocalDate startDate; private LocalDate endDate; - // Add list of default Slot response. public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index ec88933..347a56f 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -33,7 +33,7 @@ public IPDScheduleController(IPDScheduleService ipdScheduleService) { this.ipdScheduleService = ipdScheduleService; } - @RequestMapping(value = "/medication", method = RequestMethod.POST) + @RequestMapping(value = "type/medication", method = RequestMethod.POST) @ResponseBody public ResponseEntity createMedicationSchedule(@Valid @RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { try { diff --git a/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java index fa2305f..e135b58 100644 --- a/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java +++ b/omod/src/test/java/org/openmrs/module/ipd/controller/IPDScheduleControllerIntegrationTest.java @@ -16,8 +16,7 @@ import java.util.List; -/* -public class IPDScheduleControllerIntegrationTest extends BaseIntegrationTest { +/*public class IPDScheduleControllerIntegrationTest extends BaseIntegrationTest { @Autowired private ScheduleService scheduleService; @@ -40,7 +39,7 @@ public void shouldSaveMedicationSchedule() throws Exception { "\"medicationFrequency\":\"START_TIME_DURATION_FREQUENCY\"" + "}"; - MockHttpServletResponse response = handle(newPostRequest("/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/medication", content)); + MockHttpServletResponse response = handle(newPostRequest("/rest/" + RestConstants.VERSION_1 + "/ipd/schedule/type/medication", content)); ScheduleMedicationResponse scheduleMedicationResponse = deserialize(response, new TypeReference() {}); Schedule savedSchedule = scheduleService.getSchedule(scheduleMedicationResponse.getId()); scheduleService.purgeSchedule(savedSchedule); From 4dd314d60b30c8509822382a0ad5319d6004d606 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 3 Aug 2023 20:31:43 +0530 Subject: [PATCH 08/50] [Ritesh] | 1. Returning slots --- .../openmrs/module/ipd/api/dao/SlotDAO.java | 6 ++++ .../ipd/api/dao/impl/HibernateSlotDAO.java | 17 +++++++++++ .../module/ipd/api/model/Schedule.java | 6 ++++ .../module/ipd/api/service/SlotService.java | 6 ++++ .../ipd/api/service/impl/SlotServiceImpl.java | 9 ++++++ .../module/ipd/contract/MedicationSlot.java | 24 ++++++++++++---- .../ipd/controller/IPDScheduleController.java | 28 ++++++++++++++++--- .../ipd/service/IPDScheduleService.java | 5 ++++ .../service/impl/IPDScheduleServiceImpl.java | 14 +++++++++- .../service/impl/SlotTimeCreationService.java | 11 ++++++-- 10 files changed, 114 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index d4eb15c..57e5aa1 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -1,9 +1,13 @@ package org.openmrs.module.ipd.api.dao; +import org.openmrs.Concept; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; + @Repository public interface SlotDAO { @@ -12,4 +16,6 @@ public interface SlotDAO { Slot saveSlot(Slot slot) throws DAOException; void purgeSlot(Slot slot) throws DAOException; + + List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 43c2c15..e778338 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -1,5 +1,7 @@ package org.openmrs.module.ipd.api.dao.impl; +import org.hibernate.query.Query; +import org.openmrs.Concept; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Slot; import org.hibernate.SessionFactory; @@ -9,6 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; + @Repository public class HibernateSlotDAO implements SlotDAO { @@ -36,4 +41,16 @@ public Slot saveSlot(Slot slot) throws DAOException { public void purgeSlot(Slot slot) throws DAOException { sessionFactory.getCurrentSession().delete(slot); } + + @Override + public List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Slot slot WHERE slot.schedule.forReference.targetUuid=:forReference and slot.schedule.forReference.type='org.openmrs.Patient' and slot.schedule.startDate<=:forDate and slot.schedule.endDate>=:forDate and slot.serviceType=:serviceType"); + + query.setParameter("forReference", forReference); + query.setParameter("forDate", forDate); + query.setParameter("serviceType", serviceType); + + return query.getResultList(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index ac6a1a9..860523b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -25,10 +25,16 @@ public class Schedule extends BaseChangeableOpenmrsData { @Column(name = "schedule_id") private Integer id; + /** + * Should we rename it to "subject" + */ @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id") private Reference forReference; // actor in fhir reference + /** + * Should we rename it to "author" + */ @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id") private Reference byReference; // actor in fhir reference diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 92d0ba2..87a6ef1 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -1,10 +1,14 @@ package org.openmrs.module.ipd.api.service; +import org.openmrs.Concept; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.util.List; + @Service public interface SlotService extends OpenmrsService { @@ -16,4 +20,6 @@ public interface SlotService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) void purgeSlot(Slot slot) throws APIException; + + List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 9e9e30c..1d2f94c 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -1,5 +1,6 @@ package org.openmrs.module.ipd.api.service.impl; +import org.openmrs.Concept; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; @@ -11,6 +12,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.util.List; + @Service @Transactional public class SlotServiceImpl extends BaseOpenmrsService implements SlotService { @@ -39,4 +43,9 @@ public Slot saveSlot(Slot slot) throws APIException { public void purgeSlot(Slot slot) throws APIException { slotDAO.purgeSlot(slot); } + + @Override + public List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType) { + return slotDAO.getSlotByForReferenceAndForDateAndServiceType(forReference, forDate, serviceType); + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java index 289b80c..531bdbb 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java @@ -1,18 +1,32 @@ package org.openmrs.module.ipd.contract; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; +import org.openmrs.module.ipd.api.model.Slot; +import java.time.LocalDateTime; import java.util.Date; -@Getter @Builder +@Getter +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) +@AllArgsConstructor +@NoArgsConstructor public class MedicationSlot { private String uuid; - private String orderId; private String serviceType; private String status; - private Date startTime; - private Date endTime; - private String notes; + private LocalDateTime startTime; + + public static MedicationSlot createFrom(Slot slot) { + return MedicationSlot.builder() + .uuid(slot.getUuid()) + .serviceType(slot.getServiceType().getName().getName()) + .status(slot.getStatus().name()) + .startTime(slot.getStartDateTime()) + .build(); + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 347a56f..2511656 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -2,6 +2,8 @@ import lombok.extern.slf4j.Slf4j; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.contract.MedicationSlot; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; import org.openmrs.module.ipd.service.IPDScheduleService; @@ -11,12 +13,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.util.List; +import java.util.stream.Collectors; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -44,4 +48,20 @@ public ResponseEntity createMedicationSchedule(@Valid @RequestBody Sched return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } + + @RequestMapping(value = "type/medication", method = RequestMethod.GET) + @ResponseBody + public ResponseEntity getMedicationSchedule(@Valid @RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "serviceType") String serviceType, + @RequestParam(value = "forDate") long forDate) { + try { + LocalDate localDate = Instant.ofEpochSecond(forDate).atZone(ZoneOffset.systemDefault()).toLocalDate(); + List medicationSlots = ipdScheduleService.getMedicationSlots(patientUuid, serviceType, localDate); + List slots = medicationSlots.stream().map(MedicationSlot::createFrom).collect(Collectors.toList()); + return new ResponseEntity<>(slots, OK); + } catch (Exception e) { + log.error("Runtime error while trying to create new schedule", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); + } + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index 98c4233..6b16c73 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -1,8 +1,13 @@ package org.openmrs.module.ipd.service; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import java.time.LocalDate; +import java.util.List; + public interface IPDScheduleService { Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); + List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 8a26ddf..028b258 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -1,6 +1,9 @@ package org.openmrs.module.ipd.service.impl; +import org.openmrs.Concept; +import org.openmrs.api.ConceptService; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.ScheduleService; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; @@ -11,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -23,14 +27,16 @@ public class IPDScheduleServiceImpl implements IPDScheduleService { private final SlotFactory slotFactory; private final SlotService slotService; private final SlotTimeCreationService slotTimeCreationService; + private final ConceptService conceptService; @Autowired - public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory scheduleFactory, SlotFactory slotFactory, SlotService slotService, SlotTimeCreationService slotTimeCreationService) { + public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory scheduleFactory, SlotFactory slotFactory, SlotService slotService, SlotTimeCreationService slotTimeCreationService, ConceptService conceptService) { this.scheduleService = scheduleService; this.scheduleFactory = scheduleFactory; this.slotFactory = slotFactory; this.slotService = slotService; this.slotTimeCreationService = slotTimeCreationService; + this.conceptService = conceptService; } @Override @@ -44,4 +50,10 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat return savedSchedule; } + + @Override + public List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate) { + Concept concept = conceptService.getConceptByName(serviceType); + return slotService.getSlotByForReferenceAndForDateAndServiceType(patientUuid, forDate, concept); + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 8855ad6..489435c 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -69,11 +69,18 @@ private List getSlotsStartTimeWithFixedScheduleFrequency(Schedule private List getSlotsStartTimeWithStartTimeDurationFrequency(ScheduleMedicationRequest request, DrugOrder order) { int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); List slotsStartTime = new ArrayList<>(); - int slotDurationInHours = (int) (Math.floor(24 / order.getFrequency().getFrequencyPerDay())); + Double slotDurationInHours = 24 / order.getFrequency().getFrequencyPerDay(); LocalDateTime slotStartTime = request.getSlotStartTimeAsLocaltime(); while (numberOfSlotsStartTimeToBeCreated-- > 0) { slotsStartTime.add(slotStartTime); - slotStartTime = slotStartTime.plusHours(slotDurationInHours); + if(slotDurationInHours.compareTo(1.0) >= 0) + { + slotStartTime = slotStartTime.plusHours(slotDurationInHours.longValue()); + } + else { + Double minutesToBeAdded = 60 * slotDurationInHours; + slotStartTime = slotStartTime.plusMinutes(minutesToBeAdded.longValue()); + } } return slotsStartTime; } From 6f705b27dad502cf63db4cd26ab6decf7f6cbe51 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 3 Aug 2023 21:57:18 +0530 Subject: [PATCH 09/50] [Ritesh] | Get schedule for Drug chart --- .../contract/MedicationScheduleResponse.java | 70 +++++++++++++++++++ .../module/ipd/contract/MedicationSlot.java | 32 --------- .../contract/ScheduleMedicationRequest.java | 18 +++-- .../ipd/controller/IPDScheduleController.java | 18 ++--- .../openmrs/module/ipd/util/DateTimeUtil.java | 16 +++++ 5 files changed, 104 insertions(+), 50 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java new file mode 100644 index 0000000..bac7e18 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -0,0 +1,70 @@ +package org.openmrs.module.ipd.contract; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToUTC; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MedicationScheduleResponse { + + private Integer id; + private String uuid; + private String serviceType; + private String comments; + private LocalDate startDate; + private LocalDate endDate; + private Object order; + private List slots; + public static MedicationScheduleResponse createFrom(Schedule schedule, List slots) { + + return MedicationScheduleResponse.builder() + .id(schedule.getId()) + .uuid(schedule.getUuid()) + .serviceType(schedule.getServiceType().getName().getName()) + .comments(schedule.getComments()) + .startDate(schedule.getStartDate()) + .endDate(schedule.getEndDate()) + .order(ConversionUtil.convertToRepresentation(schedule.getOrder(), Representation.FULL)) + .slots(slots.stream().map(MedicationSlot::createFrom).collect(Collectors.toList())) + .build(); + + } + + @Builder + @Getter + @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) + @AllArgsConstructor + @NoArgsConstructor + static class MedicationSlot { + private Integer id; + private String uuid; + private String serviceType; + private String status; + private LocalDateTime startTime; + public static MedicationSlot createFrom(Slot slot) { + return MedicationSlot.builder() + .id(slot.getId()) + .uuid(slot.getUuid()) + .serviceType(slot.getServiceType().getName().getName()) + .status(slot.getStatus().name()) + .startTime(convertLocalTimeToUTC(slot.getStartDateTime())) + .build(); + } + } +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java deleted file mode 100644 index 531bdbb..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlot.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.openmrs.module.ipd.contract; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.openmrs.module.ipd.api.model.Slot; - -import java.time.LocalDateTime; -import java.util.Date; - -@Builder -@Getter -@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) -@AllArgsConstructor -@NoArgsConstructor -public class MedicationSlot { - private String uuid; - private String serviceType; - private String status; - private LocalDateTime startTime; - - public static MedicationSlot createFrom(Slot slot) { - return MedicationSlot.builder() - .uuid(slot.getUuid()) - .serviceType(slot.getServiceType().getName().getName()) - .status(slot.getStatus().name()) - .startTime(slot.getStartDateTime()) - .build(); - } -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index e1706a8..5aa7334 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -4,12 +4,14 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.openmrs.module.ipd.util.DateTimeUtil; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.List; import java.util.stream.Collectors; +import static org.openmrs.module.ipd.util.DateTimeUtil.convertUTCToLocalTimeZone; + @Getter @Builder @NoArgsConstructor @@ -20,9 +22,9 @@ public class ScheduleMedicationRequest { private String orderUuid; private String providerUuid; private String comments; - private LocalDateTime slotStartTime; - private List firstDaySlotsStartTime; - private List dayWiseSlotsStartTime; + private Long slotStartTime; + private List firstDaySlotsStartTime; + private List dayWiseSlotsStartTime; private MedicationFrequency medicationFrequency; public enum MedicationFrequency { @@ -35,14 +37,10 @@ public LocalDateTime getSlotStartTimeAsLocaltime() { } public List getFirstDaySlotsStartTimeAsLocalTime() { - return firstDaySlotsStartTime != null ? firstDaySlotsStartTime.stream().map(this::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; + return firstDaySlotsStartTime != null ? firstDaySlotsStartTime.stream().map(DateTimeUtil::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; } public List getDayWiseSlotsStartTimeAsLocalTime() { - return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(this::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; - } - - private LocalDateTime convertUTCToLocalTimeZone(LocalDateTime slotStartTime) { - return slotStartTime.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); + return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(DateTimeUtil::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 2511656..129f3cd 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -3,7 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.contract.MedicationSlot; +import org.openmrs.module.ipd.contract.MedicationScheduleResponse; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; import org.openmrs.module.ipd.service.IPDScheduleService; @@ -16,12 +16,13 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.time.Instant; import java.time.LocalDate; -import java.time.ZoneOffset; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import static org.openmrs.module.ipd.contract.MedicationScheduleResponse.createFrom; +import static org.openmrs.module.ipd.util.DateTimeUtil.convertUTCToLocalTimeZone; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -55,13 +56,14 @@ public ResponseEntity getMedicationSchedule(@Valid @RequestParam(value = @RequestParam(value = "serviceType") String serviceType, @RequestParam(value = "forDate") long forDate) { try { - LocalDate localDate = Instant.ofEpochSecond(forDate).atZone(ZoneOffset.systemDefault()).toLocalDate(); - List medicationSlots = ipdScheduleService.getMedicationSlots(patientUuid, serviceType, localDate); - List slots = medicationSlots.stream().map(MedicationSlot::createFrom).collect(Collectors.toList()); - return new ResponseEntity<>(slots, OK); + LocalDate localDate = convertUTCToLocalTimeZone(forDate).toLocalDate(); + List slots = ipdScheduleService.getMedicationSlots(patientUuid, serviceType, localDate); + Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); + List responses = slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); + return new ResponseEntity<>(responses, OK); } catch (Exception e) { log.error("Runtime error while trying to create new schedule", e); return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } -} +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java b/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java new file mode 100644 index 0000000..90189a0 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java @@ -0,0 +1,16 @@ +package org.openmrs.module.ipd.util; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; + +public class DateTimeUtil { + public static LocalDateTime convertUTCToLocalTimeZone(long utcTime) { + return Instant.ofEpochSecond(utcTime).atZone(ZoneOffset.systemDefault()).toLocalDateTime(); + } + + public static LocalDateTime convertLocalTimeToUTC(LocalDateTime localDateTime) { + return localDateTime.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime(); + } +} \ No newline at end of file From 6e2b5fbd7f648a8a0349250a06bb19f9ca19f4e6 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 3 Aug 2023 23:29:33 +0530 Subject: [PATCH 10/50] [Ritesh] | Fix date time issue in slots response --- .../contract/MedicationScheduleResponse.java | 17 ++++++++--------- .../openmrs/module/ipd/util/DateTimeUtil.java | 13 +++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index bac7e18..8be58cc 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -10,12 +10,11 @@ import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; -import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToUTC; +import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToEpoc; +import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToUTCEpoc; @Getter @Builder @@ -27,8 +26,8 @@ public class MedicationScheduleResponse { private String uuid; private String serviceType; private String comments; - private LocalDate startDate; - private LocalDate endDate; + private long startDate; + private long endDate; private Object order; private List slots; public static MedicationScheduleResponse createFrom(Schedule schedule, List slots) { @@ -38,8 +37,8 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List Date: Sun, 6 Aug 2023 21:41:51 +0530 Subject: [PATCH 11/50] [Ritesh] | Refactoring and Added test --- .../module/ipd/api/dao/ScheduleDAO.java | 2 - .../openmrs/module/ipd/api/dao/SlotDAO.java | 5 +- .../api/dao/impl/HibernateReferenceDAO.java | 4 - .../api/dao/impl/HibernateScheduleDAO.java | 5 - .../ipd/api/dao/impl/HibernateSlotDAO.java | 14 +- .../module/ipd/api/model/Reference.java | 11 +- .../module/ipd/api/model/Schedule.java | 13 +- .../openmrs/module/ipd/api/model/Slot.java | 8 +- .../ipd/api/service/ScheduleService.java | 3 - .../module/ipd/api/service/SlotService.java | 6 +- .../service/impl/ReferenceServiceImpl.java | 12 +- .../api/service/impl/ScheduleServiceImpl.java | 5 - .../ipd/api/service/impl/SlotServiceImpl.java | 11 +- .../module/ipd/api/util/DateTimeUtil.java | 18 +++ api/src/main/resources/liquibase.xml | 2 +- .../module/ipd/api/BaseIntegrationTest.java | 6 + .../HibernateReferenceDAOIntegrationTest.java | 36 +++++ .../HibernateScheduleDAOIntegrationTest.java | 89 +++++++++++ .../impl/HibernateSlotDAOIntegrationTest.java | 144 ++++++++++++++++++ .../impl/ReferenceServiceImplTest.java | 50 ++++++ .../service/impl/ScheduleServiceImplTest.java | 45 ++++++ .../api/service/impl/SlotServiceImplTest.java | 76 +++++++++ .../module/ipd/api/util/DateTimeUtilTest.java | 40 +++++ .../resources/TestingApplicationContext.xml | 12 ++ .../contract/MedicationScheduleResponse.java | 9 +- .../contract/ScheduleMedicationRequest.java | 10 +- .../contract/ScheduleMedicationResponse.java | 10 +- .../ipd/controller/IPDScheduleController.java | 4 +- .../module/ipd/factory/ScheduleFactory.java | 25 ++- .../service/impl/IPDScheduleServiceImpl.java | 11 +- .../openmrs/module/ipd/util/DateTimeUtil.java | 17 --- .../resources/webModuleApplicationContext.xml | 2 +- 32 files changed, 591 insertions(+), 114 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/util/DateTimeUtil.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/BaseIntegrationTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAOIntegrationTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImplTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java create mode 100644 api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java create mode 100644 api/src/test/resources/TestingApplicationContext.xml delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 4426f01..46ad4da 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -10,6 +10,4 @@ public interface ScheduleDAO { Schedule getSchedule(Integer scheduleId) throws DAOException; Schedule saveSchedule(Schedule schedule) throws DAOException; - - void purgeSchedule(Schedule schedule) throws DAOException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 57e5aa1..09c7ad5 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.dao; import org.openmrs.Concept; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; @@ -15,7 +16,5 @@ public interface SlotDAO { Slot saveSlot(Slot slot) throws DAOException; - void purgeSlot(Slot slot) throws DAOException; - - List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType); + List getSlotsByForReferenceIdAndForDateAndServiceType(Reference reference, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java index b39a2ed..9557690 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAO.java @@ -10,9 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; import java.util.Optional; @Repository @@ -27,7 +24,6 @@ public HibernateReferenceDAO(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } - @Override public Optional getReferenceByTypeAndTargetUUID(String type, String targetUuid) throws DAOException { diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 3402c4a..16ea7c5 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -30,9 +30,4 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { sessionFactory.getCurrentSession().saveOrUpdate(schedule); return schedule; } - - @Override - public void purgeSchedule(Schedule schedule) throws DAOException { - sessionFactory.getCurrentSession().delete(schedule); - } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index e778338..2242efe 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -3,6 +3,7 @@ import org.hibernate.query.Query; import org.openmrs.Concept; import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.hibernate.SessionFactory; import org.openmrs.api.db.DAOException; @@ -38,17 +39,14 @@ public Slot saveSlot(Slot slot) throws DAOException { } @Override - public void purgeSlot(Slot slot) throws DAOException { - sessionFactory.getCurrentSession().delete(slot); - } - - @Override - public List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType) { + public List getSlotsByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType) { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Slot slot WHERE slot.schedule.forReference.targetUuid=:forReference and slot.schedule.forReference.type='org.openmrs.Patient' and slot.schedule.startDate<=:forDate and slot.schedule.endDate>=:forDate and slot.serviceType=:serviceType"); + .createQuery("FROM Slot slot WHERE slot.schedule.forReference=:forReference and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType"); query.setParameter("forReference", forReference); - query.setParameter("forDate", forDate); + query.setParameter("forYear", forDate.getYear()); + query.setParameter("forMonth", forDate.getMonthValue()); + query.setParameter("forDay", forDate.getDayOfMonth()); query.setParameter("serviceType", serviceType); return query.getResultList(); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java index e0bbba5..2889cac 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Reference.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.Setter; import org.openmrs.BaseOpenmrsMetadata; +import org.openmrs.OpenmrsObject; import javax.persistence.*; @@ -18,6 +19,12 @@ public class Reference extends BaseOpenmrsMetadata { public Reference() { setName(""); } + + public Reference(String type, String targetUuid) { + this.type = type; + this.targetUuid = targetUuid; + this.setName(type + "/" + targetUuid); + } @EqualsAndHashCode.Include @Id @@ -25,9 +32,9 @@ public Reference() { @Column(name = "reference_id") private Integer id; - @Column(name = "target_type") + @Column(name = "target_type", nullable = false) private String type; - @Column(name = "target_uuid") + @Column(name = "target_uuid", nullable = false) private String targetUuid; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index 860523b..f52b417 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -8,7 +8,7 @@ import org.openmrs.Order; import javax.persistence.*; -import java.time.LocalDate; +import java.time.LocalDateTime; @Data @NoArgsConstructor @@ -29,14 +29,14 @@ public class Schedule extends BaseChangeableOpenmrsData { * Should we rename it to "subject" */ @ManyToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id") + @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id", nullable = false) private Reference forReference; // actor in fhir reference /** * Should we rename it to "author" */ @ManyToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id") + @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id", nullable = false) private Reference byReference; // actor in fhir reference @Column(name = "active", nullable = false) @@ -47,7 +47,7 @@ public class Schedule extends BaseChangeableOpenmrsData { private Concept serviceCategory; // null not in use @OneToOne - @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") + @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id", nullable = false) private Concept serviceType; @OneToOne @@ -59,12 +59,11 @@ public class Schedule extends BaseChangeableOpenmrsData { private Order order; @Column(name = "start_date", nullable = false) - private LocalDate startDate; + private LocalDateTime startDate; @Column(name = "end_date", nullable = false) - private LocalDate endDate; + private LocalDateTime endDate; @Column(name = "comments") private String comments; - } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index 4870c8b..d5ce4dd 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -50,7 +50,7 @@ public enum SlotStatus { * The Service Type of the Schedule */ @OneToOne - @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id") + @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id", nullable = false) private Concept serviceType; // as per schedule service type /** @@ -71,7 +71,7 @@ public enum SlotStatus { * The entity that belongs to a Schedule */ @ManyToOne - @JoinColumn(name = "schedule_id", referencedColumnName = "schedule_id") + @JoinColumn(name = "schedule_id", referencedColumnName = "schedule_id", nullable = false) private Schedule schedule; /** @@ -99,8 +99,8 @@ public enum SlotStatus { @Enumerated(EnumType.STRING) private SlotStatus status = SlotStatus.SCHEDULED; - @Column(name = "overbooked") - private Boolean overbooked = false; // not is use + @Column(name = "overbooked", nullable = false) + private Boolean overbooked = Boolean.FALSE; // not is use } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 317bf53..7d760ee 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -13,7 +13,4 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; - -// @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) - void purgeSchedule(Schedule schedule) throws APIException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 87a6ef1..b079de1 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.service; import org.openmrs.Concept; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; @@ -18,8 +19,5 @@ public interface SlotService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) Slot saveSlot(Slot slot) throws APIException; -// @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) - void purgeSlot(Slot slot) throws APIException; - - List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType); + List getSlotByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java index c8a0564..9895276 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImpl.java @@ -2,7 +2,7 @@ import org.openmrs.api.APIException; import org.openmrs.api.impl.BaseOpenmrsService; -import org.openmrs.module.ipd.api.dao.impl.HibernateReferenceDAO; +import org.openmrs.module.ipd.api.dao.ReferenceDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.service.ReferenceService; import org.slf4j.Logger; @@ -19,21 +19,21 @@ public class ReferenceServiceImpl extends BaseOpenmrsService implements Referenc private static final Logger log = LoggerFactory.getLogger(ReferenceServiceImpl.class); - private final HibernateReferenceDAO hibernateReferenceDAO; + private final ReferenceDAO referenceDAO; @Autowired - public ReferenceServiceImpl(HibernateReferenceDAO hibernateReferenceDAO) { - this.hibernateReferenceDAO = hibernateReferenceDAO; + public ReferenceServiceImpl(ReferenceDAO referenceDAO) { + this.referenceDAO = referenceDAO; } @Override @Transactional(readOnly = true) public Optional getReferenceByTypeAndTargetUUID(String type, String targetUuid) throws APIException { - return hibernateReferenceDAO.getReferenceByTypeAndTargetUUID(type, targetUuid); + return referenceDAO.getReferenceByTypeAndTargetUUID(type, targetUuid); } @Override public Reference saveReference(Reference reference) throws APIException { - return hibernateReferenceDAO.saveReference(reference); + return referenceDAO.saveReference(reference); } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 16a07f3..24d4159 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -34,9 +34,4 @@ public Schedule getSchedule(Integer scheduleId) throws APIException { public Schedule saveSchedule(Schedule schedule) throws APIException { return scheduleDAO.saveSchedule(schedule); } - - @Override - public void purgeSchedule(Schedule schedule) throws APIException { - scheduleDAO.purgeSchedule(schedule); - } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 1d2f94c..d9a5749 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -2,6 +2,7 @@ import org.openmrs.Concept; import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.api.APIException; @@ -40,12 +41,8 @@ public Slot saveSlot(Slot slot) throws APIException { } @Override - public void purgeSlot(Slot slot) throws APIException { - slotDAO.purgeSlot(slot); - } - - @Override - public List getSlotByForReferenceAndForDateAndServiceType(String forReference, LocalDate forDate, Concept serviceType) { - return slotDAO.getSlotByForReferenceAndForDateAndServiceType(forReference, forDate, serviceType); + @Transactional(readOnly = true) + public List getSlotByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType) { + return slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(forReference, forDate, serviceType); } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/util/DateTimeUtil.java b/api/src/main/java/org/openmrs/module/ipd/api/util/DateTimeUtil.java new file mode 100644 index 0000000..45c6cc3 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/util/DateTimeUtil.java @@ -0,0 +1,18 @@ +package org.openmrs.module.ipd.api.util; + +import java.time.*; +import java.util.Date; + +public class DateTimeUtil { + public static LocalDateTime convertEpocUTCToLocalTimeZone(long utcTime) { + return Instant.ofEpochSecond(utcTime).atZone(ZoneOffset.systemDefault()).toLocalDateTime(); + } + + public static long convertLocalDateTimeToUTCEpoc(LocalDateTime localDateTime) { + return localDateTime.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toEpochSecond(); + } + + public static LocalDateTime convertDateToLocalDateTime(Date date) { + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + } +} \ No newline at end of file diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 1fe5fba..f98310b 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -126,7 +126,7 @@ - + diff --git a/api/src/test/java/org/openmrs/module/ipd/api/BaseIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/BaseIntegrationTest.java new file mode 100644 index 0000000..1e6033b --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/BaseIntegrationTest.java @@ -0,0 +1,6 @@ +package org.openmrs.module.ipd.api; +import org.openmrs.web.test.BaseModuleWebContextSensitiveTest; + +@org.springframework.test.context.ContextConfiguration(locations = {"classpath:TestingApplicationContext.xml"}) +public abstract class BaseIntegrationTest extends BaseModuleWebContextSensitiveTest { +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAOIntegrationTest.java new file mode 100644 index 0000000..46aa98d --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateReferenceDAOIntegrationTest.java @@ -0,0 +1,36 @@ +package org.openmrs.module.ipd.api.dao.impl; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.openmrs.Patient; +import org.openmrs.module.ipd.api.BaseIntegrationTest; +import org.openmrs.module.ipd.api.dao.ReferenceDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; + +public class HibernateReferenceDAOIntegrationTest extends BaseIntegrationTest { + + @Autowired + private ReferenceDAO referenceDAO; + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void shouldSaveAndGetThePatientReference() { + Reference openmrsReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference reference = referenceDAO.saveReference(openmrsReference); + + Optional savedReference = referenceDAO.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + + Assertions.assertTrue(savedReference.isPresent()); + Assertions.assertEquals("2c33920f-7aa6-0000-998a-60412d8ff7d5", savedReference.get().getTargetUuid()); + Assertions.assertEquals("org.openmrs.Patient", savedReference.get().getType()); + Assertions.assertEquals("org.openmrs.Patient/2c33920f-7aa6-0000-998a-60412d8ff7d5", savedReference.get().getName()); + + sessionFactory.getCurrentSession().delete(reference); + } +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java new file mode 100644 index 0000000..c2fd234 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -0,0 +1,89 @@ +package org.openmrs.module.ipd.api.dao.impl; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.openmrs.Concept; +import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.api.context.Context; +import org.openmrs.module.ipd.api.BaseIntegrationTest; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.util.DateTimeUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { + + @Autowired + private ScheduleDAO scheduleDAO; + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void shouldSaveTheScheduledCreatedForPatientGivenPatientSchedule() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setForReference(patientReference); + schedule.setByReference(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + Assertions.assertEquals(drugOrder, schedule.getOrder()); + Assertions.assertEquals(patientReference, schedule.getForReference()); + Assertions.assertEquals(providerReference, schedule.getByReference()); + Assertions.assertEquals(startDate, schedule.getStartDate()); + Assertions.assertEquals(endDate, schedule.getEndDate()); + Assertions.assertEquals(testConcept, schedule.getServiceType()); + + sessionFactory.getCurrentSession().delete(savedSchedule); + } + + @Test + public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setForReference(patientReference); + schedule.setByReference(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + Schedule scheduleById = scheduleDAO.getSchedule(savedSchedule.getId()); + + Assertions.assertEquals(drugOrder, scheduleById.getOrder()); + Assertions.assertEquals(patientReference, scheduleById.getForReference()); + Assertions.assertEquals(providerReference, scheduleById.getByReference()); + Assertions.assertEquals(startDate, scheduleById.getStartDate()); + Assertions.assertEquals(endDate, scheduleById.getEndDate()); + Assertions.assertEquals(testConcept, scheduleById.getServiceType()); + + sessionFactory.getCurrentSession().delete(savedSchedule); + } +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java new file mode 100644 index 0000000..2f3dde6 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java @@ -0,0 +1,144 @@ +package org.openmrs.module.ipd.api.dao.impl; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.openmrs.Concept; +import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.api.context.Context; +import org.openmrs.module.ipd.api.BaseIntegrationTest; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.util.DateTimeUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +public class HibernateSlotDAOIntegrationTest extends BaseIntegrationTest { + + @Autowired + private ScheduleDAO scheduleDAO; + + @Autowired + private SlotDAO slotDAO; + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void shouldSaveTheSlotForPatientGivenPatientSchedule() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setForReference(patientReference); + schedule.setByReference(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + LocalDateTime slotStartTime = LocalDateTime.now(); + + Slot slot = new Slot(); + slot.setSchedule(savedSchedule); + slot.setServiceType(testConcept); + slot.setStartDateTime(slotStartTime); + + Slot savedSlot = slotDAO.saveSlot(slot); + + sessionFactory.getCurrentSession().delete(savedSlot); + sessionFactory.getCurrentSession().delete(savedSchedule); + } + + @Test + public void shouldGetTheSavedSlotForPatientGivenPatientSchedule() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setForReference(patientReference); + schedule.setByReference(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + LocalDateTime slotStartTime = LocalDateTime.now(); + + Slot slot = new Slot(); + slot.setSchedule(savedSchedule); + slot.setServiceType(testConcept); + slot.setStartDateTime(slotStartTime); + + Slot savedSlot = slotDAO.saveSlot(slot); + Slot getSlotById = slotDAO.getSlot(savedSlot.getId()); + + sessionFactory.getCurrentSession().delete(savedSlot); + sessionFactory.getCurrentSession().delete(savedSchedule); + } + + @Test + public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndForDateAndServiceTypeGivenPatientSchedule() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setForReference(patientReference); + schedule.setByReference(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + LocalDateTime slotStartTime = LocalDateTime.now(); + + Slot slot1 = new Slot(); + slot1.setSchedule(savedSchedule); + slot1.setServiceType(testConcept); + slot1.setStartDateTime(slotStartTime); + + Slot slot2 = new Slot(); + slot2.setSchedule(savedSchedule); + slot2.setServiceType(testConcept); + slot2.setStartDateTime(slotStartTime.plusDays(1)); + + Slot savedSlot1 = slotDAO.saveSlot(slot1); + Slot savedSlot2 = slotDAO.saveSlot(slot2); + + List slotsAgainstSchedule = slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, slotStartTime.toLocalDate(), testConcept); + + Assertions.assertEquals(1, slotsAgainstSchedule.size()); + + sessionFactory.getCurrentSession().delete(savedSlot1); + sessionFactory.getCurrentSession().delete(savedSlot2); + sessionFactory.getCurrentSession().delete(savedSchedule); + } +} diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImplTest.java new file mode 100644 index 0000000..26332a8 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ReferenceServiceImplTest.java @@ -0,0 +1,50 @@ +package org.openmrs.module.ipd.api.service.impl; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.openmrs.Patient; +import org.openmrs.module.ipd.api.dao.ReferenceDAO; +import org.openmrs.module.ipd.api.model.Reference; + +import java.util.Optional; + +@RunWith(MockitoJUnitRunner.class) +public class ReferenceServiceImplTest { + + @InjectMocks + private ReferenceServiceImpl referenceService; + + @Mock + private ReferenceDAO referenceDAO; + + @Test + public void shouldInvokeSaveReferenceWithGivenReference() { + Reference openmrsReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference expectedOpenmrsReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + expectedOpenmrsReference.setId(1); + + Mockito.when(referenceDAO.saveReference(openmrsReference)).thenReturn(expectedOpenmrsReference); + + referenceService.saveReference(openmrsReference); + + Mockito.verify(referenceDAO, Mockito.times(1)).saveReference(openmrsReference); + } + + @Test + public void shouldInvokeGetReferenceByTargetUUIDAndTypeWithGivenTargetUUIDAndType() { + String typeName = Patient.class.getTypeName(); + String targetUuid = "2c33920f-7aa6-0000-998a-60412d8ff7d5"; + Reference expectedOpenmrsReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + expectedOpenmrsReference.setId(1); + + Mockito.when(referenceDAO.getReferenceByTypeAndTargetUUID(typeName, targetUuid)).thenReturn(Optional.of(expectedOpenmrsReference)); + + referenceService.getReferenceByTypeAndTargetUUID(typeName, targetUuid); + + Mockito.verify(referenceDAO, Mockito.times(1)).getReferenceByTypeAndTargetUUID(typeName, targetUuid); + } +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java new file mode 100644 index 0000000..f45bcd6 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java @@ -0,0 +1,45 @@ +package org.openmrs.module.ipd.api.service.impl; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Schedule; + +@RunWith(MockitoJUnitRunner.class) +public class ScheduleServiceImplTest { + + @InjectMocks + private ScheduleServiceImpl scheduleService; + + @Mock + private ScheduleDAO scheduleDAO; + + @Test + public void shouldInvokeSaveScheduleWithGivenSchedule() { + Schedule schedule = new Schedule(); + Schedule expectedSchedule = new Schedule(); + expectedSchedule.setId(1); + + Mockito.when(scheduleDAO.saveSchedule(schedule)).thenReturn(expectedSchedule); + + scheduleService.saveSchedule(schedule); + + Mockito.verify(scheduleDAO, Mockito.times(1)).saveSchedule(schedule); + } + + @Test + public void shouldInvokeGetScheduleWithGivenScheduleId() { + Schedule expectedSchedule = new Schedule(); + expectedSchedule.setId(1); + + Mockito.when(scheduleDAO.getSchedule(1)).thenReturn(expectedSchedule); + + scheduleService.getSchedule(1); + + Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedule(1); + } +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java new file mode 100644 index 0000000..d429c36 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java @@ -0,0 +1,76 @@ +package org.openmrs.module.ipd.api.service.impl; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.openmrs.Concept; +import org.openmrs.ConceptName; +import org.openmrs.Patient; +import org.openmrs.module.ipd.api.dao.SlotDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Slot; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +@RunWith(MockitoJUnitRunner.class) +public class SlotServiceImplTest { + + @InjectMocks + private SlotServiceImpl slotService; + + @Mock + private SlotDAO slotDAO; + + @Test + public void shouldInvokeSaveSlotWithGivenSlot() { + Slot slot = new Slot(); + Slot expectedSlot = new Slot(); + expectedSlot.setId(1); + + Mockito.when(slotDAO.saveSlot(slot)).thenReturn(expectedSlot); + + slotService.saveSlot(slot); + + Mockito.verify(slotDAO, Mockito.times(1)).saveSlot(slot); + } + + @Test + public void shouldInvokeGetSlotWithGivenSlotId() { + Slot expectedSlot = new Slot(); + expectedSlot.setId(1); + + Mockito.when(slotDAO.getSlot(1)).thenReturn(expectedSlot); + + slotService.getSlot(1); + + Mockito.verify(slotDAO, Mockito.times(1)).getSlot(1); + } + + @Test + public void shouldInvokeGetSlotsByForReferenceAndForDateAndServiceTypeWithGivenScheduleId() { + Slot expectedSlot = new Slot(); + expectedSlot.setId(1); + List slots = new ArrayList<>(); + + LocalDate today = LocalDate.now(); + Concept medicationRequestConcept = new Concept(); + ConceptName conceptName = new ConceptName(); + conceptName.setName("MedicationRequest"); + conceptName.setLocale(Locale.US); + medicationRequestConcept.setFullySpecifiedName(conceptName); + + Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + + Mockito.when(slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept)).thenReturn(slots); + + slotService.getSlotByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); + + Mockito.verify(slotDAO, Mockito.times(1)).getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); + } +} \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java b/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java new file mode 100644 index 0000000..d437129 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java @@ -0,0 +1,40 @@ +package org.openmrs.module.ipd.api.util; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class DateTimeUtilTest { + + @Test + public void shouldConvertEPOCUTCToLocalTimeZone() { + LocalDateTime localDateTime = DateTimeUtil.convertEpocUTCToLocalTimeZone(1690906304); + + Assertions.assertEquals(2023,localDateTime.getYear()); + Assertions.assertEquals(8, localDateTime.getMonthValue()); + Assertions.assertEquals(1, localDateTime.getDayOfMonth()); + Assertions.assertEquals(21, localDateTime.getHour()); + Assertions.assertEquals(41, localDateTime.getMinute()); + Assertions.assertEquals(44, localDateTime.getSecond()); + } + + @Test + public void shouldConvertLocalTimeZoneToEPOCUTC() { + LocalDateTime localDateTime = LocalDateTime.of(2023, 8, 1, 21, 41, 44); + long epocUTCTime = DateTimeUtil.convertLocalDateTimeToUTCEpoc(localDateTime); + + Assertions.assertEquals(1690906304,epocUTCTime); + } + + @Test + public void shouldConvertDateToLocalDateTime() { + Date date = Date.from(Instant.ofEpochSecond(1690906304)); + LocalDateTime localDateTime = DateTimeUtil.convertDateToLocalDateTime(date); + + Assertions.assertEquals(1690906304, localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond()); + } +} \ No newline at end of file diff --git a/api/src/test/resources/TestingApplicationContext.xml b/api/src/test/resources/TestingApplicationContext.xml new file mode 100644 index 0000000..bf8a8fc --- /dev/null +++ b/api/src/test/resources/TestingApplicationContext.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index 8be58cc..94f501d 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -13,8 +13,7 @@ import java.util.List; import java.util.stream.Collectors; -import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToEpoc; -import static org.openmrs.module.ipd.util.DateTimeUtil.convertLocalTimeToUTCEpoc; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertLocalDateTimeToUTCEpoc; @Getter @Builder @@ -37,8 +36,8 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List getFirstDaySlotsStartTimeAsLocalTime() { - return firstDaySlotsStartTime != null ? firstDaySlotsStartTime.stream().map(DateTimeUtil::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; + return firstDaySlotsStartTime != null ? firstDaySlotsStartTime.stream().map(DateTimeUtil::convertEpocUTCToLocalTimeZone).collect(Collectors.toList()) : null; } public List getDayWiseSlotsStartTimeAsLocalTime() { - return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(DateTimeUtil::convertUTCToLocalTimeZone).collect(Collectors.toList()) : null; + return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(DateTimeUtil::convertEpocUTCToLocalTimeZone).collect(Collectors.toList()) : null; } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 674300d..0d5a712 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; import org.openmrs.module.ipd.api.model.Schedule; -import java.time.LocalDate; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertLocalDateTimeToUTCEpoc; @Builder @Getter @@ -18,16 +18,16 @@ public class ScheduleMedicationResponse { private Integer id; private String patientUuid; private String comments; - private LocalDate startDate; - private LocalDate endDate; + private long startDate; + private long endDate; public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() .id(schedule.getId()) .patientUuid(schedule.getForReference().getUuid()) .comments(schedule.getComments()) - .startDate(schedule.getStartDate()) - .endDate(schedule.getEndDate()) + .startDate(convertLocalDateTimeToUTCEpoc(schedule.getStartDate())) + .endDate(convertLocalDateTimeToUTCEpoc(schedule.getEndDate())) .build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 129f3cd..0640635 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -22,7 +22,7 @@ import java.util.stream.Collectors; import static org.openmrs.module.ipd.contract.MedicationScheduleResponse.createFrom; -import static org.openmrs.module.ipd.util.DateTimeUtil.convertUTCToLocalTimeZone; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -56,7 +56,7 @@ public ResponseEntity getMedicationSchedule(@Valid @RequestParam(value = @RequestParam(value = "serviceType") String serviceType, @RequestParam(value = "forDate") long forDate) { try { - LocalDate localDate = convertUTCToLocalTimeZone(forDate).toLocalDate(); + LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); List slots = ipdScheduleService.getMedicationSlots(patientUuid, serviceType, localDate); Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); List responses = slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java index 5d7f2f7..c6d37d1 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java @@ -13,9 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.ZoneId; import java.util.Optional; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertDateToLocalDateTime; + @Component public class ScheduleFactory { @@ -33,19 +34,19 @@ public ScheduleFactory(OrderService orderService, ConceptService conceptService, this.referenceService = referenceService; } - public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest scheduleMedicationRequest) { + public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest request) { Schedule schedule = new Schedule(); - DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); + DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(request.getOrderUuid()); Concept medicationRequestServiceType = conceptService.getConceptByName(IPD_MEDICATION_SERVICE_TYPE); - Reference openmrsForReference = getReference(Patient.class.getTypeName(), scheduleMedicationRequest.getPatientUuid()); - Reference openmrsByReference = getReference(Provider.class.getTypeName(), scheduleMedicationRequest.getProviderUuid()); + Reference openmrsForReference = getReference(Patient.class.getTypeName(), request.getPatientUuid()); + Reference openmrsByReference = getReference(Provider.class.getTypeName(), request.getProviderUuid()); schedule.setForReference(openmrsForReference); schedule.setByReference(openmrsByReference); - schedule.setStartDate(drugOrder.getEffectiveStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); - schedule.setEndDate(drugOrder.getEffectiveStopDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + schedule.setStartDate(convertDateToLocalDateTime(drugOrder.getEffectiveStartDate())); + schedule.setEndDate(convertDateToLocalDateTime(drugOrder.getEffectiveStopDate())); schedule.setServiceType(medicationRequestServiceType); schedule.setOrder(drugOrder); schedule.setActive(true); @@ -55,14 +56,6 @@ public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest schedu private Reference getReference(String type, String targetUuid) { Optional reference = referenceService.getReferenceByTypeAndTargetUUID(type, targetUuid); - if(reference.isPresent()) - return reference.get(); - - Reference openmrsReference = new Reference(); - openmrsReference.setType(type); - openmrsReference.setTargetUuid(targetUuid); - openmrsReference.setName(type + "/" + targetUuid); - - return openmrsReference; + return reference.orElseGet(() -> new Reference(type, targetUuid)); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 028b258..893fdbe 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -1,9 +1,12 @@ package org.openmrs.module.ipd.service.impl; import org.openmrs.Concept; +import org.openmrs.Patient; import org.openmrs.api.ConceptService; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.ReferenceService; import org.openmrs.module.ipd.api.service.ScheduleService; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; @@ -29,14 +32,17 @@ public class IPDScheduleServiceImpl implements IPDScheduleService { private final SlotTimeCreationService slotTimeCreationService; private final ConceptService conceptService; + private final ReferenceService referenceService; + @Autowired - public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory scheduleFactory, SlotFactory slotFactory, SlotService slotService, SlotTimeCreationService slotTimeCreationService, ConceptService conceptService) { + public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory scheduleFactory, SlotFactory slotFactory, SlotService slotService, SlotTimeCreationService slotTimeCreationService, ConceptService conceptService, ReferenceService referenceService) { this.scheduleService = scheduleService; this.scheduleFactory = scheduleFactory; this.slotFactory = slotFactory; this.slotService = slotService; this.slotTimeCreationService = slotTimeCreationService; this.conceptService = conceptService; + this.referenceService = referenceService; } @Override @@ -54,6 +60,7 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat @Override public List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate) { Concept concept = conceptService.getConceptByName(serviceType); - return slotService.getSlotByForReferenceAndForDateAndServiceType(patientUuid, forDate, concept); + Reference reference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid).get(); + return slotService.getSlotByForReferenceIdAndForDateAndServiceType(reference, forDate, concept); } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java b/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java deleted file mode 100644 index b8228b3..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/util/DateTimeUtil.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.openmrs.module.ipd.util; - -import java.time.*; - -public class DateTimeUtil { - public static LocalDateTime convertUTCToLocalTimeZone(long utcTime) { - return Instant.ofEpochSecond(utcTime).atZone(ZoneOffset.systemDefault()).toLocalDateTime(); - } - - public static long convertLocalTimeToUTCEpoc(LocalDateTime localDateTime) { - return localDateTime.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toEpochSecond(); - } - - public static long convertLocalTimeToEpoc(LocalDate localDate) { - return localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toEpochSecond(); - } -} \ No newline at end of file diff --git a/omod/src/test/resources/webModuleApplicationContext.xml b/omod/src/test/resources/webModuleApplicationContext.xml index ca1219e..1a906f3 100644 --- a/omod/src/test/resources/webModuleApplicationContext.xml +++ b/omod/src/test/resources/webModuleApplicationContext.xml @@ -6,6 +6,6 @@ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - + \ No newline at end of file From 46ea8ceb2a0546a669aa0d269b7dbc4d90ea8711 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Mon, 7 Aug 2023 15:26:50 +0530 Subject: [PATCH 12/50] [Ritesh] | 1. Change for reference id to subject reference id and by reference id to actor reference id. 2. Also added pre-condition before adding medication concept for ipd. --- .../openmrs/module/ipd/api/dao/SlotDAO.java | 2 +- .../ipd/api/dao/impl/HibernateSlotDAO.java | 6 ++--- .../module/ipd/api/model/Schedule.java | 12 +++++----- .../module/ipd/api/service/SlotService.java | 2 +- .../ipd/api/service/impl/SlotServiceImpl.java | 4 ++-- api/src/main/resources/liquibase.xml | 22 ++++++++++++++----- .../HibernateScheduleDAOIntegrationTest.java | 17 +++++++------- .../impl/HibernateSlotDAOIntegrationTest.java | 15 ++++++------- .../api/service/impl/SlotServiceImplTest.java | 6 ++--- .../contract/ScheduleMedicationResponse.java | 2 +- .../module/ipd/factory/ScheduleFactory.java | 9 ++++---- .../module/ipd/factory/SlotFactory.java | 2 +- .../service/impl/IPDScheduleServiceImpl.java | 4 +--- 13 files changed, 55 insertions(+), 48 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 09c7ad5..9d99330 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -16,5 +16,5 @@ public interface SlotDAO { Slot saveSlot(Slot slot) throws DAOException; - List getSlotsByForReferenceIdAndForDateAndServiceType(Reference reference, LocalDate forDate, Concept serviceType); + List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 2242efe..1184496 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -39,11 +39,11 @@ public Slot saveSlot(Slot slot) throws DAOException { } @Override - public List getSlotsByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType) { + public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType) { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Slot slot WHERE slot.schedule.forReference=:forReference and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType"); + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType"); - query.setParameter("forReference", forReference); + query.setParameter("subject", subject); query.setParameter("forYear", forDate.getYear()); query.setParameter("forMonth", forDate.getMonthValue()); query.setParameter("forDay", forDate.getDayOfMonth()); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index f52b417..63e495f 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -27,17 +27,19 @@ public class Schedule extends BaseChangeableOpenmrsData { /** * Should we rename it to "subject" + * This can have reference for which the schedule is being created */ @ManyToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "for_reference_id", referencedColumnName = "reference_id", nullable = false) - private Reference forReference; // actor in fhir reference + @JoinColumn(name = "subject_reference_id", referencedColumnName = "reference_id", nullable = false) + private Reference subject; /** - * Should we rename it to "author" + * Should we rename it to "carer/executor/ actor" + * This can have reference which execute the schedule is being created */ @ManyToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "by_reference_id", referencedColumnName = "reference_id", nullable = false) - private Reference byReference; // actor in fhir reference + @JoinColumn(name = "actor_reference_id", referencedColumnName = "reference_id", nullable = false) + private Reference actor; @Column(name = "active", nullable = false) private boolean active = Boolean.TRUE; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index b079de1..60eb1ed 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -19,5 +19,5 @@ public interface SlotService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) Slot saveSlot(Slot slot) throws APIException; - List getSlotByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType); + List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index d9a5749..9306a81 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -42,7 +42,7 @@ public Slot saveSlot(Slot slot) throws APIException { @Override @Transactional(readOnly = true) - public List getSlotByForReferenceIdAndForDateAndServiceType(Reference forReference, LocalDate forDate, Concept serviceType) { - return slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(forReference, forDate, serviceType); + public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType) { + return slotDAO.getSlotsBySubjectReferenceIdAndForDateAndServiceType(subject, forDate, serviceType); } } diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index f98310b..9b708b8 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -14,8 +14,8 @@ - - + + @@ -148,17 +148,22 @@ - - + + + SELECT COUNT(*) FROM concept where short_name='MedicationRequest' and description='MedicationRequest'; + + Add concept Medication Request insert into concept (retired, short_name, description, datatype_id, class_id, is_set, creator, date_created, @@ -171,6 +176,11 @@ + + + SELECT COUNT(*) FROM concept_name where name ='MedicationRequest'; + + Add concept-name Medication Request insert into concept_name (concept_id, name, locale, locale_preferred, creator, date_created, diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java index c2fd234..5db155b 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -14,7 +14,6 @@ import org.openmrs.module.ipd.api.util.DateTimeUtil; import org.springframework.beans.factory.annotation.Autowired; -import java.time.LocalDate; import java.time.LocalDateTime; public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { @@ -37,8 +36,8 @@ public void shouldSaveTheScheduledCreatedForPatientGivenPatientSchedule() { Schedule schedule = new Schedule(); schedule.setOrder(drugOrder); - schedule.setForReference(patientReference); - schedule.setByReference(providerReference); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); schedule.setStartDate(startDate); schedule.setEndDate(endDate); schedule.setServiceType(testConcept); @@ -46,8 +45,8 @@ public void shouldSaveTheScheduledCreatedForPatientGivenPatientSchedule() { Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); Assertions.assertEquals(drugOrder, schedule.getOrder()); - Assertions.assertEquals(patientReference, schedule.getForReference()); - Assertions.assertEquals(providerReference, schedule.getByReference()); + Assertions.assertEquals(patientReference, schedule.getSubject()); + Assertions.assertEquals(providerReference, schedule.getActor()); Assertions.assertEquals(startDate, schedule.getStartDate()); Assertions.assertEquals(endDate, schedule.getEndDate()); Assertions.assertEquals(testConcept, schedule.getServiceType()); @@ -67,8 +66,8 @@ public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { Schedule schedule = new Schedule(); schedule.setOrder(drugOrder); - schedule.setForReference(patientReference); - schedule.setByReference(providerReference); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); schedule.setStartDate(startDate); schedule.setEndDate(endDate); schedule.setServiceType(testConcept); @@ -78,8 +77,8 @@ public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { Schedule scheduleById = scheduleDAO.getSchedule(savedSchedule.getId()); Assertions.assertEquals(drugOrder, scheduleById.getOrder()); - Assertions.assertEquals(patientReference, scheduleById.getForReference()); - Assertions.assertEquals(providerReference, scheduleById.getByReference()); + Assertions.assertEquals(patientReference, scheduleById.getSubject()); + Assertions.assertEquals(providerReference, scheduleById.getActor()); Assertions.assertEquals(startDate, scheduleById.getStartDate()); Assertions.assertEquals(endDate, scheduleById.getEndDate()); Assertions.assertEquals(testConcept, scheduleById.getServiceType()); diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java index 2f3dde6..cee6719 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java @@ -16,7 +16,6 @@ import org.openmrs.module.ipd.api.util.DateTimeUtil; import org.springframework.beans.factory.annotation.Autowired; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -43,8 +42,8 @@ public void shouldSaveTheSlotForPatientGivenPatientSchedule() { Schedule schedule = new Schedule(); schedule.setOrder(drugOrder); - schedule.setForReference(patientReference); - schedule.setByReference(providerReference); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); schedule.setStartDate(startDate); schedule.setEndDate(endDate); schedule.setServiceType(testConcept); @@ -76,8 +75,8 @@ public void shouldGetTheSavedSlotForPatientGivenPatientSchedule() { Schedule schedule = new Schedule(); schedule.setOrder(drugOrder); - schedule.setForReference(patientReference); - schedule.setByReference(providerReference); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); schedule.setStartDate(startDate); schedule.setEndDate(endDate); schedule.setServiceType(testConcept); @@ -110,8 +109,8 @@ public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndForDateAndService Schedule schedule = new Schedule(); schedule.setOrder(drugOrder); - schedule.setForReference(patientReference); - schedule.setByReference(providerReference); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); schedule.setStartDate(startDate); schedule.setEndDate(endDate); schedule.setServiceType(testConcept); @@ -133,7 +132,7 @@ public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndForDateAndService Slot savedSlot1 = slotDAO.saveSlot(slot1); Slot savedSlot2 = slotDAO.saveSlot(slot2); - List slotsAgainstSchedule = slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, slotStartTime.toLocalDate(), testConcept); + List slotsAgainstSchedule = slotDAO.getSlotsBySubjectReferenceIdAndForDateAndServiceType(patientReference, slotStartTime.toLocalDate(), testConcept); Assertions.assertEquals(1, slotsAgainstSchedule.size()); diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java index d429c36..a9e58b4 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java @@ -67,10 +67,10 @@ public void shouldInvokeGetSlotsByForReferenceAndForDateAndServiceTypeWithGivenS Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); - Mockito.when(slotDAO.getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept)).thenReturn(slots); + Mockito.when(slotDAO.getSlotsBySubjectReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept)).thenReturn(slots); - slotService.getSlotByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); + slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); - Mockito.verify(slotDAO, Mockito.times(1)).getSlotsByForReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); + Mockito.verify(slotDAO, Mockito.times(1)).getSlotsBySubjectReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 0d5a712..59120bf 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -24,7 +24,7 @@ public class ScheduleMedicationResponse { public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() .id(schedule.getId()) - .patientUuid(schedule.getForReference().getUuid()) + .patientUuid(schedule.getSubject().getUuid()) .comments(schedule.getComments()) .startDate(convertLocalDateTimeToUTCEpoc(schedule.getStartDate())) .endDate(convertLocalDateTimeToUTCEpoc(schedule.getEndDate())) diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java index c6d37d1..8fa68b0 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java @@ -22,7 +22,6 @@ public class ScheduleFactory { private final OrderService orderService; private final ConceptService conceptService; - private final ReferenceService referenceService; private final String IPD_MEDICATION_SERVICE_TYPE = "MedicationRequest"; @@ -40,11 +39,11 @@ public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest reques DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(request.getOrderUuid()); Concept medicationRequestServiceType = conceptService.getConceptByName(IPD_MEDICATION_SERVICE_TYPE); - Reference openmrsForReference = getReference(Patient.class.getTypeName(), request.getPatientUuid()); - Reference openmrsByReference = getReference(Provider.class.getTypeName(), request.getProviderUuid()); + Reference subject = getReference(Patient.class.getTypeName(), request.getPatientUuid()); + Reference actor = getReference(Provider.class.getTypeName(), request.getProviderUuid()); - schedule.setForReference(openmrsForReference); - schedule.setByReference(openmrsByReference); + schedule.setSubject(subject); + schedule.setActor(actor); schedule.setStartDate(convertDateToLocalDateTime(drugOrder.getEffectiveStartDate())); schedule.setEndDate(convertDateToLocalDateTime(drugOrder.getEffectiveStopDate())); schedule.setServiceType(medicationRequestServiceType); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index 9cce0af..a181172 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -38,7 +38,7 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List { Slot slot = new Slot(); - String patientUuid = savedSchedule.getForReference().getTargetUuid(); + String patientUuid = savedSchedule.getSubject().getTargetUuid(); Patient patient = patientService.getPatientByUuid(patientUuid); BedDetails bedAssignmentDetailsByPatient = bedManagementService.getBedAssignmentDetailsByPatient(patient); if(bedAssignmentDetailsByPatient != null){ diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 893fdbe..90fd0f7 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -31,7 +31,6 @@ public class IPDScheduleServiceImpl implements IPDScheduleService { private final SlotService slotService; private final SlotTimeCreationService slotTimeCreationService; private final ConceptService conceptService; - private final ReferenceService referenceService; @Autowired @@ -47,7 +46,6 @@ public IPDScheduleServiceImpl(ScheduleService scheduleService, ScheduleFactory s @Override public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { - Schedule schedule = scheduleFactory.createScheduleForMedicationFrom(scheduleMedicationRequest); Schedule savedSchedule = scheduleService.saveSchedule(schedule); List slotsStartTime = slotTimeCreationService.createSlotsStartTimeFrom(scheduleMedicationRequest, savedSchedule); @@ -61,6 +59,6 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat public List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate) { Concept concept = conceptService.getConceptByName(serviceType); Reference reference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid).get(); - return slotService.getSlotByForReferenceIdAndForDateAndServiceType(reference, forDate, concept); + return slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(reference, forDate, concept); } } \ No newline at end of file From 7a1b137f07eefae766b3cffa6ad41e44291dfdc7 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Mon, 7 Aug 2023 18:27:23 +0530 Subject: [PATCH 13/50] [Ritesh] | 1. Refactoring ServiceType --- .../module/ipd/api/model/ServiceType.java | 15 ++++++++++++++ .../ipd/controller/IPDScheduleController.java | 20 ++++++++++--------- .../module/ipd/factory/ScheduleFactory.java | 5 ++--- .../module/ipd/factory/SlotFactory.java | 5 ++--- .../ipd/service/IPDScheduleService.java | 3 ++- .../service/impl/IPDScheduleServiceImpl.java | 5 +++-- 6 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java b/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java new file mode 100644 index 0000000..48af776 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java @@ -0,0 +1,15 @@ +package org.openmrs.module.ipd.api.model; + +public enum ServiceType { + MEDICATION_REQUEST("MedicationRequest"); + + private final String conceptName; + + ServiceType(String medicationRequest) { + this.conceptName = medicationRequest; + } + + public String conceptName() { + return conceptName; + } +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 0640635..301c20b 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -15,14 +15,14 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.openmrs.module.ipd.contract.MedicationScheduleResponse.createFrom; +import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; +import static org.openmrs.module.ipd.contract.MedicationScheduleResponse.createFrom; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -40,7 +40,7 @@ public IPDScheduleController(IPDScheduleService ipdScheduleService) { @RequestMapping(value = "type/medication", method = RequestMethod.POST) @ResponseBody - public ResponseEntity createMedicationSchedule(@Valid @RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { + public ResponseEntity createMedicationSchedule(@RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { try { Schedule schedule = ipdScheduleService.saveMedicationSchedule(scheduleMedicationRequest); return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), OK); @@ -52,18 +52,20 @@ public ResponseEntity createMedicationSchedule(@Valid @RequestBody Sched @RequestMapping(value = "type/medication", method = RequestMethod.GET) @ResponseBody - public ResponseEntity getMedicationSchedule(@Valid @RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "serviceType") String serviceType, + public ResponseEntity getMedicationSchedule(@RequestParam(value = "patientUuid") String patientUuid, @RequestParam(value = "forDate") long forDate) { try { LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); - List slots = ipdScheduleService.getMedicationSlots(patientUuid, serviceType, localDate); - Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); - List responses = slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); - return new ResponseEntity<>(responses, OK); + List slots = ipdScheduleService.getMedicationSlots(patientUuid, MEDICATION_REQUEST, localDate); + return new ResponseEntity<>(constructResponse(slots), OK); } catch (Exception e) { log.error("Runtime error while trying to create new schedule", e); return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } + + private List constructResponse(List slots) { + Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); + return slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java index 8fa68b0..3c11a81 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/ScheduleFactory.java @@ -15,6 +15,7 @@ import java.util.Optional; +import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertDateToLocalDateTime; @Component @@ -24,8 +25,6 @@ public class ScheduleFactory { private final ConceptService conceptService; private final ReferenceService referenceService; - private final String IPD_MEDICATION_SERVICE_TYPE = "MedicationRequest"; - @Autowired public ScheduleFactory(OrderService orderService, ConceptService conceptService, ReferenceService referenceService) { this.orderService = orderService; @@ -37,7 +36,7 @@ public Schedule createScheduleForMedicationFrom(ScheduleMedicationRequest reques Schedule schedule = new Schedule(); DrugOrder drugOrder = (DrugOrder) orderService.getOrderByUuid(request.getOrderUuid()); - Concept medicationRequestServiceType = conceptService.getConceptByName(IPD_MEDICATION_SERVICE_TYPE); + Concept medicationRequestServiceType = conceptService.getConceptByName(MEDICATION_REQUEST.conceptName()); Reference subject = getReference(Patient.class.getTypeName(), request.getPatientUuid()); Reference actor = getReference(Provider.class.getTypeName(), request.getProviderUuid()); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index a181172..c07c6fe 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.stream.Collectors; +import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; import static org.openmrs.module.ipd.api.model.Slot.SlotStatus.SCHEDULED; @Component @@ -24,8 +25,6 @@ public class SlotFactory { private final ConceptService conceptService; private final PatientService patientService; - private final String IPD_MEDICATION_SERVICE_TYPE = "MedicationRequest"; - @Autowired public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService) { this.bedManagementService = bedManagementService; @@ -45,7 +44,7 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate); + List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 90fd0f7..0889102 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -5,6 +5,7 @@ import org.openmrs.api.ConceptService; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.ReferenceService; import org.openmrs.module.ipd.api.service.ScheduleService; @@ -56,8 +57,8 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat } @Override - public List getMedicationSlots(String patientUuid, String serviceType, LocalDate forDate) { - Concept concept = conceptService.getConceptByName(serviceType); + public List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate) { + Concept concept = conceptService.getConceptByName(serviceType.conceptName()); Reference reference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid).get(); return slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(reference, forDate, concept); } From 02430d8b1be248d8463c0dcdc0c5d8a22d4fc86f Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Tue, 8 Aug 2023 09:16:05 +0530 Subject: [PATCH 14/50] [Ritesh] | 1. Bug Fix return empty list if now slots are not present for a patient on specific day. --- .../module/ipd/service/impl/IPDScheduleServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 0889102..f022d67 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -20,7 +20,9 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; +import java.util.Optional; @Service @Transactional @@ -59,7 +61,9 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat @Override public List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate) { Concept concept = conceptService.getConceptByName(serviceType.conceptName()); - Reference reference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid).get(); - return slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(reference, forDate, concept); + Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); + if(!subjectReference.isPresent()) + return Collections.emptyList(); + return slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(subjectReference.get(), forDate, concept); } } \ No newline at end of file From a30b0814f895a22e6947a72cab34f0b6a73db104 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Tue, 8 Aug 2023 11:19:12 +0530 Subject: [PATCH 15/50] [Ritesh] | 1. Updated README file --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 7833d3f..aa72fd3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ # openmrs-module-ipd Openmrs module for Bahmni IPD Care and Monitoring + +OpenMRS Module Bahmni-events Backend +================================= +This repository handles Bahmni IPD Care and Monitoring. + +## Packaging +```mvn clean package``` + +### Prerequisite + JDK 1.8 + +## Deploy + +Copy ```openmrs-module-ipd/omod/target/bahmni-ipd-1.0.0-SNAPSHOT.omod``` into OpenMRS modules directory and restart OpenMRS \ No newline at end of file From b22fb92cfe0ebe58f7bb0c3922da3635fd9d5b0c Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Tue, 8 Aug 2023 21:34:04 +0530 Subject: [PATCH 16/50] [Ritesh] | 1. Fixed time zone issue in test --- .../module/ipd/api/util/DateTimeUtilTest.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java b/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java index d437129..88b2a7e 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/util/DateTimeUtilTest.java @@ -7,34 +7,52 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; +import java.util.TimeZone; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class DateTimeUtilTest { @Test public void shouldConvertEPOCUTCToLocalTimeZone() { + ZoneId defaultZoneId = TimeZone.getDefault().toZoneId(); + TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Kolkata"))); + LocalDateTime localDateTime = DateTimeUtil.convertEpocUTCToLocalTimeZone(1690906304); - Assertions.assertEquals(2023,localDateTime.getYear()); - Assertions.assertEquals(8, localDateTime.getMonthValue()); - Assertions.assertEquals(1, localDateTime.getDayOfMonth()); - Assertions.assertEquals(21, localDateTime.getHour()); - Assertions.assertEquals(41, localDateTime.getMinute()); - Assertions.assertEquals(44, localDateTime.getSecond()); + assertEquals(2023,localDateTime.getYear()); + assertEquals(8, localDateTime.getMonthValue()); + assertEquals(1, localDateTime.getDayOfMonth()); + assertEquals(21, localDateTime.getHour()); + assertEquals(41, localDateTime.getMinute()); + assertEquals(44, localDateTime.getSecond()); + + TimeZone.setDefault(TimeZone.getTimeZone(defaultZoneId)); } @Test public void shouldConvertLocalTimeZoneToEPOCUTC() { + ZoneId defaultZoneId = TimeZone.getDefault().toZoneId(); + TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Kolkata"))); + LocalDateTime localDateTime = LocalDateTime.of(2023, 8, 1, 21, 41, 44); long epocUTCTime = DateTimeUtil.convertLocalDateTimeToUTCEpoc(localDateTime); - Assertions.assertEquals(1690906304,epocUTCTime); + assertEquals(1690906304,epocUTCTime); + + TimeZone.setDefault(TimeZone.getTimeZone(defaultZoneId)); } @Test public void shouldConvertDateToLocalDateTime() { + ZoneId defaultZoneId = TimeZone.getDefault().toZoneId(); + TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Kolkata"))); + Date date = Date.from(Instant.ofEpochSecond(1690906304)); LocalDateTime localDateTime = DateTimeUtil.convertDateToLocalDateTime(date); - Assertions.assertEquals(1690906304, localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond()); + assertEquals(1690906304, localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond()); + + TimeZone.setDefault(TimeZone.getTimeZone(defaultZoneId)); } } \ No newline at end of file From 258bcf28435d15e5fef6eb3f3247bcb7474bee2d Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Tue, 8 Aug 2023 21:59:24 +0530 Subject: [PATCH 17/50] add. endpoint to get list of IPD medications scheduled for a patient --- .../module/ipd/api/dao/ScheduleDAO.java | 6 ++++ .../api/dao/impl/HibernateScheduleDAO.java | 20 ++++++++++-- .../ipd/api/service/ScheduleService.java | 6 ++++ .../api/service/impl/ScheduleServiceImpl.java | 9 ++++++ .../HibernateScheduleDAOIntegrationTest.java | 28 ++++++++++++++++ .../service/impl/ScheduleServiceImplTest.java | 32 +++++++++++++++++++ .../contract/ScheduleMedicationResponse.java | 4 +++ .../ipd/controller/IPDScheduleController.java | 15 +++++++++ .../ipd/service/IPDScheduleService.java | 1 + .../service/impl/IPDScheduleServiceImpl.java | 9 ++++++ 10 files changed, 128 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 46ad4da..629d837 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -3,6 +3,10 @@ import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; +import org.openmrs.Concept; +import org.openmrs.module.ipd.api.model.Reference; + +import java.util.List; @Repository public interface ScheduleDAO { @@ -10,4 +14,6 @@ public interface ScheduleDAO { Schedule getSchedule(Integer scheduleId) throws DAOException; Schedule saveSchedule(Schedule schedule) throws DAOException; + + List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 16ea7c5..39bc5c6 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -1,14 +1,19 @@ package org.openmrs.module.ipd.api.dao.impl; -import org.openmrs.module.ipd.api.dao.ScheduleDAO; -import org.openmrs.module.ipd.api.model.Schedule; import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.openmrs.Concept; import org.openmrs.api.db.DAOException; +import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public class HibernateScheduleDAO implements ScheduleDAO { @@ -30,4 +35,15 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { sessionFactory.getCurrentSession().saveOrUpdate(schedule); return schedule; } + + @Override + public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Schedule schedule WHERE schedule.subject=:subject and schedule.serviceType=:serviceType"); + + query.setParameter("subject", subject); + query.setParameter("serviceType", serviceType); + + return query.getResultList(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 7d760ee..a5f188b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -1,10 +1,14 @@ package org.openmrs.module.ipd.api.service; +import org.openmrs.Concept; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public interface ScheduleService extends OpenmrsService { @@ -13,4 +17,6 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; + + List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 24d4159..d7ae19c 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -1,6 +1,8 @@ package org.openmrs.module.ipd.api.service.impl; +import org.openmrs.Concept; import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.service.ScheduleService; import org.openmrs.api.APIException; @@ -11,6 +13,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @Transactional public class ScheduleServiceImpl extends BaseOpenmrsService implements ScheduleService { @@ -34,4 +38,9 @@ public Schedule getSchedule(Integer scheduleId) throws APIException { public Schedule saveSchedule(Schedule schedule) throws APIException { return scheduleDAO.saveSchedule(schedule); } + + @Override + public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException { + return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(subject, serviceType); + } } diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java index 5db155b..bb65813 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDateTime; +import java.util.List; public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { @@ -85,4 +86,31 @@ public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { sessionFactory.getCurrentSession().delete(savedSchedule); } + + @Test + public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceType() { + + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, testConcept); + + Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); + + sessionFactory.getCurrentSession().delete(savedSchedule); + } } \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java index f45bcd6..38c0226 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java @@ -6,8 +6,18 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.openmrs.Concept; +import org.openmrs.ConceptName; +import org.openmrs.Patient; import org.openmrs.module.ipd.api.dao.ScheduleDAO; +import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; @RunWith(MockitoJUnitRunner.class) public class ScheduleServiceImplTest { @@ -42,4 +52,26 @@ public void shouldInvokeGetScheduleWithGivenScheduleId() { Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedule(1); } + + @Test + public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeWithGivenScheduleId() { + Schedule expectedSchedule = new Schedule(); + expectedSchedule.setId(1); + List schedules = new ArrayList<>(); + + LocalDate today = LocalDate.now(); + Concept medicationRequestConcept = new Concept(); + ConceptName conceptName = new ConceptName(); + conceptName.setName("MedicationRequest"); + conceptName.setLocale(Locale.US); + medicationRequestConcept.setFullySpecifiedName(conceptName); + + Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + + Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept)).thenReturn(schedules); + + scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + + Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 59120bf..7210a87 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -6,6 +6,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertLocalDateTimeToUTCEpoc; @@ -20,12 +22,14 @@ public class ScheduleMedicationResponse { private String comments; private long startDate; private long endDate; + private Object order; public static ScheduleMedicationResponse constructFrom(Schedule schedule) { return ScheduleMedicationResponse.builder() .id(schedule.getId()) .patientUuid(schedule.getSubject().getUuid()) .comments(schedule.getComments()) + .order(ConversionUtil.convertToRepresentation(schedule.getOrder(), Representation.REF)) .startDate(convertLocalDateTimeToUTCEpoc(schedule.getStartDate())) .endDate(convertLocalDateTimeToUTCEpoc(schedule.getEndDate())) .build(); diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 301c20b..f91a50a 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -64,6 +64,21 @@ public ResponseEntity getMedicationSchedule(@RequestParam(value = "patie } } + @RequestMapping(value = "type/medication/created", method = RequestMethod.GET) + @ResponseBody + public ResponseEntity getSchedulesCreatedForPatient(@RequestParam(value = "patientUuid") String patientUuid) { + try { + List schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST); + List medicationResponses = schedules.stream() + .map(ScheduleMedicationResponse::constructFrom) + .collect(Collectors.toList()); + return new ResponseEntity<>(medicationResponses, OK); + } catch (Exception e) { + log.error("Runtime error while trying to retrieve schedules created by patient", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); + } + } + private List constructResponse(List slots) { Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); return slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index f5ead13..d89ca92 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -11,4 +11,5 @@ public interface IPDScheduleService { Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate); + List getMedicationSchedules(String patientUuid, ServiceType serviceType); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index f022d67..d977519 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -66,4 +66,13 @@ public List getMedicationSlots(String patientUuid, ServiceType serviceType return Collections.emptyList(); return slotService.getSlotsBySubjectReferenceIdAndForDateAndServiceType(subjectReference.get(), forDate, concept); } + + @Override + public List getMedicationSchedules(String patientUuid, ServiceType serviceType) { + Concept concept = conceptService.getConceptByName(serviceType.conceptName()); + Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); + if(!subjectReference.isPresent()) + return Collections.emptyList(); + return scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(subjectReference.get(), concept); + } } \ No newline at end of file From e14c6f3ad79b304737fd53fde447b11d1e9c1d8c Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Wed, 9 Aug 2023 19:20:29 +0530 Subject: [PATCH 18/50] refactor. endpoint and updated tests in DAO and service classes --- .../module/ipd/api/dao/ScheduleDAO.java | 3 +- .../api/dao/impl/HibernateScheduleDAO.java | 16 +++++++- .../ipd/api/service/ScheduleService.java | 3 +- .../api/service/impl/ScheduleServiceImpl.java | 9 ++++- .../HibernateScheduleDAOIntegrationTest.java | 38 ++++++++++++++++++- .../service/impl/ScheduleServiceImplTest.java | 32 ++++++++++++++-- .../contract/ScheduleMedicationResponse.java | 2 +- .../ipd/controller/IPDScheduleController.java | 17 ++++++--- .../ipd/service/IPDScheduleService.java | 1 + .../service/impl/IPDScheduleServiceImpl.java | 11 +++++- 10 files changed, 113 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 629d837..95255b4 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -15,5 +15,6 @@ public interface ScheduleDAO { Schedule saveSchedule(Schedule schedule) throws DAOException; - List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); + List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws DAOException; + List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 39bc5c6..f3fb8ac 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -37,12 +37,24 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { } @Override - public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) { + public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws DAOException { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Schedule schedule WHERE schedule.subject=:subject and schedule.serviceType=:serviceType"); + .createQuery("FROM Schedule schedule WHERE schedule.subject = :subject AND schedule.serviceType = :serviceType"); + + + query.setParameter("subject", subject); + query.setParameter("serviceType", serviceType); + return query.getResultList(); + } + + @Override + public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Schedule schedule WHERE schedule.subject = :subject AND schedule.serviceType = :serviceType AND schedule.order.uuid IN :orderUuids"); query.setParameter("subject", subject); query.setParameter("serviceType", serviceType); + query.setParameter("orderUuids", orderUuids); return query.getResultList(); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index a5f188b..00e04dc 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -18,5 +18,6 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; - List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); + List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws APIException; + List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index d7ae19c..6967c4f 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -40,7 +40,12 @@ public Schedule saveSchedule(Schedule schedule) throws APIException { } @Override - public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException { - return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(subject, serviceType); + public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws APIException { + return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType); + } + + @Override + public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException { + return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids); } } diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java index bb65813..6df9fd4 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { @@ -87,10 +88,41 @@ public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { sessionFactory.getCurrentSession().delete(savedSchedule); } + @Test + public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceTypeAndOrderUuid() { + + String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setOrder(drugOrder); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + List orderUuidList = new ArrayList<>(); + orderUuidList.add(orderUuid); + + List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, testConcept, orderUuidList); + + Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); + + sessionFactory.getCurrentSession().delete(savedSchedule); + } + @Test public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceType() { - DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); + String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); @@ -106,8 +138,10 @@ public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceType() schedule.setServiceType(testConcept); Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + List orderUuidList = new ArrayList<>(); + orderUuidList.add(orderUuid); - List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, testConcept); + List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, testConcept); Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java index 38c0226..2543f41 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java @@ -12,7 +12,6 @@ import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.api.model.Slot; import java.time.LocalDate; import java.util.ArrayList; @@ -68,10 +67,35 @@ public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeWithGivenSchedul Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); - Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept)).thenReturn(schedules); + Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept)).thenReturn(schedules); - scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept); - Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept); + } + + @Test + public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeAndOrderUuidsWithGivenScheduleId() { + Schedule expectedSchedule = new Schedule(); + expectedSchedule.setId(1); + List schedules = new ArrayList<>(); + + LocalDate today = LocalDate.now(); + Concept medicationRequestConcept = new Concept(); + ConceptName conceptName = new ConceptName(); + conceptName.setName("MedicationRequest"); + conceptName.setLocale(Locale.US); + medicationRequestConcept.setFullySpecifiedName(conceptName); + + List orderUuids = new ArrayList<>(); + orderUuids.add("orderUuid"); + + Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + + Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids)).thenReturn(schedules); + + scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); + + Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java index 7210a87..a5acd23 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationResponse.java @@ -29,7 +29,7 @@ public static ScheduleMedicationResponse constructFrom(Schedule schedule) { .id(schedule.getId()) .patientUuid(schedule.getSubject().getUuid()) .comments(schedule.getComments()) - .order(ConversionUtil.convertToRepresentation(schedule.getOrder(), Representation.REF)) + .order(ConversionUtil.convertToRepresentation(schedule.getOrder(), Representation.REF)) // TODO. Clarify why we need to use REF here with product team .startDate(convertLocalDateTimeToUTCEpoc(schedule.getStartDate())) .endDate(convertLocalDateTimeToUTCEpoc(schedule.getEndDate())) .build(); diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index f91a50a..993de89 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -52,8 +52,8 @@ public ResponseEntity createMedicationSchedule(@RequestBody ScheduleMedi @RequestMapping(value = "type/medication", method = RequestMethod.GET) @ResponseBody - public ResponseEntity getMedicationSchedule(@RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "forDate") long forDate) { + public ResponseEntity getMedicationScheduleByDate(@RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "forDate") long forDate) { try { LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); List slots = ipdScheduleService.getMedicationSlots(patientUuid, MEDICATION_REQUEST, localDate); @@ -64,11 +64,17 @@ public ResponseEntity getMedicationSchedule(@RequestParam(value = "patie } } - @RequestMapping(value = "type/medication/created", method = RequestMethod.GET) + @RequestMapping(value = "type/medication", method = RequestMethod.GET) @ResponseBody - public ResponseEntity getSchedulesCreatedForPatient(@RequestParam(value = "patientUuid") String patientUuid) { + public ResponseEntity getMedicationScheduleByOrderUuids(@RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "orderUuids", required = false) List orderUuids) { try { - List schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST); + List schedules; + if (orderUuids == null || orderUuids.isEmpty()) { + schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST); + } else { + schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST, orderUuids); + } List medicationResponses = schedules.stream() .map(ScheduleMedicationResponse::constructFrom) .collect(Collectors.toList()); @@ -79,6 +85,7 @@ public ResponseEntity getSchedulesCreatedForPatient(@RequestParam(value } } + private List constructResponse(List slots) { Map> slotsBySchedule = slots.stream().collect(Collectors.groupingBy(Slot::getSchedule)); return slotsBySchedule.entrySet().stream().map(entry -> createFrom(entry.getKey(), entry.getValue())).collect(Collectors.toList()); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index d89ca92..21e2ccd 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -12,4 +12,5 @@ public interface IPDScheduleService { Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate); List getMedicationSchedules(String patientUuid, ServiceType serviceType); + List getMedicationSchedules(String patientUuid, ServiceType serviceType, List orderUuids); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index d977519..bdaf659 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -73,6 +73,15 @@ public List getMedicationSchedules(String patientUuid, ServiceType ser Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); if(!subjectReference.isPresent()) return Collections.emptyList(); - return scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(subjectReference.get(), concept); + return scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept); + } + + @Override + public List getMedicationSchedules(String patientUuid, ServiceType serviceType, List orderUuids) { + Concept concept = conceptService.getConceptByName(serviceType.conceptName()); + Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); + if(!subjectReference.isPresent()) + return Collections.emptyList(); + return scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); } } \ No newline at end of file From bf25de2e0103d6db1e479905d356e62d9dff8491 Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Mon, 21 Aug 2023 15:11:49 +0530 Subject: [PATCH 19/50] refactor. namings for schedule DAO methods --- .../java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java | 2 +- .../module/ipd/api/dao/impl/HibernateScheduleDAO.java | 3 +-- .../org/openmrs/module/ipd/api/service/ScheduleService.java | 2 +- .../module/ipd/api/service/impl/ScheduleServiceImpl.java | 4 ++-- .../api/dao/impl/HibernateScheduleDAOIntegrationTest.java | 2 +- .../ipd/api/service/impl/ScheduleServiceImplTest.java | 6 +++--- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 95255b4..d8aa917 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -15,6 +15,6 @@ public interface ScheduleDAO { Schedule saveSchedule(Schedule schedule) throws DAOException; - List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws DAOException; + List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws DAOException; List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index f3fb8ac..1dc8e29 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -36,8 +36,7 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { return schedule; } - @Override - public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws DAOException { + public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws DAOException { Query query = sessionFactory.getCurrentSession() .createQuery("FROM Schedule schedule WHERE schedule.subject = :subject AND schedule.serviceType = :serviceType"); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 00e04dc..97b4e04 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -18,6 +18,6 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; - List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws APIException; + List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException; List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 6967c4f..a1cdb07 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -40,8 +40,8 @@ public Schedule saveSchedule(Schedule schedule) throws APIException { } @Override - public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType) throws APIException { - return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType); + public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException { + return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(subject, serviceType); } @Override diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java index 6df9fd4..7d2484e 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -141,7 +141,7 @@ public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceType() List orderUuidList = new ArrayList<>(); orderUuidList.add(orderUuid); - List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, testConcept); + List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, testConcept); Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java index 2543f41..0c6ea86 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java @@ -67,11 +67,11 @@ public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeWithGivenSchedul Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); - Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept)).thenReturn(schedules); + Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept)).thenReturn(schedules); - scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept); + scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); - Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept); + Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); } @Test From c95019ca682b738d84c22a80903d5dedd2608357 Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Tue, 22 Aug 2023 11:29:02 +0530 Subject: [PATCH 20/50] fix. test failures in ScheduleImpl --- .../openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index bdaf659..e93bf57 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -73,7 +73,7 @@ public List getMedicationSchedules(String patientUuid, ServiceType ser Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); if(!subjectReference.isPresent()) return Collections.emptyList(); - return scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept); + return scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(subjectReference.get(), concept); } @Override From d04db9bf9c64230b4bd6529857f10ffac62555cd Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Mon, 20 Nov 2023 21:26:59 +0530 Subject: [PATCH 21/50] add. changes to create one schedule for a patient --- .../module/ipd/api/dao/ScheduleDAO.java | 3 +++ .../api/dao/impl/HibernateScheduleDAO.java | 11 ++++++++ .../module/ipd/api/model/Schedule.java | 6 ++--- .../openmrs/module/ipd/api/model/Slot.java | 7 ++++- .../ipd/api/service/ScheduleService.java | 3 +++ .../api/service/impl/ScheduleServiceImpl.java | 6 +++++ api/src/main/resources/liquibase.xml | 15 +++++++++++ .../contract/MedicationScheduleResponse.java | 4 +-- .../contract/ScheduleMedicationResponse.java | 2 +- .../module/ipd/factory/ScheduleFactory.java | 18 +++++-------- .../module/ipd/factory/SlotFactory.java | 4 ++- .../service/impl/IPDScheduleServiceImpl.java | 27 +++++++++++++++---- .../service/impl/SlotTimeCreationService.java | 4 +-- 13 files changed, 83 insertions(+), 27 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index d8aa917..db117c3 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -1,5 +1,6 @@ package org.openmrs.module.ipd.api.dao; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.db.DAOException; import org.springframework.stereotype.Repository; @@ -17,4 +18,6 @@ public interface ScheduleDAO { List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws DAOException; List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException; + + Schedule getScheduleByVisit(Visit visit); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 1dc8e29..ad69e40 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -3,6 +3,7 @@ import org.hibernate.SessionFactory; import org.hibernate.query.Query; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.api.db.DAOException; import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Reference; @@ -57,4 +58,14 @@ public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuid return query.getResultList(); } + + @Override + public Schedule getScheduleByVisit(Visit visit) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Schedule schedule WHERE schedule.visit = :visit AND active = 1"); + + query.setParameter("visit", visit); + + return (Schedule) query.uniqueResult(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index 63e495f..04a6e34 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -5,7 +5,7 @@ import lombok.NoArgsConstructor; import org.openmrs.BaseChangeableOpenmrsData; import org.openmrs.Concept; -import org.openmrs.Order; +import org.openmrs.Visit; import javax.persistence.*; import java.time.LocalDateTime; @@ -57,8 +57,8 @@ public class Schedule extends BaseChangeableOpenmrsData { private Concept speciality; // null not in use @OneToOne - @JoinColumn(name = "order_id", referencedColumnName = "order_id") - private Order order; + @JoinColumn(name = "visit_id", referencedColumnName = "visit_id") + private Visit visit; @Column(name = "start_date", nullable = false) private LocalDateTime startDate; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index d5ce4dd..c66791d 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -4,8 +4,9 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.openmrs.BaseChangeableOpenmrsData; -import org.openmrs.Concept; +import org.openmrs.Order; import org.openmrs.Location; +import org.openmrs.Concept; import javax.persistence.*; import java.time.LocalDateTime; @@ -73,6 +74,10 @@ public enum SlotStatus { @ManyToOne @JoinColumn(name = "schedule_id", referencedColumnName = "schedule_id", nullable = false) private Schedule schedule; + + @OneToOne + @JoinColumn(name = "order_id", referencedColumnName = "order_id") + private Order order; /** * The Start Date the Slot diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 97b4e04..2ac981b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.service; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.api.APIException; @@ -20,4 +21,6 @@ public interface ScheduleService extends OpenmrsService { List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException; List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException; + + Schedule getScheduleByVisit(Visit visit); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index a1cdb07..3784125 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.service.impl; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; @@ -48,4 +49,9 @@ public List getSchedulesBySubjectReferenceIdAndServiceType(Reference s public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException { return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids); } + + @Override + public Schedule getScheduleByVisit(Visit visit) { + return scheduleDAO.getScheduleByVisit(visit); + } } diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 9b708b8..d168532 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -189,4 +189,19 @@ 'MedicationRequest', 'en', 1, 1, now(), 'FULLY_SPECIFIED', 0, uuid()); + + + Add visit id and remove order id from schedule table + + ALTER TABLE ipd_schedule ADD COLUMN visit_id INT(11) NULL; + ALTER TABLE ipd_schedule DROP COLUMN order_id; + + + + + Add order id to slot table + + ALTER TABLE ipd_slot ADD COLUMN order_id INT(11) NULL; + + diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index 94f501d..97536f5 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -27,7 +27,6 @@ public class MedicationScheduleResponse { private String comments; private long startDate; private long endDate; - private Object order; private List slots; public static MedicationScheduleResponse createFrom(Schedule schedule, List slots) { @@ -38,7 +37,6 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime) { + public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime, Order drugOrder) { return slotsStartTime.stream().map(slotStartTime -> { Slot slot = new Slot(); @@ -47,6 +48,7 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime = slotTimeCreationService.createSlotsStartTimeFrom(scheduleMedicationRequest, savedSchedule); - slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime) + Patient patient = patientService.getPatientByUuid(scheduleMedicationRequest.getPatientUuid()); + Visit visit = visitService.getActiveVisitsByPatient(patient).get(0); + Schedule savedSchedule = scheduleService.getScheduleByVisit(visit); + if(savedSchedule == null || savedSchedule.getId() == null) { + Schedule schedule = scheduleFactory.createScheduleForMedicationFrom(scheduleMedicationRequest, visit); + savedSchedule = scheduleService.saveSchedule(schedule); + } + DrugOrder order = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); + List slotsStartTime = slotTimeCreationService.createSlotsStartTimeFrom(scheduleMedicationRequest, order); + slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime, order) .forEach(slotService::saveSlot); return savedSchedule; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 489435c..c847369 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -17,9 +17,7 @@ @Component public class SlotTimeCreationService { - public List createSlotsStartTimeFrom(ScheduleMedicationRequest request, Schedule savedSchedule) { - DrugOrder order = (DrugOrder) savedSchedule.getOrder(); - + public List createSlotsStartTimeFrom(ScheduleMedicationRequest request, DrugOrder order) { if (request.getSlotStartTimeAsLocaltime() != null && request.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { return getSlotsStartTimeWithStartTimeDurationFrequency(request, order); } else if (!CollectionUtils.isEmpty(request.getDayWiseSlotsStartTimeAsLocalTime()) && request.getMedicationFrequency() == FIXED_SCHEDULE_FREQUENCY) { From 49914ba3aceb3e15b3aa4366ccf120a1568f7d28 Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Tue, 21 Nov 2023 09:40:04 +0530 Subject: [PATCH 22/50] update. columns in Schedule and Slot table --- api/src/main/resources/liquibase.xml | 32 ++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index d168532..1740908 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -190,18 +190,32 @@ - - Add visit id and remove order id from schedule table - - ALTER TABLE ipd_schedule ADD COLUMN visit_id INT(11) NULL; - ALTER TABLE ipd_schedule DROP COLUMN order_id; - + + + + + + + + + + + + + + + + + - - Add order id to slot table + - ALTER TABLE ipd_slot ADD COLUMN order_id INT(11) NULL; + ALTER TABLE ipd_schedule MODIFY COLUMN end_date datetime NULL; From ab1f30ccac9453daa2123cb30890fb79c74f9b4a Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Tue, 21 Nov 2023 14:19:33 +0530 Subject: [PATCH 23/50] update. set end date as null --- .../openmrs/module/ipd/api/model/Schedule.java | 2 +- .../contract/MedicationScheduleResponse.java | 4 ++-- .../contract/ScheduleMedicationResponse.java | 18 ++++++++---------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index 04a6e34..cbaa429 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -63,7 +63,7 @@ public class Schedule extends BaseChangeableOpenmrsData { @Column(name = "start_date", nullable = false) private LocalDateTime startDate; - @Column(name = "end_date", nullable = false) + @Column(name = "end_date") private LocalDateTime endDate; @Column(name = "comments") diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index 97536f5..230ad3f 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -26,7 +26,7 @@ public class MedicationScheduleResponse { private String serviceType; private String comments; private long startDate; - private long endDate; + private Object endDate; private List slots; public static MedicationScheduleResponse createFrom(Schedule schedule, List slots) { @@ -36,7 +36,7 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List Date: Tue, 21 Nov 2023 22:25:10 +0530 Subject: [PATCH 24/50] fix tests for Slot and Schedule Hiberate and DAOs. Updated responses for GET calls --- .../module/ipd/api/dao/ScheduleDAO.java | 5 +- .../openmrs/module/ipd/api/dao/SlotDAO.java | 4 + .../api/dao/impl/HibernateScheduleDAO.java | 32 +----- .../ipd/api/dao/impl/HibernateSlotDAO.java | 26 +++++ .../openmrs/module/ipd/api/model/Slot.java | 3 + .../ipd/api/service/ScheduleService.java | 3 - .../module/ipd/api/service/SlotService.java | 5 + .../api/service/impl/ScheduleServiceImpl.java | 10 -- .../ipd/api/service/impl/SlotServiceImpl.java | 10 ++ .../impl/HibernateSlotDAOIntegrationTest.java | 104 +++++++++++++++++- .../service/impl/ScheduleServiceImplTest.java | 44 +------- .../api/service/impl/SlotServiceImplTest.java | 46 ++++++++ .../contract/MedicationScheduleResponse.java | 33 +----- .../ipd/contract/MedicationSlotResponse.java | 37 +++++++ .../ipd/controller/IPDScheduleController.java | 19 ++-- .../ipd/service/IPDScheduleService.java | 4 +- .../service/impl/IPDScheduleServiceImpl.java | 8 +- 17 files changed, 263 insertions(+), 130 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index db117c3..196a23b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -16,8 +16,5 @@ public interface ScheduleDAO { Schedule saveSchedule(Schedule schedule) throws DAOException; - List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws DAOException; - List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException; - - Schedule getScheduleByVisit(Visit visit); + Schedule getScheduleByVisit(Visit visit) throws DAOException; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 9d99330..df03ade 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -17,4 +17,8 @@ public interface SlotDAO { Slot saveSlot(Slot slot) throws DAOException; List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); + + List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); + + List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index ad69e40..617afd7 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -2,19 +2,15 @@ import org.hibernate.SessionFactory; import org.hibernate.query.Query; -import org.openmrs.Concept; import org.openmrs.Visit; import org.openmrs.api.db.DAOException; import org.openmrs.module.ipd.api.dao.ScheduleDAO; -import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public class HibernateScheduleDAO implements ScheduleDAO { @@ -37,32 +33,12 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { return schedule; } - public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws DAOException { - Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Schedule schedule WHERE schedule.subject = :subject AND schedule.serviceType = :serviceType"); - - - query.setParameter("subject", subject); - query.setParameter("serviceType", serviceType); - return query.getResultList(); - } - - @Override - public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws DAOException { - Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Schedule schedule WHERE schedule.subject = :subject AND schedule.serviceType = :serviceType AND schedule.order.uuid IN :orderUuids"); - - query.setParameter("subject", subject); - query.setParameter("serviceType", serviceType); - query.setParameter("orderUuids", orderUuids); - - return query.getResultList(); - } - @Override - public Schedule getScheduleByVisit(Visit visit) { + public Schedule getScheduleByVisit(Visit visit) throws DAOException { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Schedule schedule WHERE schedule.visit = :visit AND active = 1"); + .createQuery("FROM Schedule schedule " + + "WHERE schedule.visit=:visit " + + "and active=1"); query.setParameter("visit", visit); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 1184496..d58259b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -51,4 +51,30 @@ public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference return query.getResultList(); } + + @Override + public List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.serviceType=:serviceType"); + + query.setParameter("subject", subject); + query.setParameter("serviceType", serviceType); + + return query.getResultList(); + } + + @Override + public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Slot slot " + + "WHERE slot.schedule.subject=:subject and " + + "slot.serviceType=:serviceType and" + + " slot.order.uuid IN :orderUuids"); + + query.setParameter("subject", subject); + query.setParameter("serviceType", serviceType); + query.setParameter("orderUuids", orderUuids); + + return query.getResultList(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index c66791d..1c4d173 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -75,6 +75,9 @@ public enum SlotStatus { @JoinColumn(name = "schedule_id", referencedColumnName = "schedule_id", nullable = false) private Schedule schedule; + /** + * Order with respect to the Slot + */ @OneToOne @JoinColumn(name = "order_id", referencedColumnName = "order_id") private Order order; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 2ac981b..3df1903 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -19,8 +19,5 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; - List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException; - List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException; - Schedule getScheduleByVisit(Visit visit); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 60eb1ed..dc3fb56 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -2,6 +2,7 @@ import org.openmrs.Concept; import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; @@ -20,4 +21,8 @@ public interface SlotService extends OpenmrsService { Slot saveSlot(Slot slot) throws APIException; List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); + + List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); + + List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 3784125..f331151 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -40,16 +40,6 @@ public Schedule saveSchedule(Schedule schedule) throws APIException { return scheduleDAO.saveSchedule(schedule); } - @Override - public List getSchedulesBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) throws APIException { - return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(subject, serviceType); - } - - @Override - public List getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) throws APIException { - return scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids); - } - @Override public Schedule getScheduleByVisit(Visit visit) { return scheduleDAO.getScheduleByVisit(visit); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 9306a81..25a33cd 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -45,4 +45,14 @@ public Slot saveSlot(Slot slot) throws APIException { public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType) { return slotDAO.getSlotsBySubjectReferenceIdAndForDateAndServiceType(subject, forDate, serviceType); } + + @Override + public List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) { + return slotDAO.getSlotsBySubjectReferenceIdAndServiceType(subject, serviceType); + } + + @Override + public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) { + return slotDAO.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids); + } } diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java index cee6719..2d26ef5 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAOIntegrationTest.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; public class HibernateSlotDAOIntegrationTest extends BaseIntegrationTest { @@ -41,7 +42,7 @@ public void shouldSaveTheSlotForPatientGivenPatientSchedule() { LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); +// schedule.setOrder(drugOrder); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); @@ -74,7 +75,7 @@ public void shouldGetTheSavedSlotForPatientGivenPatientSchedule() { LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); +// schedule.setOrder(drugOrder); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); @@ -108,7 +109,7 @@ public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndForDateAndService LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); +// schedule.setOrder(drugOrder); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); @@ -140,4 +141,101 @@ public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndForDateAndService sessionFactory.getCurrentSession().delete(savedSlot2); sessionFactory.getCurrentSession().delete(savedSchedule); } + + @Test + public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndServiceTypeAndOrderUuid() { + + String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); + DrugOrder drugOrder2 = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9143"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + LocalDateTime slotStartTime = LocalDateTime.now(); + + Slot slot1 = new Slot(); + slot1.setSchedule(savedSchedule); + slot1.setServiceType(testConcept); + slot1.setStartDateTime(slotStartTime); + slot1.setOrder(drugOrder); + + Slot slot2 = new Slot(); + slot2.setSchedule(savedSchedule); + slot2.setServiceType(testConcept); + slot2.setStartDateTime(slotStartTime.plusDays(1)); + slot2.setOrder(drugOrder2); + + Slot savedSlot1 = slotDAO.saveSlot(slot1); + Slot savedSlot2 = slotDAO.saveSlot(slot2); + + List orderUuidList = new ArrayList<>(); + orderUuidList.add(orderUuid); + + List slotsBySubjectReferenceIdAndServiceTypeAndOrderUuids = slotDAO.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, testConcept, orderUuidList); + + Assertions.assertEquals(1, slotsBySubjectReferenceIdAndServiceTypeAndOrderUuids.size()); + + sessionFactory.getCurrentSession().delete(savedSlot1); + sessionFactory.getCurrentSession().delete(savedSlot2); + sessionFactory.getCurrentSession().delete(savedSchedule); + } + + @Test + public void shouldGetTheSavedSlotsForPatientByForReferenceIdAndServiceType() { + + String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); + DrugOrder drugOrder2 = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9143"); + Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); + Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); + LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); + LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Schedule schedule = new Schedule(); + schedule.setSubject(patientReference); + schedule.setActor(providerReference); + schedule.setStartDate(startDate); + schedule.setEndDate(endDate); + schedule.setServiceType(testConcept); + + Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); + + LocalDateTime slotStartTime = LocalDateTime.now(); + + Slot slot1 = new Slot(); + slot1.setSchedule(savedSchedule); + slot1.setServiceType(testConcept); + slot1.setStartDateTime(slotStartTime); + slot1.setOrder(drugOrder); + + Slot slot2 = new Slot(); + slot2.setSchedule(savedSchedule); + slot2.setServiceType(testConcept); + slot2.setStartDateTime(slotStartTime.plusDays(1)); + slot2.setOrder(drugOrder2); + + Slot savedSlot1 = slotDAO.saveSlot(slot1); + Slot savedSlot2 = slotDAO.saveSlot(slot2); + + List slotsBySubjectReferenceIdAndServiceType = slotDAO.getSlotsBySubjectReferenceIdAndServiceType(patientReference, testConcept); + + Assertions.assertEquals(2, slotsBySubjectReferenceIdAndServiceType.size()); + + sessionFactory.getCurrentSession().delete(savedSlot1); + sessionFactory.getCurrentSession().delete(savedSlot2); + sessionFactory.getCurrentSession().delete(savedSchedule); + } } diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java index 0c6ea86..ee897c3 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImplTest.java @@ -9,6 +9,7 @@ import org.openmrs.Concept; import org.openmrs.ConceptName; import org.openmrs.Patient; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; @@ -53,49 +54,16 @@ public void shouldInvokeGetScheduleWithGivenScheduleId() { } @Test - public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeWithGivenScheduleId() { + public void shouldInvokeGetScheduleWithGivenVisit() { Schedule expectedSchedule = new Schedule(); + Visit visit = new Visit(); expectedSchedule.setId(1); - List schedules = new ArrayList<>(); - LocalDate today = LocalDate.now(); - Concept medicationRequestConcept = new Concept(); - ConceptName conceptName = new ConceptName(); - conceptName.setName("MedicationRequest"); - conceptName.setLocale(Locale.US); - medicationRequestConcept.setFullySpecifiedName(conceptName); + Mockito.when(scheduleDAO.getScheduleByVisit(visit)).thenReturn(expectedSchedule); - Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + scheduleService.getScheduleByVisit(visit); - Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept)).thenReturn(schedules); - - scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); - - Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + Mockito.verify(scheduleDAO, Mockito.times(1)).getScheduleByVisit(visit); } - @Test - public void shouldInvokeGetSchedulesByForReferenceAndServiceTypeAndOrderUuidsWithGivenScheduleId() { - Schedule expectedSchedule = new Schedule(); - expectedSchedule.setId(1); - List schedules = new ArrayList<>(); - - LocalDate today = LocalDate.now(); - Concept medicationRequestConcept = new Concept(); - ConceptName conceptName = new ConceptName(); - conceptName.setName("MedicationRequest"); - conceptName.setLocale(Locale.US); - medicationRequestConcept.setFullySpecifiedName(conceptName); - - List orderUuids = new ArrayList<>(); - orderUuids.add("orderUuid"); - - Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); - - Mockito.when(scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids)).thenReturn(schedules); - - scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); - - Mockito.verify(scheduleDAO, Mockito.times(1)).getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); - } } \ No newline at end of file diff --git a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java index a9e58b4..6e9cdde 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImplTest.java @@ -11,6 +11,7 @@ import org.openmrs.Patient; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; import java.time.LocalDate; @@ -73,4 +74,49 @@ public void shouldInvokeGetSlotsByForReferenceAndForDateAndServiceTypeWithGivenS Mockito.verify(slotDAO, Mockito.times(1)).getSlotsBySubjectReferenceIdAndForDateAndServiceType(patientReference, today, medicationRequestConcept); } + + @Test + public void shouldInvokeGetSlotsByForReferenceAndServiceTypeWithGivenScheduleId() { + List slots = new ArrayList<>(); + + LocalDate today = LocalDate.now(); + Concept medicationRequestConcept = new Concept(); + ConceptName conceptName = new ConceptName(); + conceptName.setName("MedicationRequest"); + conceptName.setLocale(Locale.US); + medicationRequestConcept.setFullySpecifiedName(conceptName); + + Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + + Mockito.when(slotDAO.getSlotsBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept)).thenReturn(slots); + + slotService.getSlotsBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + + Mockito.verify(slotDAO, Mockito.times(1)).getSlotsBySubjectReferenceIdAndServiceType(patientReference, medicationRequestConcept); + } + + @Test + public void shouldInvokeGetSlotsByForReferenceAndServiceTypeAndOrderUuidsWithGivenScheduleId() { + Schedule expectedSchedule = new Schedule(); + expectedSchedule.setId(1); + List slots = new ArrayList<>(); + + LocalDate today = LocalDate.now(); + Concept medicationRequestConcept = new Concept(); + ConceptName conceptName = new ConceptName(); + conceptName.setName("MedicationRequest"); + conceptName.setLocale(Locale.US); + medicationRequestConcept.setFullySpecifiedName(conceptName); + + List orderUuids = new ArrayList<>(); + orderUuids.add("orderUuid"); + + Reference patientReference = new Reference(Patient.class.getTypeName(), "patientUuid"); + + Mockito.when(slotDAO.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids)).thenReturn(slots); + + slotService.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); + + Mockito.verify(slotDAO, Mockito.times(1)).getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, medicationRequestConcept, orderUuids); + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index 230ad3f..80ba08e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -1,14 +1,11 @@ package org.openmrs.module.ipd.contract; -import com.fasterxml.jackson.annotation.JsonAutoDetect; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.webservices.rest.web.ConversionUtil; -import org.openmrs.module.webservices.rest.web.representation.Representation; import java.util.List; import java.util.stream.Collectors; @@ -27,7 +24,7 @@ public class MedicationScheduleResponse { private String comments; private long startDate; private Object endDate; - private List slots; + private List slots; public static MedicationScheduleResponse createFrom(Schedule schedule, List slots) { return MedicationScheduleResponse.builder() @@ -37,32 +34,10 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List createMedicationSchedule(@RequestBody ScheduleMedi @RequestMapping(value = "type/medication", method = RequestMethod.GET, params = {"patientUuid", "forDate"}) @ResponseBody - public ResponseEntity getMedicationScheduleByDate(@RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "forDate") long forDate) { + public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "forDate") long forDate) { try { LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); List slots = ipdScheduleService.getMedicationSlots(patientUuid, MEDICATION_REQUEST, localDate); @@ -66,17 +67,17 @@ public ResponseEntity getMedicationScheduleByDate(@RequestParam(value = @RequestMapping(value = "type/medication", method = RequestMethod.GET, params = {"patientUuid"}) @ResponseBody - public ResponseEntity getMedicationScheduleByOrderUuids(@RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "orderUuids", required = false) List orderUuids) { + public ResponseEntity getMedicationSlotsByOrderUuids(@RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "orderUuids", required = false) List orderUuids) { try { - List schedules; + List slots; if (orderUuids == null || orderUuids.isEmpty()) { - schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST); + slots = ipdScheduleService.getMedicationSlots(patientUuid, MEDICATION_REQUEST); } else { - schedules = ipdScheduleService.getMedicationSchedules(patientUuid, MEDICATION_REQUEST, orderUuids); + slots = ipdScheduleService.getMedicationSlots(patientUuid, MEDICATION_REQUEST, orderUuids); } - List medicationResponses = schedules.stream() - .map(ScheduleMedicationResponse::constructFrom) + List medicationResponses = slots.stream() + .map(MedicationSlotResponse::createFrom) .collect(Collectors.toList()); return new ResponseEntity<>(medicationResponses, OK); } catch (Exception e) { diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index 21e2ccd..50f3ca8 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -11,6 +11,6 @@ public interface IPDScheduleService { Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate); - List getMedicationSchedules(String patientUuid, ServiceType serviceType); - List getMedicationSchedules(String patientUuid, ServiceType serviceType, List orderUuids); + List getMedicationSlots(String patientUuid, ServiceType serviceType); + List getMedicationSlots(String patientUuid, ServiceType serviceType, List orderUuids); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 7981f6b..e7ddbf3 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -85,20 +85,20 @@ public List getMedicationSlots(String patientUuid, ServiceType serviceType } @Override - public List getMedicationSchedules(String patientUuid, ServiceType serviceType) { + public List getMedicationSlots(String patientUuid, ServiceType serviceType) { Concept concept = conceptService.getConceptByName(serviceType.conceptName()); Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); if(!subjectReference.isPresent()) return Collections.emptyList(); - return scheduleService.getSchedulesBySubjectReferenceIdAndServiceType(subjectReference.get(), concept); + return slotService.getSlotsBySubjectReferenceIdAndServiceType(subjectReference.get(), concept); } @Override - public List getMedicationSchedules(String patientUuid, ServiceType serviceType, List orderUuids) { + public List getMedicationSlots(String patientUuid, ServiceType serviceType, List orderUuids) { Concept concept = conceptService.getConceptByName(serviceType.conceptName()); Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); if(!subjectReference.isPresent()) return Collections.emptyList(); - return scheduleService.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); + return slotService.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); } } \ No newline at end of file From e065535226acaac9e81f411b632dc409c34856d3 Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Wed, 22 Nov 2023 15:00:32 +0530 Subject: [PATCH 25/50] fix tests Schedule DAO --- .../api/dao/impl/HibernateScheduleDAO.java | 4 +- .../HibernateScheduleDAOIntegrationTest.java | 92 ++++++++----------- 2 files changed, 42 insertions(+), 54 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 617afd7..5a15768 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -37,8 +37,8 @@ public Schedule saveSchedule(Schedule schedule) throws DAOException { public Schedule getScheduleByVisit(Visit visit) throws DAOException { Query query = sessionFactory.getCurrentSession() .createQuery("FROM Schedule schedule " + - "WHERE schedule.visit=:visit " + - "and active=1"); + "WHERE schedule.visit = :visit " + + "and active = 1"); query.setParameter("visit", visit); diff --git a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java index 7d2484e..a6806e5 100644 --- a/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAOIntegrationTest.java @@ -6,7 +6,9 @@ import org.openmrs.Concept; import org.openmrs.DrugOrder; import org.openmrs.Patient; +import org.openmrs.Visit; import org.openmrs.api.context.Context; +import org.openmrs.api.db.VisitDAO; import org.openmrs.module.ipd.api.BaseIntegrationTest; import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Reference; @@ -15,8 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import java.util.Date; public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { @@ -26,32 +27,37 @@ public class HibernateScheduleDAOIntegrationTest extends BaseIntegrationTest { @Autowired private SessionFactory sessionFactory; + @Autowired + private VisitDAO visitDAO; + @Test public void shouldSaveTheScheduledCreatedForPatientGivenPatientSchedule() { - DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); - LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Patient patient = Context.getPatientService().getPatientByUuid("2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Visit visit = new Visit(); + visit.setPatient(patient); + visit.setStartDatetime(new Date()); + visit.setVisitType(Context.getVisitService().getVisitType(1)); Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); - schedule.setEndDate(endDate); schedule.setServiceType(testConcept); + schedule.setVisit(visit); Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); - Assertions.assertEquals(drugOrder, schedule.getOrder()); Assertions.assertEquals(patientReference, schedule.getSubject()); Assertions.assertEquals(providerReference, schedule.getActor()); Assertions.assertEquals(startDate, schedule.getStartDate()); - Assertions.assertEquals(endDate, schedule.getEndDate()); Assertions.assertEquals(testConcept, schedule.getServiceType()); + Assertions.assertEquals(visit, schedule.getVisit()); sessionFactory.getCurrentSession().delete(savedSchedule); } @@ -64,87 +70,69 @@ public void shouldGetTheSavedScheduledCreatedForPatientGivenPatientSchedule() { Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); - LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + + Patient patient = Context.getPatientService().getPatientByUuid("2c33920f-7aa6-0000-998a-60412d8ff7d5"); + Visit visit = new Visit(); + visit.setPatient(patient); + visit.setStartDatetime(new Date()); + visit.setVisitType(Context.getVisitService().getVisitType(1)); + Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); - schedule.setEndDate(endDate); schedule.setServiceType(testConcept); + schedule.setVisit(visit); Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); Schedule scheduleById = scheduleDAO.getSchedule(savedSchedule.getId()); - Assertions.assertEquals(drugOrder, scheduleById.getOrder()); Assertions.assertEquals(patientReference, scheduleById.getSubject()); Assertions.assertEquals(providerReference, scheduleById.getActor()); Assertions.assertEquals(startDate, scheduleById.getStartDate()); - Assertions.assertEquals(endDate, scheduleById.getEndDate()); Assertions.assertEquals(testConcept, scheduleById.getServiceType()); + Assertions.assertEquals(visit, scheduleById.getVisit()); sessionFactory.getCurrentSession().delete(savedSchedule); } @Test - public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceTypeAndOrderUuid() { + public void shouldGetTheSavedScheduleCreatedForPatientGivenVisit() { - String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; - DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); + DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid("921de0a3-05c4-444a-be03-e01b4c4b9142"); Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); - LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); - - Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); - schedule.setSubject(patientReference); - schedule.setActor(providerReference); - schedule.setStartDate(startDate); - schedule.setEndDate(endDate); - schedule.setServiceType(testConcept); - Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); - List orderUuidList = new ArrayList<>(); - orderUuidList.add(orderUuid); - - List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceTypeAndOrderUuids(patientReference, testConcept, orderUuidList); - - Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); - - sessionFactory.getCurrentSession().delete(savedSchedule); - } - - @Test - public void shouldGetTheSavedSchedulesForPatientByForReferenceIdAndServiceType() { - - String orderUuid = "921de0a3-05c4-444a-be03-e01b4c4b9142"; - DrugOrder drugOrder = (DrugOrder) Context.getOrderService().getOrderByUuid(orderUuid); - Reference patientReference = new Reference(Patient.class.getTypeName(), "2c33920f-7aa6-0000-998a-60412d8ff7d5"); - Reference providerReference = new Reference(Patient.class.getTypeName(), "d869ad24-d2a0-4747-a888-fe55048bb7ce"); - Concept testConcept = Context.getConceptService().getConceptByName("UNKNOWN"); - LocalDateTime startDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStartDate()); - LocalDateTime endDate = DateTimeUtil.convertDateToLocalDateTime(drugOrder.getEffectiveStopDate()); + Visit visit = new Visit(); + visit.setPatient(new Patient(2)); + visit.setStartDatetime(new Date()); + visit.setVisitType(Context.getVisitService().getVisitType(1)); + Visit savedVisit = visitDAO.saveVisit(visit); Schedule schedule = new Schedule(); - schedule.setOrder(drugOrder); + schedule.setDateCreated(new Date()); + schedule.setActive(true); schedule.setSubject(patientReference); schedule.setActor(providerReference); schedule.setStartDate(startDate); - schedule.setEndDate(endDate); schedule.setServiceType(testConcept); + schedule.setVisit(savedVisit); Schedule savedSchedule = scheduleDAO.saveSchedule(schedule); - List orderUuidList = new ArrayList<>(); - orderUuidList.add(orderUuid); - List schedulesBySubjectReferenceIdAndServiceType = scheduleDAO.getSchedulesBySubjectReferenceIdAndServiceType(patientReference, testConcept); + Schedule scheduleByVisit = scheduleDAO.getScheduleByVisit(visit); - Assertions.assertEquals(1, schedulesBySubjectReferenceIdAndServiceType.size()); + Assertions.assertEquals(patientReference, scheduleByVisit.getSubject()); + Assertions.assertEquals(providerReference, scheduleByVisit.getActor()); + Assertions.assertEquals(startDate, scheduleByVisit.getStartDate()); + Assertions.assertEquals(testConcept, scheduleByVisit.getServiceType()); + Assertions.assertEquals(visit, scheduleByVisit.getVisit()); sessionFactory.getCurrentSession().delete(savedSchedule); + sessionFactory.getCurrentSession().delete(savedVisit); } } \ No newline at end of file From 5478304e609d066722b9edb498fbc68637c543ca Mon Sep 17 00:00:00 2001 From: Arjun-Go Date: Wed, 22 Nov 2023 15:19:00 +0530 Subject: [PATCH 26/50] remove unnecessary fields --- .../module/ipd/api/model/Schedule.java | 8 ----- .../openmrs/module/ipd/api/model/Slot.java | 34 ++----------------- 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java index cbaa429..691c24d 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Schedule.java @@ -44,18 +44,10 @@ public class Schedule extends BaseChangeableOpenmrsData { @Column(name = "active", nullable = false) private boolean active = Boolean.TRUE; - @OneToOne - @JoinColumn(name = "service_category_id", referencedColumnName = "concept_id") - private Concept serviceCategory; // null not in use - @OneToOne @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id", nullable = false) private Concept serviceType; - @OneToOne - @JoinColumn(name = "speciality_id", referencedColumnName = "concept_id") - private Concept speciality; // null not in use - @OneToOne @JoinColumn(name = "visit_id", referencedColumnName = "visit_id") private Visit visit; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index 1c4d173..937de6b 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -40,13 +40,6 @@ public enum SlotStatus { @JoinColumn(name = "location_id", referencedColumnName = "location_id") private Location location; // bed location for patient - /** - * The Service Category of the Schedule - */ - @OneToOne - @JoinColumn(name = "service_category_id", referencedColumnName = "concept_id") - private Concept serviceCategory; // null not in use - /** * The Service Type of the Schedule */ @@ -54,20 +47,6 @@ public enum SlotStatus { @JoinColumn(name = "service_type_id", referencedColumnName = "concept_id", nullable = false) private Concept serviceType; // as per schedule service type - /** - * The Speciality of the Schedule - */ - @OneToOne - @JoinColumn(name = "speciality_id", referencedColumnName = "concept_id") - private Concept speciality; // null not in sue - - /** - * The Appointment Type of the Schedule - */ - @OneToOne - @JoinColumn(name = "appointment_type_id", referencedColumnName = "concept_id") - private Concept appointmentType; // null not in use - /** * The entity that belongs to a Schedule */ @@ -87,28 +66,19 @@ public enum SlotStatus { */ @Column(name = "start_date_time", nullable = false) private LocalDateTime startDateTime; // slot start time - + /** * The End Date the Slot */ @Column(name = "end_date_time") private LocalDateTime endDateTime; // can be null for now - - /** - * Any Comment for the Slot - */ - @Column(name = "comments") - private String comments; // null not is use - + /** * The current status of the slot. */ @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) private SlotStatus status = SlotStatus.SCHEDULED; - - @Column(name = "overbooked", nullable = false) - private Boolean overbooked = Boolean.FALSE; // not is use } From 9c7a32c227027972307d6667a16ca99e12a0560e Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Fri, 24 Nov 2023 15:27:28 +0530 Subject: [PATCH 27/50] API Change to accomodate Editable Remaining day slot start time for medication --- .../module/ipd/contract/ScheduleMedicationRequest.java | 5 +++++ .../ipd/service/impl/SlotTimeCreationService.java | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java index c41eced..c7f196d 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/ScheduleMedicationRequest.java @@ -25,6 +25,7 @@ public class ScheduleMedicationRequest { private Long slotStartTime; private List firstDaySlotsStartTime; private List dayWiseSlotsStartTime; + private List remainingDaySlotsStartTime; private MedicationFrequency medicationFrequency; public enum MedicationFrequency { @@ -43,4 +44,8 @@ public List getFirstDaySlotsStartTimeAsLocalTime() { public List getDayWiseSlotsStartTimeAsLocalTime() { return dayWiseSlotsStartTime != null ? dayWiseSlotsStartTime.stream().map(DateTimeUtil::convertEpocUTCToLocalTimeZone).collect(Collectors.toList()) : null; } + + public List getRemainingDaySlotsStartTimeAsLocalTime() { + return remainingDaySlotsStartTime != null ? remainingDaySlotsStartTime.stream().map(DateTimeUtil::convertEpocUTCToLocalTimeZone).collect(Collectors.toList()) : null; + } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index c847369..e1f4fc4 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -49,9 +49,17 @@ private List getSlotsStartTimeWithFixedScheduleFrequency(Schedule numberOfSlotsStartTimeToBeCreated -= initialSlotsToBeAddedForSecondDay.size(); List nextSlotsStartTime = request.getDayWiseSlotsStartTimeAsLocalTime(); + List remainingDaySlotsStartTime = request.getRemainingDaySlotsStartTimeAsLocalTime(); while (numberOfSlotsStartTimeToBeCreated > 0) { nextSlotsStartTime = nextSlotsStartTime.stream().map(slotStartTime -> slotStartTime.plusHours(24)).collect(Collectors.toList()); - if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { + if (!CollectionUtils.isEmpty(remainingDaySlotsStartTime) && numberOfSlotsStartTimeToBeCreated <= remainingDaySlotsStartTime.size()){ + List slotsToBeAddedForRemainingDay = numberOfSlotsStartTimeToBeCreated < remainingDaySlotsStartTime.size() + ? remainingDaySlotsStartTime.subList(0, numberOfSlotsStartTimeToBeCreated) + : remainingDaySlotsStartTime; + numberOfSlotsStartTimeToBeCreated -= slotsToBeAddedForRemainingDay.size(); + slotsStartTime.addAll(slotsToBeAddedForRemainingDay); + } + else if (numberOfSlotsStartTimeToBeCreated >= nextSlotsStartTime.size()) { slotsStartTime.addAll(nextSlotsStartTime); numberOfSlotsStartTimeToBeCreated -= nextSlotsStartTime.size(); } else { From 215fa8dfa51c31f2922d5fd2f78b8081d3ae4ac4 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Wed, 29 Nov 2023 17:23:35 +0530 Subject: [PATCH 28/50] Kavitha|Kalai Add Change for Medication Administration Save --- api/pom.xml | 13 +++ .../openmrs/module/ipd/api/dao/SlotDAO.java | 4 +- .../ipd/api/dao/impl/HibernateSlotDAO.java | 10 ++- .../MedicationAdministrationService.java | 4 + .../ipd/api/service/ReferenceService.java | 3 +- .../module/ipd/api/service/SlotService.java | 3 + .../ipd/api/service/impl/SlotServiceImpl.java | 7 +- omod/pom.xml | 12 +++ .../MedicationAdministrationRequest.java | 23 +++++ .../MedicationAdministrationResponse.java | 37 ++++++++ .../contract/MedicationScheduleResponse.java | 1 - ...IPDMedicationAdministrationController.java | 49 +++++++++++ .../MedicationAdministrationFactory.java | 84 +++++++++++++++++++ .../module/ipd/factory/SlotFactory.java | 9 +- .../IPDMedicationAdministrationService.java | 20 +++++ ...PDMedicationAdministrationServiceImpl.java | 42 ++++++++++ pom.xml | 17 ++++ 17 files changed, 331 insertions(+), 7 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDMedicationAdministrationService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java diff --git a/api/pom.xml b/api/pom.xml index b28f5db..2ce9abc 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -125,6 +125,19 @@ provided + + org.openmrs.module + fhir2-api + provided + + + + org.openmrs.module + fhir2-omod + provided + + + org.openmrs.module webservices.rest-omod-common diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index df03ade..5896222 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -13,7 +13,9 @@ public interface SlotDAO { Slot getSlot(Integer slotId) throws DAOException; - + + Slot getSlotByUUID(String uuid) throws DAOException; + Slot saveSlot(Slot slot) throws DAOException; List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index d58259b..d0225f6 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -2,6 +2,8 @@ import org.hibernate.query.Query; import org.openmrs.Concept; +import org.openmrs.Patient; +import org.openmrs.api.context.Context; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; @@ -31,7 +33,13 @@ public HibernateSlotDAO(SessionFactory sessionFactory) { public Slot getSlot(Integer slotId) throws DAOException { return sessionFactory.getCurrentSession().get(Slot.class, slotId); } - + + @Override + public Slot getSlotByUUID(String uuid) throws DAOException { + Slot s = (Slot)this.sessionFactory.getCurrentSession().createQuery("from Slot s where s.uuid = :uuid").setString("uuid", uuid).uniqueResult(); + return s; + } + @Override public Slot saveSlot(Slot slot) throws DAOException { sessionFactory.getCurrentSession().saveOrUpdate(slot); diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java new file mode 100644 index 0000000..b88e024 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java @@ -0,0 +1,4 @@ +package org.openmrs.module.ipd.api.service; + +public class MedicationAdministrationService { +} diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java index a006d08..1dfea8f 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ReferenceService.java @@ -2,9 +2,7 @@ import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; -import org.openmrs.api.db.DAOException; import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.Slot; import org.springframework.stereotype.Service; import java.util.Optional; @@ -17,4 +15,5 @@ public interface ReferenceService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Reference saveReference(Reference reference) throws APIException; + } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index dc3fb56..468f6b1 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -17,6 +17,9 @@ public interface SlotService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) Slot getSlot(Integer slotId) throws APIException; + // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) + Slot getSlotByUUID(String uuid) throws APIException; + // @Authorized({ PrivilegeConstants.EDIT_IPD_SLOTS }) Slot saveSlot(Slot slot) throws APIException; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 25a33cd..318d39d 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -34,7 +34,12 @@ public SlotServiceImpl(SlotDAO slotDAO) { public Slot getSlot(Integer slotId) throws APIException { return slotDAO.getSlot(slotId); } - + + @Override + public Slot getSlotByUUID(String uuid) throws APIException { + return slotDAO.getSlotByUUID(uuid); + } + @Override public Slot saveSlot(Slot slot) throws APIException { return slotDAO.saveSlot(slot); diff --git a/omod/pom.xml b/omod/pom.xml index ff83e3b..4108bf9 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -111,6 +111,18 @@ provided + + org.openmrs.module + fhir2-api + provided + + + + org.openmrs.module + fhir2-omod + provided + + org.openmrs.test openmrs-test diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java new file mode 100644 index 0000000..1fca12e --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -0,0 +1,23 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MedicationAdministrationRequest { + + private String patientUuid; + private String orderUuid; + private String providerUuid; + private String notes; + private String status; + private String slotUuid; + private Date effectiveDateTime; +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java new file mode 100644 index 0000000..7970a91 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -0,0 +1,37 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hl7.fhir.r4.model.MedicationAdministration; +import org.hl7.fhir.r4.model.Reference; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.factory.SlotFactory; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertLocalDateTimeToUTCEpoc; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MedicationAdministrationResponse { + + private String uuid; + private String notes; + private Date effectiveDateTime; + private Object order; + private String status; + private Object slot; + private String patientUuid; + private String providerUuid; + +} + diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java index 80ba08e..e0b10e3 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationScheduleResponse.java @@ -38,6 +38,5 @@ public static MedicationScheduleResponse createFrom(Schedule schedule, List createMedicationAdministration(@RequestBody MedicationAdministrationRequest medicationAdministrationRequest) { + try { + MedicationAdministrationResponse medicationAdministrationResponse = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequest); + return new ResponseEntity<>(medicationAdministrationResponse, OK); + } catch (Exception e) { + log.error("Runtime error while trying to create new schedule", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); + } + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java new file mode 100644 index 0000000..12f154c --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -0,0 +1,84 @@ +package org.openmrs.module.ipd.factory; + +import org.hl7.fhir.r4.model.*; +import org.openmrs.api.ConceptService; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.openmrs.module.ipd.api.service.SlotService; +import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; +import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + + +@Component +public class MedicationAdministrationFactory { + + private final ConceptService conceptService; + private final ReferenceService referenceService; + private SlotService slotService; + + @Autowired + public MedicationAdministrationFactory(ConceptService conceptService, ReferenceService referenceService,SlotService slotService) { + this.conceptService = conceptService; + this.referenceService = referenceService; + this.slotService = slotService; + } + + public MedicationAdministration createMedicationAdministrationFrom(MedicationAdministrationRequest request) { + MedicationAdministration medicationAdministration = new MedicationAdministration(); + + medicationAdministration.setEffective(new DateTimeType(request.getEffectiveDateTime())); + + medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.valueOf(request.getStatus())); + medicationAdministration + .setSubject(new Reference("Patient/"+request.getPatientUuid())); + + MedicationAdministration.MedicationAdministrationPerformerComponent performer= new MedicationAdministration.MedicationAdministrationPerformerComponent(); + performer.setActor(new Reference("Provider/"+request.getProviderUuid())); + List performers=new ArrayList<>(); + performers.add(performer); + medicationAdministration.setPerformer(performers); + + medicationAdministration.setRequest(new Reference("MedicationRequest/"+request.getOrderUuid())); + + Annotation annotation= new Annotation(new MarkdownType(request.getNotes())); + List annotations= new ArrayList<>(); + annotations.add(annotation); + medicationAdministration.setNote(annotations); + + List supportedInfo= new ArrayList<>(); + supportedInfo.add(new Reference("Slot/"+request.getSlotUuid())); + + return medicationAdministration; + } + + public MedicationAdministrationResponse createFrom(MedicationAdministration medicationAdministration) { + String patientUuid = null; + String providerUuid = null; + String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; + if(medicationAdministration.getSubject() !=null){ + patientUuid = medicationAdministration.getSubject().getReference().split("/")[1]; + } + if(medicationAdministration.getPerformer() !=null){ + providerUuid = medicationAdministration.getPerformer().get(0).getActor().getReference().split("/")[1]; + } + return MedicationAdministrationResponse.builder() + .uuid(medicationAdministration.getId()) + .notes(medicationAdministration.getNote().get(0).getText()) + .effectiveDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) + .status(medicationAdministration.getStatus().toString()) + .order(ConversionUtil.convertToRepresentation(medicationAdministration.getRequest(), Representation.FULL)) + .slot(ConversionUtil.convertToRepresentation(slotService.getSlotByUUID(slotUuid), Representation.FULL)) + .patientUuid(patientUuid) + .providerUuid(providerUuid) + .build(); + } + + + +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index 9373754..e9e74c8 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -9,6 +9,7 @@ import org.openmrs.module.bedmanagement.service.BedManagementService; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.SlotService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,12 +26,14 @@ public class SlotFactory { private final BedManagementService bedManagementService; private final ConceptService conceptService; private final PatientService patientService; + private final SlotService slotService; @Autowired - public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService) { + public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService,SlotService slotService) { this.bedManagementService = bedManagementService; this.conceptService = conceptService; this.patientService = patientService; + this.slotService = slotService; } public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime, Order drugOrder) { @@ -55,4 +58,8 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List getMedicationAdministrationList(String orderUuid, LocalDate forDate); + +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java new file mode 100644 index 0000000..c550797 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -0,0 +1,42 @@ +package org.openmrs.module.ipd.service.impl; + +import org.hl7.fhir.r4.model.MedicationAdministration; +import org.openmrs.module.fhir2.api.FhirMedicationAdministrationService; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; +import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; +import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; +import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; + + +@Transactional +@Service +public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdministrationService { + + private FhirMedicationAdministrationService fhirMedicationAdministrationService; + private MedicationAdministrationFactory medicationAdministrationFactory; + + public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService,MedicationAdministrationFactory medicationAdministrationFactory){ + this.fhirMedicationAdministrationService=fhirMedicationAdministrationService; + this.medicationAdministrationFactory=medicationAdministrationFactory; + } + + + @Override + public MedicationAdministrationResponse saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { + MedicationAdministration medicationAdministration= medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); + MedicationAdministration savedMedicationAdministration=fhirMedicationAdministrationService.create(medicationAdministration); + return medicationAdministrationFactory.createFrom(savedMedicationAdministration); + } + + @Override + public List getMedicationAdministrationList(String orderUuid, LocalDate forDate) { + return null; + } +} diff --git a/pom.xml b/pom.xml index d5873b0..e4a7eab 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,7 @@ -Xmx1024m 0.7.9 1.18.26 + 1.11.0 @@ -163,6 +164,22 @@ provided + + + org.openmrs.module + fhir2-api + ${openmrsFhir2Version} + provided + + + + org.openmrs.module + fhir2-omod + ${openmrsFhir2Version} + provided + + + org.openmrs.module From 64aa18b17abd6b20f1f8d6622825eb7dd0113f32 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Thu, 30 Nov 2023 17:37:45 +0530 Subject: [PATCH 29/50] Kavitha|Kalai - Medication Administration Create API Changes --- .../MedicationAdministrationResponse.java | 2 +- ...IPDMedicationAdministrationController.java | 4 ++-- .../MedicationAdministrationFactory.java | 21 ++++++++++++------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index 7970a91..3994461 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -27,9 +27,9 @@ public class MedicationAdministrationResponse { private String uuid; private String notes; private Date effectiveDateTime; - private Object order; private String status; private Object slot; + private String orderUuid; private String patientUuid; private String providerUuid; diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index a7c3529..112b95f 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -23,7 +23,7 @@ import static org.springframework.http.HttpStatus.OK; @Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd/schedule") +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd") @Slf4j public class IPDMedicationAdministrationController extends BaseRestController { @@ -35,7 +35,7 @@ public IPDMedicationAdministrationController(IPDMedicationAdministrationService } - @RequestMapping(value = "/medication_administration", method = RequestMethod.POST) + @RequestMapping(value = "/medicationAdministration", method = RequestMethod.POST) @ResponseBody public ResponseEntity createMedicationAdministration(@RequestBody MedicationAdministrationRequest medicationAdministrationRequest) { try { diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 12f154c..0f0d450 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -1,11 +1,17 @@ package org.openmrs.module.ipd.factory; -import org.hl7.fhir.r4.model.*; +import org.hl7.fhir.r4.model.MedicationAdministration; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.Annotation; +import org.hl7.fhir.r4.model.DateTimeType; +import org.hl7.fhir.r4.model.MarkdownType; import org.openmrs.api.ConceptService; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.ReferenceService; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.ipd.contract.MedicationSlotResponse; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; import org.springframework.beans.factory.annotation.Autowired; @@ -34,12 +40,12 @@ public MedicationAdministration createMedicationAdministrationFrom(MedicationAdm medicationAdministration.setEffective(new DateTimeType(request.getEffectiveDateTime())); - medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.valueOf(request.getStatus())); + medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus())); medicationAdministration .setSubject(new Reference("Patient/"+request.getPatientUuid())); MedicationAdministration.MedicationAdministrationPerformerComponent performer= new MedicationAdministration.MedicationAdministrationPerformerComponent(); - performer.setActor(new Reference("Provider/"+request.getProviderUuid())); + performer.setActor(new Reference("Practitioner/"+request.getProviderUuid())); List performers=new ArrayList<>(); performers.add(performer); medicationAdministration.setPerformer(performers); @@ -53,6 +59,7 @@ public MedicationAdministration createMedicationAdministrationFrom(MedicationAdm List supportedInfo= new ArrayList<>(); supportedInfo.add(new Reference("Slot/"+request.getSlotUuid())); + medicationAdministration.setSupportingInformation(supportedInfo); return medicationAdministration; } @@ -61,6 +68,7 @@ public MedicationAdministrationResponse createFrom(MedicationAdministration medi String patientUuid = null; String providerUuid = null; String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; + Slot slot = slotService.getSlotByUUID(slotUuid); if(medicationAdministration.getSubject() !=null){ patientUuid = medicationAdministration.getSubject().getReference().split("/")[1]; } @@ -71,14 +79,13 @@ public MedicationAdministrationResponse createFrom(MedicationAdministration medi .uuid(medicationAdministration.getId()) .notes(medicationAdministration.getNote().get(0).getText()) .effectiveDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) - .status(medicationAdministration.getStatus().toString()) - .order(ConversionUtil.convertToRepresentation(medicationAdministration.getRequest(), Representation.FULL)) - .slot(ConversionUtil.convertToRepresentation(slotService.getSlotByUUID(slotUuid), Representation.FULL)) + .status(medicationAdministration.getStatus().toCode()) + .orderUuid(slot.getOrder().getUuid()) + .slot(MedicationSlotResponse.createFrom(slot)) .patientUuid(patientUuid) .providerUuid(providerUuid) .build(); } - } From 77606dda3df6d05ba15d9a1ed65c11c06ad0b79b Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Fri, 1 Dec 2023 16:05:51 +0530 Subject: [PATCH 30/50] Kavitha|Kalai - Medication Administration Create API Changes --- .../MedicationAdministrationRequest.java | 2 +- .../MedicationAdministrationRequestList.java | 16 +++++++++ .../MedicationAdministrationResponseList.java | 17 +++++++++ ...IPDMedicationAdministrationController.java | 36 ++++++++++++++----- .../IPDMedicationAdministrationService.java | 4 +-- ...PDMedicationAdministrationServiceImpl.java | 25 ++++++++++--- 6 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java index 1fca12e..ac10d5e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -19,5 +19,5 @@ public class MedicationAdministrationRequest { private String notes; private String status; private String slotUuid; - private Date effectiveDateTime; + private Date effectiveDateTime; } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java new file mode 100644 index 0000000..a114b60 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java @@ -0,0 +1,16 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MedicationAdministrationRequestList { + private List medicationAdministrationRequestList; +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java new file mode 100644 index 0000000..5f1f2a3 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java @@ -0,0 +1,17 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MedicationAdministrationResponseList { + + public List medicationAdministrationResponseList; +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index 112b95f..f1d166b 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -2,6 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; @@ -14,11 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.util.List; + +import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -34,15 +37,30 @@ public IPDMedicationAdministrationController(IPDMedicationAdministrationService this.ipdMedicationAdministrationService = ipdMedicationAdministrationService; } + @RequestMapping(value = "/medicationAdministrations", method = RequestMethod.POST) + @ResponseBody + public ResponseEntity createMedicationAdministration(@RequestBody List medicationAdministrationRequestList) { + try { + List medicationAdministrationResponseList = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequestList); + return new ResponseEntity<>(medicationAdministrationResponseList, OK); + } catch (Exception e) { + log.error("Runtime error while trying to create new medicationAdministration", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); + } + } - @RequestMapping(value = "/medicationAdministration", method = RequestMethod.POST) + @RequestMapping(value = "/medicationAdministrations", method = RequestMethod.GET, params = {"patientUuid", "forDate","providerUuid","slotUuid"}) @ResponseBody - public ResponseEntity createMedicationAdministration(@RequestBody MedicationAdministrationRequest medicationAdministrationRequest) { + public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "forDate") long forDate, + @RequestParam(value = "providerUuid") String providerUuid, + @RequestParam (value = "slotUuid")String slotUuid) { try { - MedicationAdministrationResponse medicationAdministrationResponse = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequest); - return new ResponseEntity<>(medicationAdministrationResponse, OK); + LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); + List medicationAdministrationResponseList = ipdMedicationAdministrationService.getMedicationAdministrationList(patientUuid,localDate,providerUuid,slotUuid); + return new ResponseEntity<>(medicationAdministrationResponseList, OK); } catch (Exception e) { - log.error("Runtime error while trying to create new schedule", e); + log.error("Runtime error while fetching medicationAdministrations ", e); return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDMedicationAdministrationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDMedicationAdministrationService.java index 1954545..99fba31 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDMedicationAdministrationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDMedicationAdministrationService.java @@ -13,8 +13,8 @@ public interface IPDMedicationAdministrationService { - MedicationAdministrationResponse saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest); + List saveMedicationAdministration(List medicationAdministrationRequestList); - List getMedicationAdministrationList(String orderUuid, LocalDate forDate); + List getMedicationAdministrationList(String patientUuid,LocalDate forDate,String providerUuid,String slotUuid); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index c550797..c23a2f4 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -1,7 +1,12 @@ package org.openmrs.module.ipd.service.impl; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.param.ReferenceAndListParam; +import ca.uhn.fhir.rest.param.ReferenceOrListParam; +import ca.uhn.fhir.rest.param.ReferenceParam; import org.hl7.fhir.r4.model.MedicationAdministration; import org.openmrs.module.fhir2.api.FhirMedicationAdministrationService; +import org.openmrs.module.fhir2.api.search.param.MedicationAdministrationSearchParams; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; @@ -13,6 +18,7 @@ import java.time.LocalDate; import java.util.List; +import java.util.stream.Collectors; @Transactional @@ -29,14 +35,23 @@ public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationServic @Override - public MedicationAdministrationResponse saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { - MedicationAdministration medicationAdministration= medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); - MedicationAdministration savedMedicationAdministration=fhirMedicationAdministrationService.create(medicationAdministration); - return medicationAdministrationFactory.createFrom(savedMedicationAdministration); + public List saveMedicationAdministration(List medicationAdministrationRequestList) { + + List medicationAdministrationsResponse= medicationAdministrationRequestList.stream(). + map(medicationAdministrationFactory::createMedicationAdministrationFrom). + map(fhirMedicationAdministrationService::create). + map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); + return medicationAdministrationsResponse; } @Override - public List getMedicationAdministrationList(String orderUuid, LocalDate forDate) { + public List getMedicationAdministrationList(String patientUuid, LocalDate forDate, String providerUuid, String slotUuid) { + ReferenceParam patient=new ReferenceParam("Patient","target_uuid",patientUuid); + ReferenceAndListParam subjectReference = new ReferenceAndListParam(); + subjectReference.addValue(new ReferenceOrListParam().add(patient)); + MedicationAdministrationSearchParams medicationAdministrationSearchParams= MedicationAdministrationSearchParams.builder().patientReference(subjectReference).build(); + IBundleProvider response = fhirMedicationAdministrationService.searchForMedicationAdministration(medicationAdministrationSearchParams); return null; } + } From 14e979cd09519cd49263b65a4284dad5aa22ac93 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Fri, 1 Dec 2023 18:10:16 +0530 Subject: [PATCH 31/50] Kavitha, Kalai | refactored patient reference param --- .../service/impl/IPDMedicationAdministrationServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index c23a2f4..a97c22e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -46,7 +46,8 @@ public List saveMedicationAdministration(List< @Override public List getMedicationAdministrationList(String patientUuid, LocalDate forDate, String providerUuid, String slotUuid) { - ReferenceParam patient=new ReferenceParam("Patient","target_uuid",patientUuid); + ReferenceParam patient=new ReferenceParam(); + patient.setValue(patientUuid); ReferenceAndListParam subjectReference = new ReferenceAndListParam(); subjectReference.addValue(new ReferenceOrListParam().add(patient)); MedicationAdministrationSearchParams medicationAdministrationSearchParams= MedicationAdministrationSearchParams.builder().patientReference(subjectReference).build(); From 9cd90b67867ad83d092e1124ac36cf74aa2ce092 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Fri, 1 Dec 2023 19:05:06 +0530 Subject: [PATCH 32/50] Kavitha|Kalai - Medication Administration Create API Changes --- .../ipd/service/impl/IPDMedicationAdministrationServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index a97c22e..67173cf 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -52,6 +52,7 @@ public List getMedicationAdministrationList(St subjectReference.addValue(new ReferenceOrListParam().add(patient)); MedicationAdministrationSearchParams medicationAdministrationSearchParams= MedicationAdministrationSearchParams.builder().patientReference(subjectReference).build(); IBundleProvider response = fhirMedicationAdministrationService.searchForMedicationAdministration(medicationAdministrationSearchParams); + response.getAllResources(); return null; } From 3927a4871e37dabc37d01678575322bba71737b2 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Tue, 12 Dec 2023 15:39:54 +0530 Subject: [PATCH 33/50] Kavitha|Kalai - Medication Administration Create API Changes --- api/pom.xml | 9 +++++ omod/pom.xml | 6 ++++ ...IPDMedicationAdministrationController.java | 12 +++---- ...PDMedicationAdministrationServiceImpl.java | 35 ++++++++++++------- omod/src/main/resources/config.xml | 1 - pom.xml | 7 ++++ 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 2ce9abc..7dfdbee 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -104,14 +104,17 @@ org.openmrs.api openmrs-api + provided org.projectlombok lombok + provided org.openmrs.web openmrs-web + provided org.openmrs.module @@ -137,6 +140,12 @@ provided + + org.bahmni.module + medication-administration-api + provided + + org.openmrs.module diff --git a/omod/pom.xml b/omod/pom.xml index 4108bf9..234d658 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -123,6 +123,12 @@ provided + + org.bahmni.module + medication-administration-api + provided + + org.openmrs.test openmrs-test diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index f1d166b..fdeae89 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -49,14 +49,14 @@ public ResponseEntity createMedicationAdministration(@RequestBody List getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "forDate") long forDate, - @RequestParam(value = "providerUuid") String providerUuid, - @RequestParam (value = "slotUuid")String slotUuid) { + public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid", required = false) String patientUuid, + @RequestParam(value = "forDate", required = false) Long forDate, + @RequestParam(value = "providerUuid", required = false) String providerUuid, + @RequestParam (value = "slotUuid" , required = false)String slotUuid) { try { - LocalDate localDate = convertEpocUTCToLocalTimeZone(forDate).toLocalDate(); + LocalDate localDate = forDate !=null ? convertEpocUTCToLocalTimeZone(forDate).toLocalDate() : null; List medicationAdministrationResponseList = ipdMedicationAdministrationService.getMedicationAdministrationList(patientUuid,localDate,providerUuid,slotUuid); return new ResponseEntity<>(medicationAdministrationResponseList, OK); } catch (Exception e) { diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index 67173cf..e4c62e6 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -4,13 +4,12 @@ import ca.uhn.fhir.rest.param.ReferenceAndListParam; import ca.uhn.fhir.rest.param.ReferenceOrListParam; import ca.uhn.fhir.rest.param.ReferenceParam; +import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.r4.model.MedicationAdministration; -import org.openmrs.module.fhir2.api.FhirMedicationAdministrationService; -import org.openmrs.module.fhir2.api.search.param.MedicationAdministrationSearchParams; -import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.fhir2.apiext.FhirMedicationAdministrationService; +import org.openmrs.module.fhir2.apiext.search.param.MedicationAdministrationSearchParams; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; -import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; import org.springframework.stereotype.Service; @@ -28,16 +27,16 @@ public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdmi private FhirMedicationAdministrationService fhirMedicationAdministrationService; private MedicationAdministrationFactory medicationAdministrationFactory; - public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService,MedicationAdministrationFactory medicationAdministrationFactory){ - this.fhirMedicationAdministrationService=fhirMedicationAdministrationService; - this.medicationAdministrationFactory=medicationAdministrationFactory; + public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, MedicationAdministrationFactory medicationAdministrationFactory) { + this.fhirMedicationAdministrationService = fhirMedicationAdministrationService; + this.medicationAdministrationFactory = medicationAdministrationFactory; } @Override public List saveMedicationAdministration(List medicationAdministrationRequestList) { - List medicationAdministrationsResponse= medicationAdministrationRequestList.stream(). + List medicationAdministrationsResponse = medicationAdministrationRequestList.stream(). map(medicationAdministrationFactory::createMedicationAdministrationFrom). map(fhirMedicationAdministrationService::create). map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); @@ -46,14 +45,24 @@ public List saveMedicationAdministration(List< @Override public List getMedicationAdministrationList(String patientUuid, LocalDate forDate, String providerUuid, String slotUuid) { - ReferenceParam patient=new ReferenceParam(); - patient.setValue(patientUuid); + ReferenceParam patient = new ReferenceParam(); + patient.setValue("Patient/"+patientUuid); ReferenceAndListParam subjectReference = new ReferenceAndListParam(); subjectReference.addValue(new ReferenceOrListParam().add(patient)); - MedicationAdministrationSearchParams medicationAdministrationSearchParams= MedicationAdministrationSearchParams.builder().patientReference(subjectReference).build(); + + ReferenceParam slot = new ReferenceParam(); + patient.setValue("Slot/"+slotUuid); + ReferenceAndListParam supportInfoReference = new ReferenceAndListParam(); + supportInfoReference.addValue(new ReferenceOrListParam().add(patient)); + + + MedicationAdministrationSearchParams medicationAdministrationSearchParams = MedicationAdministrationSearchParams.builder().patientReference(subjectReference).supportingInfoReference(supportInfoReference).build(); IBundleProvider response = fhirMedicationAdministrationService.searchForMedicationAdministration(medicationAdministrationSearchParams); - response.getAllResources(); - return null; + List responseData = response.getAllResources(); + List medicationAdministrationsResponse= responseData.stream(). + map(iBaseResource -> (MedicationAdministration)iBaseResource). + map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); + return medicationAdministrationsResponse; } } diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 067eda0..b6183a5 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -14,7 +14,6 @@ org.bahmni.module.bahmnicore org.openmrs.module.bedmanagement - org.openmrs.module.ipd.api.IPDActivator diff --git a/pom.xml b/pom.xml index e4a7eab..703f471 100644 --- a/pom.xml +++ b/pom.xml @@ -179,6 +179,13 @@ provided + + org.bahmni.module + medication-administration-api + 1.0.0-SNAPSHOT + provided + + From dd0bd15ef00189c96a2aead566994efc206782a5 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Tue, 12 Dec 2023 20:24:27 +0530 Subject: [PATCH 34/50] Kavitha|Kalai - Medication Administration Create API Changes --- .../service/impl/IPDMedicationAdministrationServiceImpl.java | 3 +++ omod/src/main/resources/config.xml | 1 + 2 files changed, 4 insertions(+) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index e4c62e6..fb3a7a9 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -12,6 +12,7 @@ import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,9 +25,11 @@ @Service public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdministrationService { + private FhirMedicationAdministrationService fhirMedicationAdministrationService; private MedicationAdministrationFactory medicationAdministrationFactory; + @Autowired public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, MedicationAdministrationFactory medicationAdministrationFactory) { this.fhirMedicationAdministrationService = fhirMedicationAdministrationService; this.medicationAdministrationFactory = medicationAdministrationFactory; diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index b6183a5..7c18b69 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -13,6 +13,7 @@ org.openmrs.module.webservices.rest org.bahmni.module.bahmnicore org.openmrs.module.bedmanagement + org.bahmni.module.medication-administration org.openmrs.module.ipd.api.IPDActivator From c1ab9700411d5ff920310326c557a22e88e74a15 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Wed, 13 Dec 2023 19:23:03 +0530 Subject: [PATCH 35/50] Kavitha|Kalai - Medication Administration Create API Changes --- api/pom.xml | 2 +- omod/pom.xml | 2 +- .../ipd/factory/MedicationAdministrationFactory.java | 8 ++++---- pom.xml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 7dfdbee..f173c2e 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -141,7 +141,7 @@ - org.bahmni.module + org.openmrs.module medication-administration-api provided diff --git a/omod/pom.xml b/omod/pom.xml index 234d658..4d23b6f 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -124,7 +124,7 @@ - org.bahmni.module + org.openmrs.module medication-administration-api provided diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 0f0d450..70ec36c 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -67,8 +67,8 @@ public MedicationAdministration createMedicationAdministrationFrom(MedicationAdm public MedicationAdministrationResponse createFrom(MedicationAdministration medicationAdministration) { String patientUuid = null; String providerUuid = null; - String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; - Slot slot = slotService.getSlotByUUID(slotUuid); +// String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; +// Slot slot = slotService.getSlotByUUID(slotUuid); if(medicationAdministration.getSubject() !=null){ patientUuid = medicationAdministration.getSubject().getReference().split("/")[1]; } @@ -80,8 +80,8 @@ public MedicationAdministrationResponse createFrom(MedicationAdministration medi .notes(medicationAdministration.getNote().get(0).getText()) .effectiveDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) .status(medicationAdministration.getStatus().toCode()) - .orderUuid(slot.getOrder().getUuid()) - .slot(MedicationSlotResponse.createFrom(slot)) + // .orderUuid(medicationAdministration.getRequest().getReference()) + // .slot(MedicationSlotResponse.createFrom(slot)) .patientUuid(patientUuid) .providerUuid(providerUuid) .build(); diff --git a/pom.xml b/pom.xml index 703f471..557f532 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ - org.bahmni.module + org.openmrs.module medication-administration-api 1.0.0-SNAPSHOT provided From 6fbfa629d68e87d3228bccab51f08949173df05f Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Fri, 15 Dec 2023 20:23:01 +0530 Subject: [PATCH 36/50] Kavitha, Kalai | add medication administration reference in slot db and api --- api/pom.xml | 2 +- .../openmrs/module/ipd/api/model/Slot.java | 13 +++++--- .../MedicationAdministrationService.java | 4 --- api/src/main/resources/liquibase.xml | 10 ++++++ omod/pom.xml | 2 +- .../MedicationAdministrationRequest.java | 10 +++++- .../MedicationAdministrationResponse.java | 27 +++++++++++++++- .../ipd/contract/MedicationSlotResponse.java | 4 +++ ...IPDMedicationAdministrationController.java | 31 +++++++++++++++++-- .../MedicationAdministrationFactory.java | 17 +++++----- .../module/ipd/factory/SlotFactory.java | 17 +++++++++- .../IPDMedicationAdministrationService.java | 4 ++- ...PDMedicationAdministrationServiceImpl.java | 29 ++++++++++++----- pom.xml | 2 +- 14 files changed, 141 insertions(+), 31 deletions(-) delete mode 100644 api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java diff --git a/api/pom.xml b/api/pom.xml index f173c2e..7dfdbee 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -141,7 +141,7 @@ - org.openmrs.module + org.bahmni.module medication-administration-api provided diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index 937de6b..793fe67 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -3,10 +3,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import org.openmrs.BaseChangeableOpenmrsData; -import org.openmrs.Order; -import org.openmrs.Location; -import org.openmrs.Concept; +import org.openmrs.*; +import org.openmrs.module.fhir2.model.MedicationAdministration; import javax.persistence.*; import java.time.LocalDateTime; @@ -79,6 +77,13 @@ public enum SlotStatus { @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) private SlotStatus status = SlotStatus.SCHEDULED; + + /** + * The reference of medication administration if the medication is administered + */ + @OneToOne + @JoinColumn(name = "medication_administration_id", referencedColumnName = "medication_administration_id") + private MedicationAdministration medicationAdministration; } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java deleted file mode 100644 index b88e024..0000000 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/MedicationAdministrationService.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.openmrs.module.ipd.api.service; - -public class MedicationAdministrationService { -} diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 1740908..6fab36e 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -218,4 +218,14 @@ ALTER TABLE ipd_schedule MODIFY COLUMN end_date datetime NULL; + + + + + + + + diff --git a/omod/pom.xml b/omod/pom.xml index 4d23b6f..234d658 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -124,7 +124,7 @@ - org.openmrs.module + org.bahmni.module medication-administration-api provided diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java index ac10d5e..672491c 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -5,8 +5,11 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.Date; +import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; + @Getter @Builder @NoArgsConstructor @@ -19,5 +22,10 @@ public class MedicationAdministrationRequest { private String notes; private String status; private String slotUuid; - private Date effectiveDateTime; + private Long effectiveDateTime; + + public Date getEffectiveDateTimeAsLocaltime() { + return this.effectiveDateTime != null ? new Date(this.effectiveDateTime): null; + } + } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index 3994461..aa07eb0 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -28,10 +28,35 @@ public class MedicationAdministrationResponse { private String notes; private Date effectiveDateTime; private String status; - private Object slot; + private String slotUuid; private String orderUuid; private String patientUuid; private String providerUuid; + public static MedicationAdministrationResponse createFrom(org.openmrs.module.fhir2.model.MedicationAdministration medicationAdministration) { + if (medicationAdministration == null) { + return null; + } + String patientUuid = null; + String providerUuid = null; +// String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; +// Slot slot = slotService.getSlotByUUID(slotUuid); + if (medicationAdministration.getPatient() != null) { + patientUuid = medicationAdministration.getPatient().getUuid(); + } + if (medicationAdministration.getAdminister() != null) { + providerUuid = medicationAdministration.getAdminister().getUuid(); + } + return MedicationAdministrationResponse.builder() + .uuid(medicationAdministration.getUuid()) + .notes(medicationAdministration.getNotes()) + .effectiveDateTime(medicationAdministration.getAdministeredDateTime()) + .status(medicationAdministration.getStatus().getDisplayString()) + // .orderUuid(medicationAdministration.getRequest().getReference()) + // .slot(MedicationSlotResponse.createFrom(slot)) + .patientUuid(patientUuid) + .providerUuid(providerUuid) + .build(); + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java index 5e756bb..f2b4c97 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java @@ -5,7 +5,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hl7.fhir.r4.model.MedicationAdministration; import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; @@ -23,6 +25,7 @@ public class MedicationSlotResponse { private String status; private long startTime; private Object order; + private Object medicationAdministration; public static MedicationSlotResponse createFrom(Slot slot) { return MedicationSlotResponse.builder() @@ -32,6 +35,7 @@ public static MedicationSlotResponse createFrom(Slot slot) { .status(slot.getStatus().name()) .startTime(convertLocalDateTimeToUTCEpoc(slot.getStartDateTime())) .order(ConversionUtil.convertToRepresentation(slot.getOrder(), Representation.FULL)) + .medicationAdministration(MedicationAdministrationResponse.createFrom((slot.getMedicationAdministration()))) .build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index fdeae89..72cedcd 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -1,12 +1,16 @@ package org.openmrs.module.ipd.controller; import lombok.extern.slf4j.Slf4j; +import org.hl7.fhir.r4.model.MedicationAdministration; +import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; +import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; import org.openmrs.module.ipd.service.IPDScheduleService; import org.openmrs.module.webservices.rest.web.RestConstants; @@ -18,6 +22,7 @@ import org.springframework.web.bind.annotation.*; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; @@ -31,17 +36,39 @@ public class IPDMedicationAdministrationController extends BaseRestController { private final IPDMedicationAdministrationService ipdMedicationAdministrationService; + private final SlotService slotService; + private final MedicationAdministrationTranslator medicationAdministrationTranslator; + private final MedicationAdministrationFactory medicationAdministrationFactory; @Autowired - public IPDMedicationAdministrationController(IPDMedicationAdministrationService ipdMedicationAdministrationService) { + public IPDMedicationAdministrationController(IPDMedicationAdministrationService ipdMedicationAdministrationService, + SlotService slotService, + MedicationAdministrationTranslator medicationAdministrationTranslator, + MedicationAdministrationFactory medicationAdministrationFactory) { this.ipdMedicationAdministrationService = ipdMedicationAdministrationService; + this.slotService = slotService; + this.medicationAdministrationTranslator = medicationAdministrationTranslator; + this.medicationAdministrationFactory = medicationAdministrationFactory; } @RequestMapping(value = "/medicationAdministrations", method = RequestMethod.POST) @ResponseBody public ResponseEntity createMedicationAdministration(@RequestBody List medicationAdministrationRequestList) { try { - List medicationAdministrationResponseList = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequestList); + List medicationAdministrationResponseList = new ArrayList<>(); + for (MedicationAdministrationRequest medicationAdministrationRequest : medicationAdministrationRequestList) { + MedicationAdministration medicationAdministration = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequest); + System.out.println("medicationAdministration uuid is ********* "+medicationAdministration.getId()); + Slot slot = slotService.getSlotByUUID(medicationAdministrationRequest.getSlotUuid()); + if(medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)){ + slot.setStatus(Slot.SlotStatus.COMPLETED); + } + slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) medicationAdministrationTranslator.toOpenmrsType(medicationAdministration)); + System.out.println("before saving slot ********* "+slot.getMedicationAdministration().getUuid()); + slotService.saveSlot(slot); + System.out.println("after saving slot ********* "+slot.getMedicationAdministration().getUuid()); + medicationAdministrationResponseList.add(medicationAdministrationFactory.createFrom(medicationAdministration)); + } return new ResponseEntity<>(medicationAdministrationResponseList, OK); } catch (Exception e) { log.error("Runtime error while trying to create new medicationAdministration", e); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 70ec36c..428a8bf 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -6,6 +6,7 @@ import org.hl7.fhir.r4.model.DateTimeType; import org.hl7.fhir.r4.model.MarkdownType; import org.openmrs.api.ConceptService; +import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.ReferenceService; import org.openmrs.module.ipd.api.service.SlotService; @@ -24,21 +25,23 @@ @Component public class MedicationAdministrationFactory { - private final ConceptService conceptService; - private final ReferenceService referenceService; +// private final ConceptService conceptService; +// private final ReferenceService referenceService; private SlotService slotService; + private MedicationAdministrationTranslator medicationAdministrationTranslator; @Autowired - public MedicationAdministrationFactory(ConceptService conceptService, ReferenceService referenceService,SlotService slotService) { - this.conceptService = conceptService; - this.referenceService = referenceService; + public MedicationAdministrationFactory(SlotService slotService, MedicationAdministrationTranslator medicationAdministrationTranslator) { +// this.conceptService = conceptService; +// this.referenceService = referenceService; this.slotService = slotService; + this.medicationAdministrationTranslator = medicationAdministrationTranslator; } public MedicationAdministration createMedicationAdministrationFrom(MedicationAdministrationRequest request) { MedicationAdministration medicationAdministration = new MedicationAdministration(); - medicationAdministration.setEffective(new DateTimeType(request.getEffectiveDateTime())); + medicationAdministration.setEffective(new DateTimeType(request.getEffectiveDateTimeAsLocaltime())); medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus())); medicationAdministration @@ -81,7 +84,7 @@ public MedicationAdministrationResponse createFrom(MedicationAdministration medi .effectiveDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) .status(medicationAdministration.getStatus().toCode()) // .orderUuid(medicationAdministration.getRequest().getReference()) - // .slot(MedicationSlotResponse.createFrom(slot)) +// .slotUuid(slotUuid) .patientUuid(patientUuid) .providerUuid(providerUuid) .build(); diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index e9e74c8..ba6ea82 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -7,6 +7,8 @@ import org.openmrs.api.PatientService; import org.openmrs.module.bedmanagement.BedDetails; import org.openmrs.module.bedmanagement.service.BedManagementService; +import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; +import org.openmrs.module.fhir2.model.MedicationAdministration; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; @@ -27,13 +29,16 @@ public class SlotFactory { private final ConceptService conceptService; private final PatientService patientService; private final SlotService slotService; + private final MedicationAdministrationTranslator medicationAdministrationTranslator; @Autowired - public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService,SlotService slotService) { + public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService,SlotService slotService, + MedicationAdministrationTranslator medicationAdministrationTranslator) { this.bedManagementService = bedManagementService; this.conceptService = conceptService; this.patientService = patientService; this.slotService = slotService; + this.medicationAdministrationTranslator = medicationAdministrationTranslator; } public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime, Order drugOrder) { @@ -62,4 +67,14 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List saveMedicationAdministration(List medicationAdministrationRequestList); +// List saveMedicationAdministration(List medicationAdministrationRequestList); + + MedicationAdministration saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest); List getMedicationAdministrationList(String patientUuid,LocalDate forDate,String providerUuid,String slotUuid); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index fb3a7a9..05cd049 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -8,6 +8,9 @@ import org.hl7.fhir.r4.model.MedicationAdministration; import org.openmrs.module.fhir2.apiext.FhirMedicationAdministrationService; import org.openmrs.module.fhir2.apiext.search.param.MedicationAdministrationSearchParams; +import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; @@ -17,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -28,22 +32,33 @@ public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdmi private FhirMedicationAdministrationService fhirMedicationAdministrationService; private MedicationAdministrationFactory medicationAdministrationFactory; + private SlotService slotService; + private MedicationAdministrationTranslator medicationAdministrationTranslator; @Autowired - public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, MedicationAdministrationFactory medicationAdministrationFactory) { + public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, + MedicationAdministrationFactory medicationAdministrationFactory, + SlotService slotService, + MedicationAdministrationTranslator medicationAdministrationTranslator) { this.fhirMedicationAdministrationService = fhirMedicationAdministrationService; this.medicationAdministrationFactory = medicationAdministrationFactory; + this.slotService = slotService; + this.medicationAdministrationTranslator = medicationAdministrationTranslator; } @Override - public List saveMedicationAdministration(List medicationAdministrationRequestList) { + public MedicationAdministration saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { + +// List medicationAdministrationsResponse = medicationAdministrationRequestList.stream(). +// map(medicationAdministrationFactory::createMedicationAdministrationFrom). +// map(fhirMedicationAdministrationService::create). +// map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); +// return medicationAdministrationsResponse; + MedicationAdministration medicationAdministration = medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); + medicationAdministration = fhirMedicationAdministrationService.create(medicationAdministration); + return medicationAdministration; - List medicationAdministrationsResponse = medicationAdministrationRequestList.stream(). - map(medicationAdministrationFactory::createMedicationAdministrationFrom). - map(fhirMedicationAdministrationService::create). - map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); - return medicationAdministrationsResponse; } @Override diff --git a/pom.xml b/pom.xml index 557f532..703f471 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ - org.openmrs.module + org.bahmni.module medication-administration-api 1.0.0-SNAPSHOT provided From ff0398ec5413fee60387001d0c2c1565c4d4a543 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Sun, 17 Dec 2023 11:22:27 +0530 Subject: [PATCH 37/50] Kavitha|Kalai - Medication Administration Create API Changes --- api/src/main/resources/liquibase.xml | 16 +++++++------- .../MedicationAdministrationResponse.java | 2 +- ...IPDMedicationAdministrationController.java | 22 ++----------------- ...PDMedicationAdministrationServiceImpl.java | 14 +++++++++--- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 6fab36e..b98605c 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -190,14 +190,14 @@ - - - - - - + + + + + + + + diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index aa07eb0..3fcf793 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -28,7 +28,7 @@ public class MedicationAdministrationResponse { private String notes; private Date effectiveDateTime; private String status; - private String slotUuid; + // private String slotUuid; private String orderUuid; private String patientUuid; private String providerUuid; diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index 72cedcd..a43589b 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -2,17 +2,12 @@ import lombok.extern.slf4j.Slf4j; import org.hl7.fhir.r4.model.MedicationAdministration; -import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; -import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.fhir2.apiext.dao.FhirMedicationAdministrationDao; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; -import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; -import org.openmrs.module.ipd.contract.ScheduleMedicationResponse; import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; -import org.openmrs.module.ipd.service.IPDScheduleService; import org.openmrs.module.webservices.rest.web.RestConstants; import org.openmrs.module.webservices.rest.web.RestUtil; import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; @@ -36,18 +31,14 @@ public class IPDMedicationAdministrationController extends BaseRestController { private final IPDMedicationAdministrationService ipdMedicationAdministrationService; - private final SlotService slotService; - private final MedicationAdministrationTranslator medicationAdministrationTranslator; private final MedicationAdministrationFactory medicationAdministrationFactory; @Autowired public IPDMedicationAdministrationController(IPDMedicationAdministrationService ipdMedicationAdministrationService, SlotService slotService, - MedicationAdministrationTranslator medicationAdministrationTranslator, + FhirMedicationAdministrationDao medicationAdministrationDao, MedicationAdministrationFactory medicationAdministrationFactory) { this.ipdMedicationAdministrationService = ipdMedicationAdministrationService; - this.slotService = slotService; - this.medicationAdministrationTranslator = medicationAdministrationTranslator; this.medicationAdministrationFactory = medicationAdministrationFactory; } @@ -58,15 +49,6 @@ public ResponseEntity createMedicationAdministration(@RequestBody List medicationAdministrationResponseList = new ArrayList<>(); for (MedicationAdministrationRequest medicationAdministrationRequest : medicationAdministrationRequestList) { MedicationAdministration medicationAdministration = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequest); - System.out.println("medicationAdministration uuid is ********* "+medicationAdministration.getId()); - Slot slot = slotService.getSlotByUUID(medicationAdministrationRequest.getSlotUuid()); - if(medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)){ - slot.setStatus(Slot.SlotStatus.COMPLETED); - } - slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) medicationAdministrationTranslator.toOpenmrsType(medicationAdministration)); - System.out.println("before saving slot ********* "+slot.getMedicationAdministration().getUuid()); - slotService.saveSlot(slot); - System.out.println("after saving slot ********* "+slot.getMedicationAdministration().getUuid()); medicationAdministrationResponseList.add(medicationAdministrationFactory.createFrom(medicationAdministration)); } return new ResponseEntity<>(medicationAdministrationResponseList, OK); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index 05cd049..0a2aa8b 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -7,6 +7,7 @@ import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.r4.model.MedicationAdministration; import org.openmrs.module.fhir2.apiext.FhirMedicationAdministrationService; +import org.openmrs.module.fhir2.apiext.dao.FhirMedicationAdministrationDao; import org.openmrs.module.fhir2.apiext.search.param.MedicationAdministrationSearchParams; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; import org.openmrs.module.ipd.api.model.Slot; @@ -33,17 +34,17 @@ public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdmi private FhirMedicationAdministrationService fhirMedicationAdministrationService; private MedicationAdministrationFactory medicationAdministrationFactory; private SlotService slotService; - private MedicationAdministrationTranslator medicationAdministrationTranslator; + private FhirMedicationAdministrationDao fhirMedicationAdministrationDao; @Autowired public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, MedicationAdministrationFactory medicationAdministrationFactory, SlotService slotService, - MedicationAdministrationTranslator medicationAdministrationTranslator) { + FhirMedicationAdministrationDao fhirMedicationAdministrationDao) { this.fhirMedicationAdministrationService = fhirMedicationAdministrationService; this.medicationAdministrationFactory = medicationAdministrationFactory; this.slotService = slotService; - this.medicationAdministrationTranslator = medicationAdministrationTranslator; + this.fhirMedicationAdministrationDao = fhirMedicationAdministrationDao; } @@ -57,6 +58,13 @@ public MedicationAdministration saveMedicationAdministration(MedicationAdministr // return medicationAdministrationsResponse; MedicationAdministration medicationAdministration = medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); medicationAdministration = fhirMedicationAdministrationService.create(medicationAdministration); + Slot slot = slotService.getSlotByUUID(medicationAdministrationRequest.getSlotUuid()); + if(medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)){ + slot.setStatus(Slot.SlotStatus.COMPLETED); + } + slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId())); + slotService.saveSlot(slot); + System.out.println("after saving slot ********* "+slot.getMedicationAdministration().getUuid()); return medicationAdministration; } From 491158557eddb1963cad2cb4f053ff71ee16066b Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Mon, 18 Dec 2023 15:27:11 +0530 Subject: [PATCH 38/50] Kavitha, Kalai | added provider mapper and time converter --- .../MedicationAdministrationRequest.java | 5 ++-- .../MedicationAdministrationResponse.java | 29 +++++-------------- .../MedicationAdministrationFactory.java | 27 +++++------------ ...PDMedicationAdministrationServiceImpl.java | 28 +++++++++--------- 4 files changed, 31 insertions(+), 58 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java index 672491c..8e555a6 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -7,8 +7,7 @@ import java.time.LocalDateTime; import java.util.Date; - -import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; +import java.util.concurrent.TimeUnit; @Getter @Builder @@ -25,7 +24,7 @@ public class MedicationAdministrationRequest { private Long effectiveDateTime; public Date getEffectiveDateTimeAsLocaltime() { - return this.effectiveDateTime != null ? new Date(this.effectiveDateTime): null; + return this.effectiveDateTime != null ? new Date(TimeUnit.SECONDS.toMillis(this.effectiveDateTime)): null; } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index 3fcf793..717afe2 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -4,19 +4,12 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hl7.fhir.r4.model.MedicationAdministration; -import org.hl7.fhir.r4.model.Reference; -import org.openmrs.module.ipd.api.model.Schedule; -import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.factory.SlotFactory; +import org.openmrs.api.context.Context; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; -import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertLocalDateTimeToUTCEpoc; +import java.util.Date; @Getter @Builder @@ -26,36 +19,28 @@ public class MedicationAdministrationResponse { private String uuid; private String notes; - private Date effectiveDateTime; + private Date administeredDateTime; private String status; - // private String slotUuid; private String orderUuid; private String patientUuid; - private String providerUuid; + private Object provider; public static MedicationAdministrationResponse createFrom(org.openmrs.module.fhir2.model.MedicationAdministration medicationAdministration) { if (medicationAdministration == null) { return null; } String patientUuid = null; - String providerUuid = null; -// String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; -// Slot slot = slotService.getSlotByUUID(slotUuid); if (medicationAdministration.getPatient() != null) { patientUuid = medicationAdministration.getPatient().getUuid(); } - if (medicationAdministration.getAdminister() != null) { - providerUuid = medicationAdministration.getAdminister().getUuid(); - } return MedicationAdministrationResponse.builder() .uuid(medicationAdministration.getUuid()) .notes(medicationAdministration.getNotes()) - .effectiveDateTime(medicationAdministration.getAdministeredDateTime()) - .status(medicationAdministration.getStatus().getDisplayString()) + .administeredDateTime(medicationAdministration.getAdministeredDateTime()) + .status(medicationAdministration.getStatus().getShortNameInLocale(Context.getLocale()).getName()) // .orderUuid(medicationAdministration.getRequest().getReference()) - // .slot(MedicationSlotResponse.createFrom(slot)) .patientUuid(patientUuid) - .providerUuid(providerUuid) + .provider(ConversionUtil.convertToRepresentation(medicationAdministration.getAdminister(), Representation.REF)) .build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 428a8bf..af51d78 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -5,14 +5,11 @@ import org.hl7.fhir.r4.model.Annotation; import org.hl7.fhir.r4.model.DateTimeType; import org.hl7.fhir.r4.model.MarkdownType; -import org.openmrs.api.ConceptService; +import org.openmrs.Provider; +import org.openmrs.api.context.Context; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; -import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.api.service.ReferenceService; -import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; -import org.openmrs.module.ipd.contract.MedicationSlotResponse; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; import org.springframework.beans.factory.annotation.Autowired; @@ -25,16 +22,10 @@ @Component public class MedicationAdministrationFactory { -// private final ConceptService conceptService; -// private final ReferenceService referenceService; - private SlotService slotService; private MedicationAdministrationTranslator medicationAdministrationTranslator; @Autowired - public MedicationAdministrationFactory(SlotService slotService, MedicationAdministrationTranslator medicationAdministrationTranslator) { -// this.conceptService = conceptService; -// this.referenceService = referenceService; - this.slotService = slotService; + public MedicationAdministrationFactory(MedicationAdministrationTranslator medicationAdministrationTranslator) { this.medicationAdministrationTranslator = medicationAdministrationTranslator; } @@ -69,24 +60,22 @@ public MedicationAdministration createMedicationAdministrationFrom(MedicationAdm public MedicationAdministrationResponse createFrom(MedicationAdministration medicationAdministration) { String patientUuid = null; - String providerUuid = null; -// String slotUuid = medicationAdministration.getSupportingInformation().get(0).getReference().split("/")[1]; -// Slot slot = slotService.getSlotByUUID(slotUuid); + Provider provider = null; + if(medicationAdministration.getSubject() !=null){ patientUuid = medicationAdministration.getSubject().getReference().split("/")[1]; } if(medicationAdministration.getPerformer() !=null){ - providerUuid = medicationAdministration.getPerformer().get(0).getActor().getReference().split("/")[1]; + provider = Context.getProviderService().getProviderByUuid(medicationAdministration.getPerformer().get(0).getActor().getReference().split("/")[1]); } return MedicationAdministrationResponse.builder() .uuid(medicationAdministration.getId()) .notes(medicationAdministration.getNote().get(0).getText()) - .effectiveDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) + .administeredDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) .status(medicationAdministration.getStatus().toCode()) // .orderUuid(medicationAdministration.getRequest().getReference()) -// .slotUuid(slotUuid) .patientUuid(patientUuid) - .providerUuid(providerUuid) + .provider(ConversionUtil.convertToRepresentation(provider, Representation.REF)) .build(); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index 0a2aa8b..59dca37 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -50,22 +50,22 @@ public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationServic @Override public MedicationAdministration saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { - -// List medicationAdministrationsResponse = medicationAdministrationRequestList.stream(). -// map(medicationAdministrationFactory::createMedicationAdministrationFrom). -// map(fhirMedicationAdministrationService::create). -// map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); -// return medicationAdministrationsResponse; - MedicationAdministration medicationAdministration = medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); - medicationAdministration = fhirMedicationAdministrationService.create(medicationAdministration); Slot slot = slotService.getSlotByUUID(medicationAdministrationRequest.getSlotUuid()); - if(medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)){ - slot.setStatus(Slot.SlotStatus.COMPLETED); + + if(slot.getMedicationAdministration() != null){ + return fhirMedicationAdministrationService.get(slot.getMedicationAdministration().getUuid()); + } else { + MedicationAdministration medicationAdministration = medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); + medicationAdministration = fhirMedicationAdministrationService.create(medicationAdministration); + + if (medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)) { + slot.setStatus(Slot.SlotStatus.COMPLETED); + } + slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId())); + slotService.saveSlot(slot); + System.out.println("after saving slot ********* " + slot.getMedicationAdministration().getUuid()); + return medicationAdministration; } - slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId())); - slotService.saveSlot(slot); - System.out.println("after saving slot ********* "+slot.getMedicationAdministration().getUuid()); - return medicationAdministration; } From 1049ce5b49c9e4a48c3fcdf10a2a91ea0149fbc3 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Wed, 27 Dec 2023 06:13:49 +0530 Subject: [PATCH 39/50] Kavitha | add adhoc and refactored scheduled medication administration --- .../module/ipd/api/dao/ScheduleDAO.java | 2 + .../api/dao/impl/HibernateScheduleDAO.java | 7 + .../module/ipd/api/model/ServiceType.java | 4 +- .../openmrs/module/ipd/api/model/Slot.java | 1 - .../ipd/api/service/ScheduleService.java | 2 + .../api/service/impl/ScheduleServiceImpl.java | 6 + api/src/main/resources/liquibase.xml | 48 ++++++ .../MedicationAdministrationNoteRequest.java | 26 ++++ .../MedicationAdministrationNoteResponse.java | 31 ++++ ...icationAdministrationPerformerRequest.java | 21 +++ ...cationAdministrationPerformerResponse.java | 28 ++++ .../MedicationAdministrationRequest.java | 22 ++- .../MedicationAdministrationResponse.java | 72 ++++++--- ...IPDMedicationAdministrationController.java | 42 ++++-- .../MedicationAdministrationFactory.java | 139 ++++++++++++------ .../module/ipd/factory/SlotFactory.java | 30 ++-- .../IPDMedicationAdministrationService.java | 6 +- ...PDMedicationAdministrationServiceImpl.java | 109 +++++++++----- .../service/impl/IPDScheduleServiceImpl.java | 4 +- 19 files changed, 447 insertions(+), 153 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteRequest.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerRequest.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerResponse.java diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 196a23b..f45f966 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -13,6 +13,8 @@ public interface ScheduleDAO { Schedule getSchedule(Integer scheduleId) throws DAOException; + + Schedule getScheduleByUUID(String uuid) throws DAOException; Schedule saveSchedule(Schedule schedule) throws DAOException; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 5a15768..f1730dc 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -6,6 +6,7 @@ import org.openmrs.api.db.DAOException; import org.openmrs.module.ipd.api.dao.ScheduleDAO; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +27,12 @@ public HibernateScheduleDAO(SessionFactory sessionFactory) { public Schedule getSchedule(Integer scheduleId) throws DAOException { return sessionFactory.getCurrentSession().get(Schedule.class, scheduleId); } + + @Override + public Schedule getScheduleByUUID(String uuid) throws DAOException { + Schedule s = (Schedule)this.sessionFactory.getCurrentSession().createQuery("from Schedule s where s.uuid = :uuid").setString("uuid", uuid).uniqueResult(); + return s; + } @Override public Schedule saveSchedule(Schedule schedule) throws DAOException { diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java b/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java index 48af776..651daeb 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/ServiceType.java @@ -1,7 +1,9 @@ package org.openmrs.module.ipd.api.model; public enum ServiceType { - MEDICATION_REQUEST("MedicationRequest"); + MEDICATION_REQUEST("MedicationRequest"), + EMERGENCY_MEDICATION_REQUEST("EmergencyMedicationRequest"), + AS_NEEDED_MEDICATION_REQUEST("AsNeededMedicationRequest"); private final String conceptName; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java index 793fe67..b010ce0 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/Slot.java @@ -4,7 +4,6 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.openmrs.*; -import org.openmrs.module.fhir2.model.MedicationAdministration; import javax.persistence.*; import java.time.LocalDateTime; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 3df1903..3279e50 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -15,6 +15,8 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule getSchedule(Integer scheduleId) throws APIException; + + Schedule getScheduleByUUID(String uuid) throws APIException; // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index f331151..91ca7c2 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -34,6 +34,12 @@ public ScheduleServiceImpl(ScheduleDAO scheduleDAO) { public Schedule getSchedule(Integer scheduleId) throws APIException { return scheduleDAO.getSchedule(scheduleId); } + + @Override + @Transactional(readOnly = true) + public Schedule getScheduleByUUID(String uuid) throws APIException { + return scheduleDAO.getScheduleByUUID(uuid); + } @Override public Schedule saveSchedule(Schedule schedule) throws APIException { diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index b98605c..7088db4 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -228,4 +228,52 @@ referencedTableName="medication_administration" referencedColumnNames="medication_administration_id"/> + + + + SELECT COUNT(*) FROM concept where short_name='EmergencyMedicationRequest' and description='EmergencyMedicationRequest'; + + + SELECT COUNT(*) FROM concept_name where name ='EmergencyMedicationRequest'; + + + Add concept for Emergency Medication Request + + insert into concept (retired, short_name, description, datatype_id, class_id, is_set, creator, date_created, + changed_by, date_changed, uuid) + values (0, 'EmergencyMedicationRequest', 'EmergencyMedicationRequest', + (select concept_datatype_id from concept_datatype where name = 'Text'), + (select concept_class_id from concept_class where name = 'Misc'), + 0, 1, now(), 1, now(), uuid()); + insert into concept_name (concept_id, name, locale, locale_preferred, creator, date_created, + concept_name_type, voided, uuid) + values ((select concept_id from concept where short_name='EmergencyMedicationRequest'), + 'EmergencyMedicationRequest', 'en', 1, 1, now(), 'FULLY_SPECIFIED', 0, uuid()); + + + + + + + SELECT COUNT(*) FROM concept where short_name='AsNeededMedicationRequest' and description='AsNeededMedicationRequest'; + + + SELECT COUNT(*) FROM concept_name where name ='AsNeededMedicationRequest'; + + + Add concept for As Needed Medication Request + + insert into concept (retired, short_name, description, datatype_id, class_id, is_set, creator, date_created, + changed_by, date_changed, uuid) + values (0, 'AsNeededMedicationRequest', 'AsNeededMedicationRequest', + (select concept_datatype_id from concept_datatype where name = 'Text'), + (select concept_class_id from concept_class where name = 'Misc'), + 0, 1, now(), 1, now(), uuid()); + insert into concept_name (concept_id, name, locale, locale_preferred, creator, date_created, + concept_name_type, voided, uuid) + values ((select concept_id from concept where short_name='AsNeededMedicationRequest'), + 'AsNeededMedicationRequest', 'en', 1, 1, now(), 'FULLY_SPECIFIED', 0, uuid()); + + + diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteRequest.java new file mode 100644 index 0000000..87fdd58 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteRequest.java @@ -0,0 +1,26 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties +public class MedicationAdministrationNoteRequest { + private String uuid; + private String authorUuid; + private Long recordedTime; + private String text; + + public Date getRecordedTimeAsLocaltime() { + return this.recordedTime != null ? new Date(TimeUnit.SECONDS.toMillis(this.recordedTime)): new Date(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java new file mode 100644 index 0000000..ad5f876 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java @@ -0,0 +1,31 @@ +package org.openmrs.module.ipd.contract; + +import lombok.*; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.openmrs.module.ipd.api.model.Annotation; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; + +import java.util.Date; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties +public class MedicationAdministrationNoteResponse { + private String uuid; + private Object author; + private Date recordedTime; + private String text; + + public static MedicationAdministrationNoteResponse createFrom(Annotation openmrsAnnotation) { + return MedicationAdministrationNoteResponse.builder() + .uuid(openmrsAnnotation.getUuid()) + .author(ConversionUtil.convertToRepresentation(openmrsAnnotation.getAuthor(), Representation.REF)) + .recordedTime(openmrsAnnotation.getRecordedTime()) + .text(openmrsAnnotation.getText()) + .build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerRequest.java new file mode 100644 index 0000000..c1d5a36 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerRequest.java @@ -0,0 +1,21 @@ +package org.openmrs.module.ipd.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties +public class MedicationAdministrationPerformerRequest { + private String uuid; + private String providerUuid; + private String function; +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerResponse.java new file mode 100644 index 0000000..3b1c1cf --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationPerformerResponse.java @@ -0,0 +1,28 @@ +package org.openmrs.module.ipd.contract; + +import lombok.*; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; +import org.openmrs.module.webservices.rest.web.ConversionUtil; +import org.openmrs.module.webservices.rest.web.representation.Representation; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties +public class MedicationAdministrationPerformerResponse { + private String uuid; + private Object provider; + private String function; + + public static MedicationAdministrationPerformerResponse createFrom(MedicationAdministrationPerformer openmrsMedicationAdministrationPerformer) { + String function = openmrsMedicationAdministrationPerformer.getFunction() != null ? openmrsMedicationAdministrationPerformer.getFunction().getDisplayString() : null; + return MedicationAdministrationPerformerResponse.builder() + .uuid(openmrsMedicationAdministrationPerformer.getUuid()) + .provider(ConversionUtil.convertToRepresentation(openmrsMedicationAdministrationPerformer.getActor(), Representation.REF)) + .function(function) + .build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java index 8e555a6..12757ef 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -5,8 +5,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; import java.util.Date; +import java.util.List; import java.util.concurrent.TimeUnit; @Getter @@ -15,16 +15,26 @@ @AllArgsConstructor public class MedicationAdministrationRequest { + private String uuid; private String patientUuid; + private String encounterUuid; private String orderUuid; - private String providerUuid; - private String notes; + private List providers; + private List notes; private String status; + private String statusReason; + private String drugUuid; + private String dosingInstructions; + private Double dose; + private String doseUnitsUuid; + private String routeUuid; + private String siteUuid; + private Long administeredDateTime; private String slotUuid; - private Long effectiveDateTime; + private String scheduleUuid; - public Date getEffectiveDateTimeAsLocaltime() { - return this.effectiveDateTime != null ? new Date(TimeUnit.SECONDS.toMillis(this.effectiveDateTime)): null; + public Date getAdministeredDateTimeAsLocaltime() { + return this.administeredDateTime != null ? new Date(TimeUnit.SECONDS.toMillis(this.administeredDateTime)): null; } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index 717afe2..c09a1f3 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -1,46 +1,78 @@ package org.openmrs.module.ipd.contract; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.openmrs.api.context.Context; +import org.openmrs.module.ipd.api.model.Annotation; +import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; import java.util.Date; +import java.util.List; @Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor public class MedicationAdministrationResponse { private String uuid; - private String notes; - private Date administeredDateTime; - private String status; - private String orderUuid; private String patientUuid; - private Object provider; + private String encounterUuid; + private String orderUuid; + private List providers; + private List notes; + private String status; + private String statusReason; + private String drugUuid; + private String dosingInstructions; + private Double dose; + private Object doseUnits; + private Object route; + private Object site; + private Date administeredDateTime; - public static MedicationAdministrationResponse createFrom(org.openmrs.module.fhir2.model.MedicationAdministration medicationAdministration) { - if (medicationAdministration == null) { + public static MedicationAdministrationResponse createFrom(org.openmrs.module.ipd.api.model.MedicationAdministration openmrsMedicationAdministration) { + if (openmrsMedicationAdministration == null) { return null; } - String patientUuid = null; - if (medicationAdministration.getPatient() != null) { - patientUuid = medicationAdministration.getPatient().getUuid(); + String status = openmrsMedicationAdministration.getStatus() != null ? openmrsMedicationAdministration.getStatus().getShortNameInLocale(Context.getLocale()).getName() : null; + String statusReason = openmrsMedicationAdministration.getStatusReason() != null ? openmrsMedicationAdministration.getStatusReason().getDisplayString() : null; + String patientUuid = openmrsMedicationAdministration.getPatient() != null ? openmrsMedicationAdministration.getPatient().getUuid() : null; + String encounterUuid = openmrsMedicationAdministration.getEncounter() != null ? openmrsMedicationAdministration.getEncounter().getUuid() : null; + String orderUuid = openmrsMedicationAdministration.getDrugOrder() != null ? openmrsMedicationAdministration.getDrugOrder().getUuid() : null; + String drugUuid = openmrsMedicationAdministration.getDrug() != null ? openmrsMedicationAdministration.getDrug().getUuid() : null; + + List providers = new java.util.ArrayList<>(); + if (openmrsMedicationAdministration.getPerformers() != null) { + for (MedicationAdministrationPerformer performer : openmrsMedicationAdministration.getPerformers()) { + providers.add(MedicationAdministrationPerformerResponse.createFrom(performer)); + } + } + List notes = new java.util.ArrayList<>(); + if (openmrsMedicationAdministration.getNotes() != null) { + for (Annotation note : openmrsMedicationAdministration.getNotes()) { + notes.add(MedicationAdministrationNoteResponse.createFrom(note)); + } } return MedicationAdministrationResponse.builder() - .uuid(medicationAdministration.getUuid()) - .notes(medicationAdministration.getNotes()) - .administeredDateTime(medicationAdministration.getAdministeredDateTime()) - .status(medicationAdministration.getStatus().getShortNameInLocale(Context.getLocale()).getName()) - // .orderUuid(medicationAdministration.getRequest().getReference()) + .uuid(openmrsMedicationAdministration.getUuid()) + .administeredDateTime(openmrsMedicationAdministration.getAdministeredDateTime()) + .status(status) + .statusReason(statusReason) .patientUuid(patientUuid) - .provider(ConversionUtil.convertToRepresentation(medicationAdministration.getAdminister(), Representation.REF)) + .encounterUuid(encounterUuid) + .orderUuid(orderUuid) + .providers(providers) + .notes(notes) + .drugUuid(drugUuid) + .dosingInstructions(openmrsMedicationAdministration.getDosingInstructions()) + .dose(openmrsMedicationAdministration.getDose()) + .doseUnits(ConversionUtil.convertToRepresentation(openmrsMedicationAdministration.getDoseUnits(), Representation.REF)) + .route(ConversionUtil.convertToRepresentation(openmrsMedicationAdministration.getRoute(), Representation.REF)) + .site(ConversionUtil.convertToRepresentation(openmrsMedicationAdministration.getSite(), Representation.REF)) .build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java index a43589b..7acdc4d 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDMedicationAdministrationController.java @@ -16,12 +16,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import java.time.LocalDate; import java.util.ArrayList; import java.util.List; -import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; -import static org.openmrs.module.ipd.api.util.DateTimeUtil.convertEpocUTCToLocalTimeZone; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.OK; @@ -42,14 +39,14 @@ public IPDMedicationAdministrationController(IPDMedicationAdministrationService this.medicationAdministrationFactory = medicationAdministrationFactory; } - @RequestMapping(value = "/medicationAdministrations", method = RequestMethod.POST) + @RequestMapping(value = "/scheduledMedicationAdministrations", method = RequestMethod.POST) @ResponseBody - public ResponseEntity createMedicationAdministration(@RequestBody List medicationAdministrationRequestList) { + public ResponseEntity createScheduledMedicationAdministration(@RequestBody List medicationAdministrationRequestList) { try { List medicationAdministrationResponseList = new ArrayList<>(); for (MedicationAdministrationRequest medicationAdministrationRequest : medicationAdministrationRequestList) { - MedicationAdministration medicationAdministration = ipdMedicationAdministrationService.saveMedicationAdministration(medicationAdministrationRequest); - medicationAdministrationResponseList.add(medicationAdministrationFactory.createFrom(medicationAdministration)); + MedicationAdministration medicationAdministration = ipdMedicationAdministrationService.saveScheduledMedicationAdministration(medicationAdministrationRequest); + medicationAdministrationResponseList.add(medicationAdministrationFactory.mapMedicationAdministrationToResponse(medicationAdministration)); } return new ResponseEntity<>(medicationAdministrationResponseList, OK); } catch (Exception e) { @@ -58,19 +55,32 @@ public ResponseEntity createMedicationAdministration(@RequestBody List getMedicationSlotsByDate(@RequestParam(value = "patientUuid", required = false) String patientUuid, - @RequestParam(value = "forDate", required = false) Long forDate, - @RequestParam(value = "providerUuid", required = false) String providerUuid, - @RequestParam (value = "slotUuid" , required = false)String slotUuid) { + public ResponseEntity createAdhocMedicationAdministration(@RequestBody MedicationAdministrationRequest medicationAdministrationRequest) { try { - LocalDate localDate = forDate !=null ? convertEpocUTCToLocalTimeZone(forDate).toLocalDate() : null; - List medicationAdministrationResponseList = ipdMedicationAdministrationService.getMedicationAdministrationList(patientUuid,localDate,providerUuid,slotUuid); - return new ResponseEntity<>(medicationAdministrationResponseList, OK); + MedicationAdministration medicationAdministration = ipdMedicationAdministrationService.saveAdhocMedicationAdministration(medicationAdministrationRequest); + MedicationAdministrationResponse medicationAdministrationResponse = medicationAdministrationFactory.mapMedicationAdministrationToResponse(medicationAdministration); + return new ResponseEntity<>(medicationAdministrationResponse, OK); } catch (Exception e) { - log.error("Runtime error while fetching medicationAdministrations ", e); + log.error("Runtime error while trying to create new medicationAdministration", e); return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); } } + +// @RequestMapping(value = "/medicationAdministrations", method = RequestMethod.GET) +// @ResponseBody +// public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid", required = false) String patientUuid, +// @RequestParam(value = "forDate", required = false) Long forDate, +// @RequestParam(value = "providerUuid", required = false) String providerUuid, +// @RequestParam (value = "slotUuid" , required = false)String slotUuid) { +// try { +// LocalDate localDate = forDate !=null ? convertEpocUTCToLocalTimeZone(forDate).toLocalDate() : null; +// List medicationAdministrationResponseList = ipdMedicationAdministrationService.getMedicationAdministrationList(patientUuid,localDate,providerUuid,slotUuid); +// return new ResponseEntity<>(medicationAdministrationResponseList, OK); +// } catch (Exception e) { +// log.error("Runtime error while fetching medicationAdministrations ", e); +// return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); +// } +// } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index af51d78..fac2c73 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -1,21 +1,30 @@ package org.openmrs.module.ipd.factory; -import org.hl7.fhir.r4.model.MedicationAdministration; +import org.apache.commons.lang.StringUtils; +//import org.hl7.fhir.r4.model.MedicationAdministration; import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.Annotation; import org.hl7.fhir.r4.model.DateTimeType; import org.hl7.fhir.r4.model.MarkdownType; +import org.openmrs.DrugOrder; import org.openmrs.Provider; import org.openmrs.api.context.Context; +import org.openmrs.module.fhir2.api.translators.ConceptTranslator; +import org.openmrs.module.fhir2.apiext.translators.AnnotationTranslator; +import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationStatusTranslator; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; -import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; -import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +//import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationPerformerTranslator; +//import org.openmrs.module.fhir2.model.Annotation; +import org.openmrs.module.ipd.api.model.MedicationAdministration; +import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; +import org.openmrs.module.ipd.api.model.Annotation; +import org.openmrs.module.ipd.contract.*; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; @@ -23,60 +32,92 @@ public class MedicationAdministrationFactory { private MedicationAdministrationTranslator medicationAdministrationTranslator; + private MedicationAdministrationStatusTranslator medicationAdministrationStatusTranslator; @Autowired - public MedicationAdministrationFactory(MedicationAdministrationTranslator medicationAdministrationTranslator) { + public MedicationAdministrationFactory(MedicationAdministrationTranslator medicationAdministrationTranslator, + MedicationAdministrationStatusTranslator medicationAdministrationStatusTranslator) { this.medicationAdministrationTranslator = medicationAdministrationTranslator; + this.medicationAdministrationStatusTranslator = medicationAdministrationStatusTranslator; } - public MedicationAdministration createMedicationAdministrationFrom(MedicationAdministrationRequest request) { - MedicationAdministration medicationAdministration = new MedicationAdministration(); - - medicationAdministration.setEffective(new DateTimeType(request.getEffectiveDateTimeAsLocaltime())); - - medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus())); - medicationAdministration - .setSubject(new Reference("Patient/"+request.getPatientUuid())); - - MedicationAdministration.MedicationAdministrationPerformerComponent performer= new MedicationAdministration.MedicationAdministrationPerformerComponent(); - performer.setActor(new Reference("Practitioner/"+request.getProviderUuid())); - List performers=new ArrayList<>(); - performers.add(performer); - medicationAdministration.setPerformer(performers); - - medicationAdministration.setRequest(new Reference("MedicationRequest/"+request.getOrderUuid())); - - Annotation annotation= new Annotation(new MarkdownType(request.getNotes())); - List annotations= new ArrayList<>(); - annotations.add(annotation); - medicationAdministration.setNote(annotations); - - List supportedInfo= new ArrayList<>(); - supportedInfo.add(new Reference("Slot/"+request.getSlotUuid())); - medicationAdministration.setSupportingInformation(supportedInfo); + public MedicationAdministration mapRequestToMedicationAdministration(MedicationAdministrationRequest request, MedicationAdministration medicationAdministration) { + + medicationAdministration.setAdministeredDateTime(request.getAdministeredDateTimeAsLocaltime()); + medicationAdministration.setStatus(medicationAdministrationStatusTranslator.toOpenmrsType(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus()))); + medicationAdministration.setPatient(Context.getPatientService().getPatientByUuid(request.getPatientUuid())); + medicationAdministration.setEncounter(Context.getEncounterService().getEncounterByUuid(request.getEncounterUuid())); + medicationAdministration.setDrugOrder((DrugOrder) Context.getOrderService().getOrderByUuid(request.getOrderUuid())); + + List providers = new ArrayList<>(); + if (request.getProviders() != null) { + for (MedicationAdministrationPerformerRequest performer : request.getProviders()) { + MedicationAdministrationPerformer newProvider = new MedicationAdministrationPerformer(); + newProvider.setActor(Context.getProviderService().getProviderByUuid(performer.getProviderUuid())); + newProvider.setFunction(Context.getConceptService().getConceptByName(performer.getFunction())); + providers.add(newProvider); + } + } + medicationAdministration.setPerformers(new HashSet<>(providers)); + List notes = new ArrayList<>(); + if (request.getNotes() != null) { + for (MedicationAdministrationNoteRequest note : request.getNotes()) { + Annotation newNote = new Annotation(); + newNote.setAuthor(Context.getProviderService().getProviderByUuid(note.getAuthorUuid())); + newNote.setText(note.getText()); + newNote.setRecordedTime(note.getRecordedTimeAsLocaltime()); + notes.add(newNote); + } + } + medicationAdministration.setNotes(new HashSet<>(notes)); + medicationAdministration.setDrug(Context.getConceptService().getDrugByUuid(request.getDrugUuid())); + medicationAdministration.setDosingInstructions(request.getDosingInstructions()); + medicationAdministration.setDose(request.getDose()); + medicationAdministration.setDoseUnits(Context.getConceptService().getConceptByUuid(request.getDoseUnitsUuid())); + medicationAdministration.setRoute(Context.getConceptService().getConceptByUuid(request.getRouteUuid())); + medicationAdministration.setSite(Context.getConceptService().getConceptByUuid(request.getSiteUuid())); + +// medicationAdministration.setEffective(new DateTimeType(request.getAdministeredDateTimeAsLocaltime())); +// medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus())); +// medicationAdministration.setSubject(new Reference("Patient/"+request.getPatientUuid())); +// medicationAdministration.setContext(new Reference("Encounter/"+request.getEncounterUuid())); +// medicationAdministration.setRequest(new Reference("MedicationRequest/"+request.getOrderUuid())); +// +// List fhirPerformers = new ArrayList<>(); +// MedicationAdministrationPerformer openmrsPerformer = new MedicationAdministrationPerformer(); +// for (MedicationAdministrationPerformerRequest performer : request.getProviders()) { +// openmrsPerformer.setActor(Context.getProviderService().getProviderByUuid(performer.getProviderUuid())); +// openmrsPerformer.setFunction(Context.getConceptService().getConceptByName(performer.getFunction())); +// fhirPerformers.add(medicationAdministrationPerformerTranslator.toFhirResource(openmrsPerformer)); +// } +// medicationAdministration.setPerformer(fhirPerformers); +// +// List notes = new ArrayList<>(); +// Annotation openmrsNote = new Annotation(); +// for (MedicationAdministrationNoteRequest note : request.getNotes()) { +// openmrsNote.setAuthor(Context.getProviderService().getProviderByUuid(note.getAuthorUuid())); +// openmrsNote.setText(note.getText()); +// openmrsNote.setRecordedTime(note.getRecordedTimeAsLocaltime()); +// notes.add(annotationTranslator.toFhirResource(note)); +// } +// medicationAdministration.setNote(notes); +// +// medicationAdministration.setMedication(new Reference("Medication/"+request.getDrugUuid())); +// +// MedicationAdministration.MedicationAdministrationDosageComponent dosage = new MedicationAdministration.MedicationAdministrationDosageComponent(); +// dosage.setText(request.getDosingInstructions()); +// dosage.setDose(new org.hl7.fhir.r4.model.SimpleQuantity().setValue(request.getDose()).setUnit(request.getDoseUnitsUuid())); +// dosage.setRoute(conceptTranslator.toFhirResource(Context.getConceptService().getConceptByUuid(request.getRouteUuid()))); +// dosage.setSite(conceptTranslator.toFhirResource(Context.getConceptService().getConceptByUuid(request.getSiteUuid()))); +// medicationAdministration.setDosage(dosage); return medicationAdministration; } - public MedicationAdministrationResponse createFrom(MedicationAdministration medicationAdministration) { - String patientUuid = null; - Provider provider = null; - - if(medicationAdministration.getSubject() !=null){ - patientUuid = medicationAdministration.getSubject().getReference().split("/")[1]; - } - if(medicationAdministration.getPerformer() !=null){ - provider = Context.getProviderService().getProviderByUuid(medicationAdministration.getPerformer().get(0).getActor().getReference().split("/")[1]); - } - return MedicationAdministrationResponse.builder() - .uuid(medicationAdministration.getId()) - .notes(medicationAdministration.getNote().get(0).getText()) - .administeredDateTime(medicationAdministration.getEffectiveDateTimeType().getValue()) - .status(medicationAdministration.getStatus().toCode()) - // .orderUuid(medicationAdministration.getRequest().getReference()) - .patientUuid(patientUuid) - .provider(ConversionUtil.convertToRepresentation(provider, Representation.REF)) - .build(); + public MedicationAdministrationResponse mapMedicationAdministrationToResponse(org.hl7.fhir.r4.model.MedicationAdministration fhirMedicationAdministration) { + MedicationAdministration openmrsMedicationAdministration = (MedicationAdministration) medicationAdministrationTranslator.toOpenmrsType(fhirMedicationAdministration); + MedicationAdministrationResponse response = MedicationAdministrationResponse.createFrom(openmrsMedicationAdministration); + return response; } diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java index ba6ea82..17c09e8 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/SlotFactory.java @@ -7,9 +7,9 @@ import org.openmrs.api.PatientService; import org.openmrs.module.bedmanagement.BedDetails; import org.openmrs.module.bedmanagement.service.BedManagementService; -import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; -import org.openmrs.module.fhir2.model.MedicationAdministration; +import org.openmrs.module.ipd.api.model.MedicationAdministration; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; import org.springframework.beans.factory.annotation.Autowired; @@ -19,9 +19,6 @@ import java.util.List; import java.util.stream.Collectors; -import static org.openmrs.module.ipd.api.model.ServiceType.MEDICATION_REQUEST; -import static org.openmrs.module.ipd.api.model.Slot.SlotStatus.SCHEDULED; - @Component public class SlotFactory { @@ -29,19 +26,18 @@ public class SlotFactory { private final ConceptService conceptService; private final PatientService patientService; private final SlotService slotService; - private final MedicationAdministrationTranslator medicationAdministrationTranslator; @Autowired - public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService,SlotService slotService, - MedicationAdministrationTranslator medicationAdministrationTranslator) { + public SlotFactory(BedManagementService bedManagementService, ConceptService conceptService, PatientService patientService,SlotService slotService) { this.bedManagementService = bedManagementService; this.conceptService = conceptService; this.patientService = patientService; this.slotService = slotService; - this.medicationAdministrationTranslator = medicationAdministrationTranslator; } - public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime, Order drugOrder) { + public List createSlotsForMedicationFrom(Schedule savedSchedule, List slotsStartTime, + Order drugOrder, MedicationAdministration medicationAdministration, + Slot.SlotStatus status, ServiceType serviceType) { return slotsStartTime.stream().map(slotStartTime -> { Slot slot = new Slot(); @@ -53,13 +49,14 @@ public List createSlotsForMedicationFrom(Schedule savedSchedule, List saveMedicationAdministration(List medicationAdministrationRequestList); - MedicationAdministration saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest); + MedicationAdministration saveScheduledMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest); - List getMedicationAdministrationList(String patientUuid,LocalDate forDate,String providerUuid,String slotUuid); + MedicationAdministration saveAdhocMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest); + +// List getMedicationAdministrationList(String patientUuid,LocalDate forDate,String providerUuid,String slotUuid); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index 59dca37..6bf4d84 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -4,26 +4,32 @@ import ca.uhn.fhir.rest.param.ReferenceAndListParam; import ca.uhn.fhir.rest.param.ReferenceOrListParam; import ca.uhn.fhir.rest.param.ReferenceParam; +import org.apache.commons.lang.StringUtils; import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.r4.model.MedicationAdministration; import org.openmrs.module.fhir2.apiext.FhirMedicationAdministrationService; import org.openmrs.module.fhir2.apiext.dao.FhirMedicationAdministrationDao; import org.openmrs.module.fhir2.apiext.search.param.MedicationAdministrationSearchParams; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; +import org.openmrs.module.ipd.api.model.MedicationAdministration; +import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.api.service.ScheduleService; import org.openmrs.module.ipd.api.service.SlotService; +import org.openmrs.module.ipd.api.util.DateTimeUtil; import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; import org.openmrs.module.ipd.factory.MedicationAdministrationFactory; +import org.openmrs.module.ipd.factory.SlotFactory; import org.openmrs.module.ipd.service.IPDMedicationAdministrationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; + +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; @Transactional @@ -32,63 +38,94 @@ public class IPDMedicationAdministrationServiceImpl implements IPDMedicationAdmi private FhirMedicationAdministrationService fhirMedicationAdministrationService; + private MedicationAdministrationTranslator medicationAdministrationTranslator; private MedicationAdministrationFactory medicationAdministrationFactory; + private SlotFactory slotFactory; private SlotService slotService; + private ScheduleService scheduleService; private FhirMedicationAdministrationDao fhirMedicationAdministrationDao; @Autowired public IPDMedicationAdministrationServiceImpl(FhirMedicationAdministrationService fhirMedicationAdministrationService, + MedicationAdministrationTranslator medicationAdministrationTranslator, MedicationAdministrationFactory medicationAdministrationFactory, - SlotService slotService, + SlotFactory slotFactory, SlotService slotService, ScheduleService scheduleService, FhirMedicationAdministrationDao fhirMedicationAdministrationDao) { this.fhirMedicationAdministrationService = fhirMedicationAdministrationService; + this.medicationAdministrationTranslator = medicationAdministrationTranslator; this.medicationAdministrationFactory = medicationAdministrationFactory; + this.slotFactory = slotFactory; this.slotService = slotService; + this.scheduleService = scheduleService; this.fhirMedicationAdministrationDao = fhirMedicationAdministrationDao; } + private org.hl7.fhir.r4.model.MedicationAdministration createMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { + MedicationAdministration medicationAdministration = medicationAdministrationFactory.mapRequestToMedicationAdministration(medicationAdministrationRequest, new MedicationAdministration()); + return fhirMedicationAdministrationService.create(medicationAdministrationTranslator.toFhirResource(medicationAdministration)); + } @Override - public MedicationAdministration saveMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { + public org.hl7.fhir.r4.model.MedicationAdministration saveScheduledMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { Slot slot = slotService.getSlotByUUID(medicationAdministrationRequest.getSlotUuid()); - - if(slot.getMedicationAdministration() != null){ - return fhirMedicationAdministrationService.get(slot.getMedicationAdministration().getUuid()); + if (slot == null) { + throw new RuntimeException("Slot not found"); } else { - MedicationAdministration medicationAdministration = medicationAdministrationFactory.createMedicationAdministrationFrom(medicationAdministrationRequest); - medicationAdministration = fhirMedicationAdministrationService.create(medicationAdministration); - - if (medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)) { - slot.setStatus(Slot.SlotStatus.COMPLETED); + if (slot.getMedicationAdministration() != null) { + return fhirMedicationAdministrationService.get(slot.getMedicationAdministration().getUuid()); + } else if (!StringUtils.isBlank(medicationAdministrationRequest.getUuid())) { + return fhirMedicationAdministrationService.get(medicationAdministrationRequest.getUuid()); + } else { + org.hl7.fhir.r4.model.MedicationAdministration medicationAdministration = createMedicationAdministration(medicationAdministrationRequest); + if (medicationAdministration.getStatus().equals(org.hl7.fhir.r4.model.MedicationAdministration.MedicationAdministrationStatus.COMPLETED)) { + slot.setStatus(Slot.SlotStatus.COMPLETED); + } + slot.setMedicationAdministration((MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId())); + slotService.saveSlot(slot); + return medicationAdministration; } - slot.setMedicationAdministration((org.openmrs.module.fhir2.model.MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId())); - slotService.saveSlot(slot); - System.out.println("after saving slot ********* " + slot.getMedicationAdministration().getUuid()); - return medicationAdministration; } - } @Override - public List getMedicationAdministrationList(String patientUuid, LocalDate forDate, String providerUuid, String slotUuid) { - ReferenceParam patient = new ReferenceParam(); - patient.setValue("Patient/"+patientUuid); - ReferenceAndListParam subjectReference = new ReferenceAndListParam(); - subjectReference.addValue(new ReferenceOrListParam().add(patient)); + public org.hl7.fhir.r4.model.MedicationAdministration saveAdhocMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { + Schedule schedule = scheduleService.getScheduleByUUID(medicationAdministrationRequest.getScheduleUuid()); - ReferenceParam slot = new ReferenceParam(); - patient.setValue("Slot/"+slotUuid); - ReferenceAndListParam supportInfoReference = new ReferenceAndListParam(); - supportInfoReference.addValue(new ReferenceOrListParam().add(patient)); - - - MedicationAdministrationSearchParams medicationAdministrationSearchParams = MedicationAdministrationSearchParams.builder().patientReference(subjectReference).supportingInfoReference(supportInfoReference).build(); - IBundleProvider response = fhirMedicationAdministrationService.searchForMedicationAdministration(medicationAdministrationSearchParams); - List responseData = response.getAllResources(); - List medicationAdministrationsResponse= responseData.stream(). - map(iBaseResource -> (MedicationAdministration)iBaseResource). - map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); - return medicationAdministrationsResponse; + if (schedule == null) { + throw new RuntimeException("schedule not found"); + } else { + org.hl7.fhir.r4.model.MedicationAdministration medicationAdministration = createMedicationAdministration(medicationAdministrationRequest); + MedicationAdministration openmrsMedicationAdministration = (MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId()); + List slotsStartTime = new ArrayList<>(); + slotsStartTime.add(DateTimeUtil.convertEpocUTCToLocalTimeZone(medicationAdministrationRequest.getAdministeredDateTime())); + ServiceType serviceType = openmrsMedicationAdministration.getDrugOrder() == null ? ServiceType.EMERGENCY_MEDICATION_REQUEST : ServiceType.AS_NEEDED_MEDICATION_REQUEST; + slotFactory.createSlotsForMedicationFrom(schedule, slotsStartTime, openmrsMedicationAdministration.getDrugOrder(), + openmrsMedicationAdministration, Slot.SlotStatus.COMPLETED, serviceType) + .forEach(slotService::saveSlot); + return medicationAdministration; + } } +// @Override +// public List getMedicationAdministrationList(String patientUuid, LocalDate forDate, String providerUuid, String slotUuid) { +// ReferenceParam patient = new ReferenceParam(); +// patient.setValue("Patient/"+patientUuid); +// ReferenceAndListParam subjectReference = new ReferenceAndListParam(); +// subjectReference.addValue(new ReferenceOrListParam().add(patient)); +// +// ReferenceParam slot = new ReferenceParam(); +// patient.setValue("Slot/"+slotUuid); +// ReferenceAndListParam supportInfoReference = new ReferenceAndListParam(); +// supportInfoReference.addValue(new ReferenceOrListParam().add(patient)); +// +// +// MedicationAdministrationSearchParams medicationAdministrationSearchParams = MedicationAdministrationSearchParams.builder().patientReference(subjectReference).supportingInfoReference(supportInfoReference).build(); +// IBundleProvider response = fhirMedicationAdministrationService.searchForMedicationAdministration(medicationAdministrationSearchParams); +// List responseData = response.getAllResources(); +// List medicationAdministrationsResponse= responseData.stream(). +// map(iBaseResource -> (MedicationAdministration)iBaseResource). +// map(medicationAdministrationFactory::createFrom).collect(Collectors.toList()); +// return medicationAdministrationsResponse; +// } + } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index e7ddbf3..707d46a 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.Optional; +import static org.openmrs.module.ipd.api.model.Slot.SlotStatus.SCHEDULED; + @Service @Transactional public class IPDScheduleServiceImpl implements IPDScheduleService { @@ -69,7 +71,7 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat } DrugOrder order = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); List slotsStartTime = slotTimeCreationService.createSlotsStartTimeFrom(scheduleMedicationRequest, order); - slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime, order) + slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime, order, null, SCHEDULED, ServiceType.MEDICATION_REQUEST) .forEach(slotService::saveSlot); return savedSchedule; From b8c4daa4f6f153c408d53c729d1645b5358eedcc Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Wed, 27 Dec 2023 12:19:16 +0530 Subject: [PATCH 40/50] refactored schedule from medication administration request --- .../org/openmrs/module/ipd/api/dao/ScheduleDAO.java | 2 -- .../module/ipd/api/dao/impl/HibernateScheduleDAO.java | 6 ------ .../module/ipd/api/service/ScheduleService.java | 2 -- .../ipd/api/service/impl/ScheduleServiceImpl.java | 6 ------ .../ipd/contract/MedicationAdministrationRequest.java | 1 - .../impl/IPDMedicationAdministrationServiceImpl.java | 10 +++++++--- 6 files changed, 7 insertions(+), 20 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java index 416b342..7d85035 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/ScheduleDAO.java @@ -11,8 +11,6 @@ public interface ScheduleDAO { Schedule getSchedule(Integer scheduleId) throws DAOException; - Schedule getScheduleByUUID(String uuid) throws DAOException; - Schedule saveSchedule(Schedule schedule) throws DAOException; Schedule getScheduleByVisit(Visit visit) throws DAOException; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java index 3f8c5c1..5a15768 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateScheduleDAO.java @@ -26,12 +26,6 @@ public HibernateScheduleDAO(SessionFactory sessionFactory) { public Schedule getSchedule(Integer scheduleId) throws DAOException { return sessionFactory.getCurrentSession().get(Schedule.class, scheduleId); } - - @Override - public Schedule getScheduleByUUID(String uuid) throws DAOException { - Schedule s = (Schedule)this.sessionFactory.getCurrentSession().createQuery("from Schedule s where s.uuid = :uuid").setString("uuid", uuid).uniqueResult(); - return s; - } @Override public Schedule saveSchedule(Schedule schedule) throws DAOException { diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java index 78db208..a370215 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/ScheduleService.java @@ -13,8 +13,6 @@ public interface ScheduleService extends OpenmrsService { // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule getSchedule(Integer scheduleId) throws APIException; - Schedule getScheduleByUUID(String uuid) throws APIException; - // @Authorized({ PrivilegeConstants.EDIT_IPD_SCHEDULES }) Schedule saveSchedule(Schedule schedule) throws APIException; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java index 79c5425..7521211 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/ScheduleServiceImpl.java @@ -30,12 +30,6 @@ public ScheduleServiceImpl(ScheduleDAO scheduleDAO) { public Schedule getSchedule(Integer scheduleId) throws APIException { return scheduleDAO.getSchedule(scheduleId); } - - @Override - @Transactional(readOnly = true) - public Schedule getScheduleByUUID(String uuid) throws APIException { - return scheduleDAO.getScheduleByUUID(uuid); - } @Override public Schedule saveSchedule(Schedule schedule) throws APIException { diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java index 12757ef..30270d6 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequest.java @@ -31,7 +31,6 @@ public class MedicationAdministrationRequest { private String siteUuid; private Long administeredDateTime; private String slotUuid; - private String scheduleUuid; public Date getAdministeredDateTimeAsLocaltime() { return this.administeredDateTime != null ? new Date(TimeUnit.SECONDS.toMillis(this.administeredDateTime)): null; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java index 6bf4d84..7ffef72 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDMedicationAdministrationServiceImpl.java @@ -6,6 +6,9 @@ import ca.uhn.fhir.rest.param.ReferenceParam; import org.apache.commons.lang.StringUtils; import org.hl7.fhir.instance.model.api.IBaseResource; +import org.openmrs.Patient; +import org.openmrs.Visit; +import org.openmrs.api.context.Context; import org.openmrs.module.fhir2.apiext.FhirMedicationAdministrationService; import org.openmrs.module.fhir2.apiext.dao.FhirMedicationAdministrationDao; import org.openmrs.module.fhir2.apiext.search.param.MedicationAdministrationSearchParams; @@ -89,10 +92,11 @@ public org.hl7.fhir.r4.model.MedicationAdministration saveScheduledMedicationAdm @Override public org.hl7.fhir.r4.model.MedicationAdministration saveAdhocMedicationAdministration(MedicationAdministrationRequest medicationAdministrationRequest) { - Schedule schedule = scheduleService.getScheduleByUUID(medicationAdministrationRequest.getScheduleUuid()); - + Patient patient = Context.getPatientService().getPatientByUuid(medicationAdministrationRequest.getPatientUuid()); + Visit visit = Context.getVisitService().getActiveVisitsByPatient(patient).get(0); + Schedule schedule = scheduleService.getScheduleByVisit(visit); if (schedule == null) { - throw new RuntimeException("schedule not found"); + throw new RuntimeException("Active Schedule not found"); } else { org.hl7.fhir.r4.model.MedicationAdministration medicationAdministration = createMedicationAdministration(medicationAdministrationRequest); MedicationAdministration openmrsMedicationAdministration = (MedicationAdministration) fhirMedicationAdministrationDao.get(medicationAdministration.getId()); From 1dbad33d9cc7a3450b9d63538932d76e1443f2ff Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Wed, 27 Dec 2023 13:47:19 +0530 Subject: [PATCH 41/50] Kavitha | refactored medication administration request and response --- .../MedicationAdministrationRequestList.java | 16 --------- .../MedicationAdministrationResponse.java | 5 ++- .../MedicationAdministrationResponseList.java | 17 ---------- .../MedicationAdministrationFactory.java | 34 ------------------- 4 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java deleted file mode 100644 index a114b60..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationRequestList.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.openmrs.module.ipd.contract; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MedicationAdministrationRequestList { - private List medicationAdministrationRequestList; -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index c09a1f3..a26d0a4 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -26,7 +26,7 @@ public class MedicationAdministrationResponse { private List notes; private String status; private String statusReason; - private String drugUuid; + private Object drug; private String dosingInstructions; private Double dose; private Object doseUnits; @@ -43,7 +43,6 @@ public static MedicationAdministrationResponse createFrom(org.openmrs.module.ipd String patientUuid = openmrsMedicationAdministration.getPatient() != null ? openmrsMedicationAdministration.getPatient().getUuid() : null; String encounterUuid = openmrsMedicationAdministration.getEncounter() != null ? openmrsMedicationAdministration.getEncounter().getUuid() : null; String orderUuid = openmrsMedicationAdministration.getDrugOrder() != null ? openmrsMedicationAdministration.getDrugOrder().getUuid() : null; - String drugUuid = openmrsMedicationAdministration.getDrug() != null ? openmrsMedicationAdministration.getDrug().getUuid() : null; List providers = new java.util.ArrayList<>(); if (openmrsMedicationAdministration.getPerformers() != null) { @@ -67,7 +66,7 @@ public static MedicationAdministrationResponse createFrom(org.openmrs.module.ipd .orderUuid(orderUuid) .providers(providers) .notes(notes) - .drugUuid(drugUuid) + .drug(ConversionUtil.convertToRepresentation(openmrsMedicationAdministration.getDrug(), Representation.REF)) .dosingInstructions(openmrsMedicationAdministration.getDosingInstructions()) .dose(openmrsMedicationAdministration.getDose()) .doseUnits(ConversionUtil.convertToRepresentation(openmrsMedicationAdministration.getDoseUnits(), Representation.REF)) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java deleted file mode 100644 index 5f1f2a3..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponseList.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.openmrs.module.ipd.contract; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MedicationAdministrationResponseList { - - public List medicationAdministrationResponseList; -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index fac2c73..6f102cc 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -77,40 +77,6 @@ public MedicationAdministration mapRequestToMedicationAdministration(MedicationA medicationAdministration.setRoute(Context.getConceptService().getConceptByUuid(request.getRouteUuid())); medicationAdministration.setSite(Context.getConceptService().getConceptByUuid(request.getSiteUuid())); -// medicationAdministration.setEffective(new DateTimeType(request.getAdministeredDateTimeAsLocaltime())); -// medicationAdministration.setStatus(MedicationAdministration.MedicationAdministrationStatus.fromCode(request.getStatus())); -// medicationAdministration.setSubject(new Reference("Patient/"+request.getPatientUuid())); -// medicationAdministration.setContext(new Reference("Encounter/"+request.getEncounterUuid())); -// medicationAdministration.setRequest(new Reference("MedicationRequest/"+request.getOrderUuid())); -// -// List fhirPerformers = new ArrayList<>(); -// MedicationAdministrationPerformer openmrsPerformer = new MedicationAdministrationPerformer(); -// for (MedicationAdministrationPerformerRequest performer : request.getProviders()) { -// openmrsPerformer.setActor(Context.getProviderService().getProviderByUuid(performer.getProviderUuid())); -// openmrsPerformer.setFunction(Context.getConceptService().getConceptByName(performer.getFunction())); -// fhirPerformers.add(medicationAdministrationPerformerTranslator.toFhirResource(openmrsPerformer)); -// } -// medicationAdministration.setPerformer(fhirPerformers); -// -// List notes = new ArrayList<>(); -// Annotation openmrsNote = new Annotation(); -// for (MedicationAdministrationNoteRequest note : request.getNotes()) { -// openmrsNote.setAuthor(Context.getProviderService().getProviderByUuid(note.getAuthorUuid())); -// openmrsNote.setText(note.getText()); -// openmrsNote.setRecordedTime(note.getRecordedTimeAsLocaltime()); -// notes.add(annotationTranslator.toFhirResource(note)); -// } -// medicationAdministration.setNote(notes); -// -// medicationAdministration.setMedication(new Reference("Medication/"+request.getDrugUuid())); -// -// MedicationAdministration.MedicationAdministrationDosageComponent dosage = new MedicationAdministration.MedicationAdministrationDosageComponent(); -// dosage.setText(request.getDosingInstructions()); -// dosage.setDose(new org.hl7.fhir.r4.model.SimpleQuantity().setValue(request.getDose()).setUnit(request.getDoseUnitsUuid())); -// dosage.setRoute(conceptTranslator.toFhirResource(Context.getConceptService().getConceptByUuid(request.getRouteUuid()))); -// dosage.setSite(conceptTranslator.toFhirResource(Context.getConceptService().getConceptByUuid(request.getSiteUuid()))); -// medicationAdministration.setDosage(dosage); - return medicationAdministration; } From 1f6bcac036fb460a85ebe6168d0244e262d27d85 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Wed, 27 Dec 2023 15:24:56 +0530 Subject: [PATCH 42/50] IPD Drug Order Fetch API changes --- api/pom.xml | 6 + .../ipd/api/model/DrugOrderSchedule.java | 20 +++ .../module/ipd/api/model/IPDDrugOrder.java | 21 +++ omod/pom.xml | 12 ++ .../contract/DrugOrderScheduleResponse.java | 31 +++++ .../ipd/contract/IPDDrugOrderResponse.java | 39 ++++++ .../ipd/contract/MedicationSlotResponse.java | 16 +++ .../ipd/contract/VisitInfoResponse.java | 22 +++ .../controller/IPDDrugOrderController.java | 49 +++++++ .../ipd/service/IPDDrugOrderService.java | 11 ++ .../service/impl/IPDDrugOrderServiceImpl.java | 128 ++++++++++++++++++ .../service/impl/IPDScheduleServiceImpl.java | 2 +- .../service/impl/SlotTimeCreationService.java | 55 +++++++- pom.xml | 25 ++++ 14 files changed, 432 insertions(+), 5 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java create mode 100644 api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java diff --git a/api/pom.xml b/api/pom.xml index 7dfdbee..af643df 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -140,6 +140,12 @@ provided + + org.bahmni.module + bahmnicore-api + provided + + org.bahmni.module medication-administration-api diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java b/api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java new file mode 100644 index 0000000..7fa40a5 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java @@ -0,0 +1,20 @@ +package org.openmrs.module.ipd.api.model; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DrugOrderSchedule { + + private List firstDaySlotsStartTime; + private List dayWiseSlotsStartTime; + private List remainingDaySlotsStartTime; + private Long slotStartTime; + private List slots; + +} diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java b/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java new file mode 100644 index 0000000..5e4ea3a --- /dev/null +++ b/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java @@ -0,0 +1,21 @@ +package org.openmrs.module.ipd.api.model; + +import lombok.*; +import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IPDDrugOrder { + + private BahmniDrugOrder bahmniDrugOrder; + private DrugOrderSchedule drugOrderSchedule; + + public static IPDDrugOrder createFrom(BahmniDrugOrder bahmniDrugOrder,DrugOrderSchedule drugOrderSchedule){ + return IPDDrugOrder.builder(). + bahmniDrugOrder(bahmniDrugOrder). + drugOrderSchedule(drugOrderSchedule). + build(); + } +} diff --git a/omod/pom.xml b/omod/pom.xml index 234d658..c1c3e96 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -123,6 +123,18 @@ provided + + org.openmrs.module + emrapi-api + provided + + + + org.bahmni.module + bahmnicore-api + provided + + org.bahmni.module medication-administration-api diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java new file mode 100644 index 0000000..dcf18d8 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java @@ -0,0 +1,31 @@ +package org.openmrs.module.ipd.contract; + +import lombok.*; +import org.openmrs.module.ipd.api.model.DrugOrderSchedule; +import org.openmrs.module.webservices.rest.web.representation.Representation; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DrugOrderScheduleResponse { + + private List firstDaySlotsStartTime; + private List dayWiseSlotsStartTime; + private List remainingDaySlotsStartTime; + private Long slotStartTime; + private List slots; + + public static DrugOrderScheduleResponse createFrom(DrugOrderSchedule drugOrderSchedule){ + return DrugOrderScheduleResponse.builder(). + firstDaySlotsStartTime(drugOrderSchedule.getFirstDaySlotsStartTime()). + dayWiseSlotsStartTime(drugOrderSchedule.getDayWiseSlotsStartTime()). + remainingDaySlotsStartTime(drugOrderSchedule.getRemainingDaySlotsStartTime()). + slotStartTime(drugOrderSchedule.getSlotStartTime()). + slots(drugOrderSchedule.getSlots().stream().map(slot -> MedicationSlotResponse.createFrom(slot, Representation.REF)).collect(Collectors.toList())). + build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java new file mode 100644 index 0000000..739c2d5 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java @@ -0,0 +1,39 @@ +package org.openmrs.module.ipd.contract; + +import lombok.*; +import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction; +import org.openmrs.module.ipd.api.model.IPDDrugOrder; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IPDDrugOrderResponse { + + private VisitInfoResponse visit; + private EncounterTransaction.DrugOrder drugOrder; + private DrugOrderScheduleResponse drugOrderSchedule; + + public static IPDDrugOrderResponse createFrom(IPDDrugOrder ipdDrugOrder) { + IPDDrugOrderResponse ipdDrugOrderResponse= IPDDrugOrderResponse.builder(). + visit(VisitInfoResponse.createFrom(ipdDrugOrder.getBahmniDrugOrder().getVisit())). + drugOrder(ipdDrugOrder.getBahmniDrugOrder().getDrugOrder()).build(); + if (ipdDrugOrder.getDrugOrderSchedule() != null){ + ipdDrugOrderResponse.setDrugOrderSchedule(DrugOrderScheduleResponse.createFrom(ipdDrugOrder.getDrugOrderSchedule())); + } + return ipdDrugOrderResponse; + } + + public boolean equals(Object otherOrder) { + if (otherOrder == null) { + return false; + } else if (!(otherOrder instanceof IPDDrugOrderResponse)) { + return false; + } else { + return super.equals(otherOrder); + } + } + + +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java index f2b4c97..b78254e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationSlotResponse.java @@ -38,4 +38,20 @@ public static MedicationSlotResponse createFrom(Slot slot) { .medicationAdministration(MedicationAdministrationResponse.createFrom((slot.getMedicationAdministration()))) .build(); } + + public static MedicationSlotResponse createFrom(Slot slot, Representation rep) { + if (rep.equals(Representation.REF)) + { + return MedicationSlotResponse.builder() + .id(slot.getId()) + .uuid(slot.getUuid()) + .serviceType(slot.getServiceType().getName().getName()) + .status(slot.getStatus().name()) + .startTime(convertLocalDateTimeToUTCEpoc(slot.getStartDateTime())) + .medicationAdministration(MedicationAdministrationResponse.createFrom((slot.getMedicationAdministration()))) + .build(); + } + return MedicationSlotResponse.createFrom(slot); + + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java new file mode 100644 index 0000000..13d5f85 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java @@ -0,0 +1,22 @@ +package org.openmrs.module.ipd.contract; + +import lombok.*; +import org.openmrs.module.bahmniemrapi.visit.contract.VisitData; + +import java.util.Date; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VisitInfoResponse { + private String uuid; + private Date startDateTime; + + public static VisitInfoResponse createFrom(VisitData visitData){ + return VisitInfoResponse.builder(). + uuid(visitData.getUuid()). + startDateTime(visitData.getStartDateTime()). + build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java new file mode 100644 index 0000000..53ab897 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java @@ -0,0 +1,49 @@ +package org.openmrs.module.ipd.controller; + +import lombok.extern.slf4j.Slf4j; +import org.bahmni.module.bahmnicore.util.BahmniDateUtil; +import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; +import org.openmrs.module.ipd.service.IPDDrugOrderService; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; + +@Controller +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd") +@Slf4j +public class IPDDrugOrderController extends BaseRestController { + + private IPDDrugOrderService ipdDrugOrderService; + + @Autowired + public IPDDrugOrderController(IPDDrugOrderService ipdDrugOrderService) { + this.ipdDrugOrderService = ipdDrugOrderService; + } + + @RequestMapping(value = "/drugOrders", method = RequestMethod.GET) + @ResponseBody + public List getVisitWisePrescribedAndOtherActiveOrders( + @RequestParam(value = "patientUuid") String patientUuid, + @RequestParam(value = "numberOfVisits", required = false) Integer numberOfVisits, + @RequestParam(value = "visitUuids", required = false) List visitUuids, + @RequestParam(value = "startDate", required = false) String startDateStr, + @RequestParam(value = "endDate", required = false) String endDateStr, + @RequestParam(value = "includes", required = false) List includes, + @RequestParam(value = "getEffectiveOrdersOnly", required = false) Boolean getEffectiveOrdersOnly) throws ParseException { + + Date startDate = BahmniDateUtil.convertToDate(startDateStr, BahmniDateUtil.DateFormatType.UTC); + Date endDate = BahmniDateUtil.convertToDate(endDateStr, BahmniDateUtil.DateFormatType.UTC); + + List prescribedOrders = ipdDrugOrderService.getPrescribedOrders(visitUuids, patientUuid, true, numberOfVisits, startDate, endDate, Boolean.TRUE.equals(getEffectiveOrdersOnly)); + return prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList()); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java new file mode 100644 index 0000000..61d525c --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java @@ -0,0 +1,11 @@ +package org.openmrs.module.ipd.service; + +import org.openmrs.module.ipd.api.model.IPDDrugOrder; + +import java.util.Date; +import java.util.List; + +public interface IPDDrugOrderService { + + List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly); +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java new file mode 100644 index 0000000..8833f79 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java @@ -0,0 +1,128 @@ +package org.openmrs.module.ipd.service.impl; + +import org.bahmni.module.bahmnicore.service.BahmniDrugOrderService; +import org.bahmni.module.bahmnicore.service.BahmniObsService; +import org.openmrs.Concept; +import org.openmrs.DrugOrder; +import org.openmrs.api.ConceptService; +import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; +import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniOrderAttribute; +import org.openmrs.module.bahmniemrapi.drugorder.mapper.BahmniDrugOrderMapper; +import org.openmrs.module.bahmniemrapi.encountertransaction.contract.BahmniObservation; +import org.openmrs.module.ipd.api.model.DrugOrderSchedule; +import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.api.model.ServiceType; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; +import org.openmrs.module.ipd.service.IPDDrugOrderService; +import org.openmrs.module.ipd.service.IPDScheduleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Transactional +public class IPDDrugOrderServiceImpl implements IPDDrugOrderService { + + private BahmniDrugOrderService drugOrderService; + private IPDScheduleService ipdScheduleService; + private SlotTimeCreationService slotTimeCreationService; + private BahmniObsService bahmniObsService; + private ConceptService conceptService; + private BahmniDrugOrderMapper bahmniDrugOrderMapper; + + @Autowired + public IPDDrugOrderServiceImpl(BahmniDrugOrderService drugOrderService, + IPDScheduleService ipdScheduleService, + SlotTimeCreationService slotTimeCreationService, + BahmniObsService bahmniObsService, + ConceptService conceptService) { + this.drugOrderService = drugOrderService; + this.ipdScheduleService = ipdScheduleService; + this.slotTimeCreationService = slotTimeCreationService; + this.bahmniObsService = bahmniObsService; + this.conceptService = conceptService; + this.bahmniDrugOrderMapper = new BahmniDrugOrderMapper(); + } + + + + @Override + public List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) { + List prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuids, patientUuid, includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly); + return getIPDDrugOrders(patientUuid, prescribedDrugOrders); + } + + private List getIPDDrugOrders(String patientUuid, List drugOrders) { + Map drugOrderMap = drugOrderService.getDiscontinuedDrugOrders(drugOrders); + try { + Collection orderAttributeObs = bahmniObsService.observationsFor(patientUuid, getOrdAttributeConcepts(), null, null, false, null, null, null); + List bahmniDrugOrders = bahmniDrugOrderMapper.mapToResponse(drugOrders, orderAttributeObs, drugOrderMap , null); + bahmniDrugOrders=sortDrugOrdersAccordingToTheirSortWeight(bahmniDrugOrders); + Map drugOrderScheduleByOrders = getDrugOrderScheduleForOrders(patientUuid, bahmniDrugOrders); + + return bahmniDrugOrders.stream().map(bahmniDrugOrder -> IPDDrugOrder.createFrom(bahmniDrugOrder,drugOrderScheduleByOrders.get(bahmniDrugOrder.getUuid()))).collect(Collectors.toList()); + + } catch (IOException e) { + throw new RuntimeException("Could not parse drug order", e); + } + } + + private Map getDrugOrderScheduleForOrders(String patientUuid, List bahmniDrugOrders) { + List orderUuids = bahmniDrugOrders.stream() + .map(BahmniDrugOrder::getUuid) + .collect(Collectors.toList()); + List slots = ipdScheduleService.getMedicationSlots(patientUuid, ServiceType.MEDICATION_REQUEST,orderUuids); + Map> groupedByOrders = slots.stream() + .collect(Collectors.groupingBy(slot -> (DrugOrder) slot.getOrder())); + Map drugOrderScheduleByOrders = slotTimeCreationService.getDrugOrderScheduledTime(groupedByOrders); + return drugOrderScheduleByOrders; + } + + private List sortDrugOrdersAccordingToTheirSortWeight(List bahmniDrugOrders) { + Map> bahmniDrugOrderMap = groupDrugOrdersAccordingToOrderSet(bahmniDrugOrders); + List sortDrugOrders = new ArrayList<>(); + for (String key : bahmniDrugOrderMap.keySet()) { + if(key == null) { + continue; + } + List bahmniDrugOrder = bahmniDrugOrderMap.get(key); + Collections.sort(bahmniDrugOrder, new Comparator() { + @Override + public int compare(BahmniDrugOrder o1, BahmniDrugOrder o2) { + return o1.getSortWeight().compareTo(o2.getSortWeight()); + } + }); + } + + for (String s : bahmniDrugOrderMap.keySet()) { + sortDrugOrders.addAll(bahmniDrugOrderMap.get(s)); + } + return sortDrugOrders; + } + + private Map> groupDrugOrdersAccordingToOrderSet(List bahmniDrugOrders) { + Map> groupedDrugOrders = new LinkedHashMap<>(); + + for (BahmniDrugOrder bahmniDrugOrder: bahmniDrugOrders) { + String orderSetUuid = null == bahmniDrugOrder.getOrderGroup() ? null : bahmniDrugOrder.getOrderGroup().getOrderSet().getUuid(); + + if(!groupedDrugOrders.containsKey(orderSetUuid)){ + groupedDrugOrders.put(orderSetUuid, new ArrayList()); + } + + groupedDrugOrders.get(orderSetUuid).add(bahmniDrugOrder); + } + + return groupedDrugOrders; + } + + private Collection getOrdAttributeConcepts() { + Concept orderAttribute = conceptService.getConceptByName(BahmniOrderAttribute.ORDER_ATTRIBUTES_CONCEPT_SET_NAME); + return orderAttribute == null ? Collections.EMPTY_LIST : orderAttribute.getSetMembers(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 707d46a..31dba1f 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -101,6 +101,6 @@ public List getMedicationSlots(String patientUuid, ServiceType serviceType Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), patientUuid); if(!subjectReference.isPresent()) return Collections.emptyList(); - return slotService.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); + return slotService.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); } } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index e1f4fc4..5dff8fc 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -1,22 +1,29 @@ package org.openmrs.module.ipd.service.impl; import org.openmrs.DrugOrder; +import org.openmrs.api.impl.BaseOpenmrsService; +import org.openmrs.module.ipd.api.model.DrugOrderSchedule; import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static org.openmrs.module.ipd.contract.ScheduleMedicationRequest.MedicationFrequency.FIXED_SCHEDULE_FREQUENCY; import static org.openmrs.module.ipd.contract.ScheduleMedicationRequest.MedicationFrequency.START_TIME_DURATION_FREQUENCY; +@Service @Component -public class SlotTimeCreationService { +public class SlotTimeCreationService extends BaseOpenmrsService { + + public static final List START_TIME_FREQUENCIES= Arrays.asList(new String[]{"Every Hour", "Every 2 hours", "Every 3 hours", "Every 4 hours", "Every 6 hours", "Every 8 hours", "Every 12 hours", "Once a day", "Nocte (At Night)", "Every 30 minutes", "STAT (Immediately)"}); + public List createSlotsStartTimeFrom(ScheduleMedicationRequest request, DrugOrder order) { if (request.getSlotStartTimeAsLocaltime() != null && request.getMedicationFrequency() == START_TIME_DURATION_FREQUENCY) { return getSlotsStartTimeWithStartTimeDurationFrequency(request, order); @@ -29,6 +36,7 @@ public List createSlotsStartTimeFrom(ScheduleMedicationRequest re private List getSlotsStartTimeWithFixedScheduleFrequency(ScheduleMedicationRequest request, DrugOrder order) { int numberOfSlotsStartTimeToBeCreated = (int) (Math.ceil(order.getQuantity() / order.getDose())); + List slotsStartTime = new ArrayList<>(); if (!CollectionUtils.isEmpty(request.getFirstDaySlotsStartTimeAsLocalTime())) { @@ -90,4 +98,43 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche } return slotsStartTime; } + + public HashMap getDrugOrderScheduledTime(Map> slotsByOrder){ + HashMap drugOrderScheduleHash= new HashMap<>(); + for (DrugOrder drugOrder : slotsByOrder.keySet()) { + Double frequencyPerDay = drugOrder.getFrequency().getFrequencyPerDay(); + String frequency=drugOrder.getFrequency().getName(); + Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream() + .collect(Collectors.groupingBy( + obj -> obj.getStartDateTime().toLocalDate(), + Collectors.mapping( + obj -> obj.getStartDateTime().toEpochSecond(java.time.ZoneOffset.UTC), + Collectors.toList() + ) + )); + + // Assuming you have a Map> called groupedByDateAndEpoch + List> sortedList = groupedByDateAndEpoch.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) // Sort by LocalDate in ascending order + .map(Map.Entry::getValue) // Get the list of Longs for each entry + .collect(Collectors.toList()); // Collect the list of lists into a single ArrayList + + DrugOrderSchedule drugOrderSchedule=new DrugOrderSchedule(); + if (START_TIME_FREQUENCIES.contains(frequency)){ + drugOrderSchedule.setSlotStartTime(sortedList.get(0).get(0)); + } + else if (sortedList.get(0).size() == frequencyPerDay || (sortedList.size() == 1)) { + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(0)); + } else { + drugOrderSchedule.setFirstDaySlotsStartTime(sortedList.get(0)); + drugOrderSchedule.setRemainingDaySlotsStartTime(sortedList.get(sortedList.size() - 1)); + if (sortedList.size() > 2) { + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(1)); + } + } + drugOrderSchedule.setSlots(slotsByOrder.get(drugOrder)); + drugOrderScheduleHash.put(drugOrder.getUuid(),drugOrderSchedule); + } + return drugOrderScheduleHash; + } } diff --git a/pom.xml b/pom.xml index 703f471..39fc8fc 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,8 @@ 0.7.9 1.18.26 1.11.0 + 0.94-SNAPSHOT + 1.32.0 @@ -157,6 +159,28 @@ ${openmrsPlatformVersion} provided + + + org.openmrs.module + emrapi-api + ${emrapi-omod.version} + provided + + + org.hamcrest + hamcrest-library + + + + + + org.bahmni.module + bahmnicore-api + ${bahmniVersion} + provided + jar + + org.openmrs.module bedmanagement-api @@ -165,6 +189,7 @@ + org.openmrs.module fhir2-api From cadcc349167e9743aa0c3d4ea1a22fb25186e953 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Wed, 27 Dec 2023 16:51:37 +0530 Subject: [PATCH 43/50] Kavitha | refactored annotation to medicationAdministrationNote --- .../MedicationAdministrationNoteResponse.java | 12 ++++++------ .../contract/MedicationAdministrationResponse.java | 4 ++-- .../ipd/factory/MedicationAdministrationFactory.java | 9 +++------ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java index ad5f876..b8e2f01 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationNoteResponse.java @@ -2,7 +2,7 @@ import lombok.*; import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.openmrs.module.ipd.api.model.Annotation; +import org.openmrs.module.ipd.api.model.MedicationAdministrationNote; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; @@ -20,12 +20,12 @@ public class MedicationAdministrationNoteResponse { private Date recordedTime; private String text; - public static MedicationAdministrationNoteResponse createFrom(Annotation openmrsAnnotation) { + public static MedicationAdministrationNoteResponse createFrom(MedicationAdministrationNote openmrsObject) { return MedicationAdministrationNoteResponse.builder() - .uuid(openmrsAnnotation.getUuid()) - .author(ConversionUtil.convertToRepresentation(openmrsAnnotation.getAuthor(), Representation.REF)) - .recordedTime(openmrsAnnotation.getRecordedTime()) - .text(openmrsAnnotation.getText()) + .uuid(openmrsObject.getUuid()) + .author(ConversionUtil.convertToRepresentation(openmrsObject.getAuthor(), Representation.REF)) + .recordedTime(openmrsObject.getRecordedTime()) + .text(openmrsObject.getText()) .build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java index a26d0a4..4857b4e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/MedicationAdministrationResponse.java @@ -2,7 +2,7 @@ import lombok.*; import org.openmrs.api.context.Context; -import org.openmrs.module.ipd.api.model.Annotation; +import org.openmrs.module.ipd.api.model.MedicationAdministrationNote; import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; @@ -52,7 +52,7 @@ public static MedicationAdministrationResponse createFrom(org.openmrs.module.ipd } List notes = new java.util.ArrayList<>(); if (openmrsMedicationAdministration.getNotes() != null) { - for (Annotation note : openmrsMedicationAdministration.getNotes()) { + for (MedicationAdministrationNote note : openmrsMedicationAdministration.getNotes()) { notes.add(MedicationAdministrationNoteResponse.createFrom(note)); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 6f102cc..1a22173 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -9,14 +9,11 @@ import org.openmrs.Provider; import org.openmrs.api.context.Context; import org.openmrs.module.fhir2.api.translators.ConceptTranslator; -import org.openmrs.module.fhir2.apiext.translators.AnnotationTranslator; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationStatusTranslator; import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationTranslator; -//import org.openmrs.module.fhir2.apiext.translators.MedicationAdministrationPerformerTranslator; -//import org.openmrs.module.fhir2.model.Annotation; import org.openmrs.module.ipd.api.model.MedicationAdministration; +import org.openmrs.module.ipd.api.model.MedicationAdministrationNote; import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; -import org.openmrs.module.ipd.api.model.Annotation; import org.openmrs.module.ipd.contract.*; import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; @@ -59,10 +56,10 @@ public MedicationAdministration mapRequestToMedicationAdministration(MedicationA } } medicationAdministration.setPerformers(new HashSet<>(providers)); - List notes = new ArrayList<>(); + List notes = new ArrayList<>(); if (request.getNotes() != null) { for (MedicationAdministrationNoteRequest note : request.getNotes()) { - Annotation newNote = new Annotation(); + MedicationAdministrationNote newNote = new MedicationAdministrationNote(); newNote.setAuthor(Context.getProviderService().getProviderByUuid(note.getAuthorUuid())); newNote.setText(note.getText()); newNote.setRecordedTime(note.getRecordedTimeAsLocaltime()); From 67d3aeb586215f720da7a74318a30500f43b338d Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Tue, 2 Jan 2024 16:22:41 +0530 Subject: [PATCH 44/50] IPD Drug Order schedule update API changes --- .../openmrs/module/ipd/api/dao/SlotDAO.java | 2 ++ .../ipd/api/dao/impl/HibernateSlotDAO.java | 5 +++++ .../module/ipd/api/service/SlotService.java | 2 ++ .../ipd/api/service/impl/SlotServiceImpl.java | 15 +++++++++++++++ .../ipd/controller/IPDScheduleController.java | 12 ++++++++++++ .../MedicationAdministrationFactory.java | 5 +---- .../module/ipd/service/IPDScheduleService.java | 1 + .../service/impl/IPDScheduleServiceImpl.java | 18 +++++++++++++++--- 8 files changed, 53 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 5896222..392e062 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -23,4 +23,6 @@ public interface SlotDAO { List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); + + void deleteSlotsByOrderUUID(String orderUuid); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 59ecb5a..afbf9d5 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -83,4 +83,9 @@ public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere return query.getResultList(); } + + @Override + public void deleteSlotsByOrderUUID(String orderUuid) { + + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index 468f6b1..e4fb189 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -28,4 +28,6 @@ public interface SlotService extends OpenmrsService { List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); + + void voidSlot(Slot slot,String voidReason); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 318d39d..8767cea 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -1,8 +1,10 @@ package org.openmrs.module.ipd.api.service.impl; import org.openmrs.Concept; +import org.openmrs.api.context.Context; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; +import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.api.APIException; @@ -14,6 +16,9 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; import java.util.List; @Service @@ -60,4 +65,14 @@ public List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids) { return slotDAO.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids); } + + @Override + public void voidSlot(Slot slot, String voidReason) throws APIException { + slot.setVoided(true); + slot.setVoidedBy(Context.getAuthenticatedUser()); + slot.setDateVoided(new Date()); + slot.setVoidReason(voidReason); + slotDAO.saveSlot(slot); + } + } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index f6bb85a..8fa66f1 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -51,6 +51,18 @@ public ResponseEntity createMedicationSchedule(@RequestBody ScheduleMedi } } + @RequestMapping(value = "type/medication/edit", method = RequestMethod.POST) + @ResponseBody + public ResponseEntity updateMedicationSchedule(@RequestBody ScheduleMedicationRequest scheduleMedicationRequest) { + try { + Schedule schedule = ipdScheduleService.updateMedicationSchedule(scheduleMedicationRequest); + return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), OK); + } catch (Exception e) { + log.error("Runtime error while trying to create new schedule", e); + return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST); + } + } + @RequestMapping(value = "type/medication", method = RequestMethod.GET, params = {"patientUuid", "forDate"}) @ResponseBody public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid, diff --git a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java index 149581c..89b5923 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java +++ b/omod/src/main/java/org/openmrs/module/ipd/factory/MedicationAdministrationFactory.java @@ -7,10 +7,7 @@ import org.openmrs.module.ipd.api.model.MedicationAdministration; import org.openmrs.module.ipd.api.model.MedicationAdministrationNote; import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer; -import org.openmrs.module.ipd.contract.MedicationAdministrationNoteRequest; -import org.openmrs.module.ipd.contract.MedicationAdministrationPerformerRequest; -import org.openmrs.module.ipd.contract.MedicationAdministrationRequest; -import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.ipd.contract.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java index 50f3ca8..98c27d0 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDScheduleService.java @@ -13,4 +13,5 @@ public interface IPDScheduleService { List getMedicationSlots(String patientUuid, ServiceType serviceType, LocalDate forDate); List getMedicationSlots(String patientUuid, ServiceType serviceType); List getMedicationSlots(String patientUuid, ServiceType serviceType, List orderUuids); + Schedule updateMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest); } \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 31dba1f..14110d7 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -8,6 +8,7 @@ import org.openmrs.api.OrderService; import org.openmrs.api.PatientService; import org.openmrs.api.VisitService; +import org.openmrs.api.context.Context; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.ServiceType; @@ -25,9 +26,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; import static org.openmrs.module.ipd.api.model.Slot.SlotStatus.SCHEDULED; @@ -103,4 +103,16 @@ public List getMedicationSlots(String patientUuid, ServiceType serviceType return Collections.emptyList(); return slotService.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subjectReference.get(), concept, orderUuids); } + + @Override + public Schedule updateMedicationSchedule(ScheduleMedicationRequest scheduleMedicationRequest) { + voidExistingMedicationSlotsForOrder(scheduleMedicationRequest.getPatientUuid(),scheduleMedicationRequest.getOrderUuid(),""); + return saveMedicationSchedule(scheduleMedicationRequest); + } + + private void voidExistingMedicationSlotsForOrder(String patientUuid,String orderUuid,String voidReason){ + List existingSlots = getMedicationSlots(patientUuid,ServiceType.MEDICATION_REQUEST,new ArrayList<>(Arrays.asList(new String[]{orderUuid}))); + existingSlots.stream().forEach(slot -> slotService.voidSlot(slot,voidReason)); + } + } \ No newline at end of file From 42d8e11b99328d4d3f9d89ec3fc127019a47c835 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Tue, 2 Jan 2024 16:24:33 +0530 Subject: [PATCH 45/50] IPD Drug Order schedule update API changes --- .../main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java | 1 - .../openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java | 5 ----- 2 files changed, 6 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 392e062..4b2707c 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -24,5 +24,4 @@ public interface SlotDAO { List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); - void deleteSlotsByOrderUUID(String orderUuid); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index afbf9d5..59ecb5a 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -83,9 +83,4 @@ public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere return query.getResultList(); } - - @Override - public void deleteSlotsByOrderUUID(String orderUuid) { - - } } From fa9ee2933acbd35e17b995698af3a7f880ab3657 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Tue, 2 Jan 2024 16:27:57 +0530 Subject: [PATCH 46/50] IPD Drug Order schedule update API changes --- .../main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java | 7 +++---- .../module/ipd/service/impl/SlotTimeCreationService.java | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 4b2707c..36546c3 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -11,17 +11,16 @@ @Repository public interface SlotDAO { - + Slot getSlot(Integer slotId) throws DAOException; Slot getSlotByUUID(String uuid) throws DAOException; Slot saveSlot(Slot slot) throws DAOException; - List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); + List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); - -} +} \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 5dff8fc..1a89c4f 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -113,7 +113,6 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche ) )); - // Assuming you have a Map> called groupedByDateAndEpoch List> sortedList = groupedByDateAndEpoch.entrySet().stream() .sorted(Map.Entry.comparingByKey()) // Sort by LocalDate in ascending order .map(Map.Entry::getValue) // Get the list of Longs for each entry From 8df08c55f9d93f84c60e4f72956840c8cdb5d4ff Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Wed, 3 Jan 2024 23:06:45 +0530 Subject: [PATCH 47/50] IPD Drug Order schedule update API changes --- api/pom.xml | 6 ------ .../module/ipd/api/model/IPDDrugOrder.java | 21 ------------------- .../contract/DrugOrderScheduleResponse.java | 2 +- .../ipd/contract/IPDDrugOrderResponse.java | 6 ++---- .../controller/IPDDrugOrderController.java | 2 +- .../module/ipd}/model/DrugOrderSchedule.java | 3 ++- .../module/ipd/model/IPDDrugOrder.java | 21 +++++++++++++++++++ .../ipd/service/IPDDrugOrderService.java | 2 +- .../service/impl/IPDDrugOrderServiceImpl.java | 7 +++---- .../service/impl/SlotTimeCreationService.java | 3 +-- pom.xml | 6 ------ 11 files changed, 32 insertions(+), 47 deletions(-) delete mode 100644 api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java rename {api/src/main/java/org/openmrs/module/ipd/api => omod/src/main/java/org/openmrs/module/ipd}/model/DrugOrderSchedule.java (80%) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java diff --git a/api/pom.xml b/api/pom.xml index af643df..7dfdbee 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -140,12 +140,6 @@ provided - - org.bahmni.module - bahmnicore-api - provided - - org.bahmni.module medication-administration-api diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java b/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java deleted file mode 100644 index 5e4ea3a..0000000 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/IPDDrugOrder.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.openmrs.module.ipd.api.model; - -import lombok.*; -import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class IPDDrugOrder { - - private BahmniDrugOrder bahmniDrugOrder; - private DrugOrderSchedule drugOrderSchedule; - - public static IPDDrugOrder createFrom(BahmniDrugOrder bahmniDrugOrder,DrugOrderSchedule drugOrderSchedule){ - return IPDDrugOrder.builder(). - bahmniDrugOrder(bahmniDrugOrder). - drugOrderSchedule(drugOrderSchedule). - build(); - } -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java index dcf18d8..27a5f98 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java @@ -1,7 +1,7 @@ package org.openmrs.module.ipd.contract; import lombok.*; -import org.openmrs.module.ipd.api.model.DrugOrderSchedule; +import org.openmrs.module.ipd.model.DrugOrderSchedule; import org.openmrs.module.webservices.rest.web.representation.Representation; import java.util.List; diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java index 739c2d5..0103fe3 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java @@ -2,7 +2,7 @@ import lombok.*; import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction; -import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.model.IPDDrugOrder; @Getter @Setter @@ -11,14 +11,12 @@ @AllArgsConstructor public class IPDDrugOrderResponse { - private VisitInfoResponse visit; private EncounterTransaction.DrugOrder drugOrder; private DrugOrderScheduleResponse drugOrderSchedule; public static IPDDrugOrderResponse createFrom(IPDDrugOrder ipdDrugOrder) { IPDDrugOrderResponse ipdDrugOrderResponse= IPDDrugOrderResponse.builder(). - visit(VisitInfoResponse.createFrom(ipdDrugOrder.getBahmniDrugOrder().getVisit())). - drugOrder(ipdDrugOrder.getBahmniDrugOrder().getDrugOrder()).build(); + drugOrder(ipdDrugOrder.getDrugOrder()).build(); if (ipdDrugOrder.getDrugOrderSchedule() != null){ ipdDrugOrderResponse.setDrugOrderSchedule(DrugOrderScheduleResponse.createFrom(ipdDrugOrder.getDrugOrderSchedule())); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java index 53ab897..9972913 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java @@ -2,7 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.bahmni.module.bahmnicore.util.BahmniDateUtil; -import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.model.IPDDrugOrder; import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; import org.openmrs.module.ipd.service.IPDDrugOrderService; import org.openmrs.module.webservices.rest.web.RestConstants; diff --git a/api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java b/omod/src/main/java/org/openmrs/module/ipd/model/DrugOrderSchedule.java similarity index 80% rename from api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java rename to omod/src/main/java/org/openmrs/module/ipd/model/DrugOrderSchedule.java index 7fa40a5..de94347 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/model/DrugOrderSchedule.java +++ b/omod/src/main/java/org/openmrs/module/ipd/model/DrugOrderSchedule.java @@ -1,6 +1,7 @@ -package org.openmrs.module.ipd.api.model; +package org.openmrs.module.ipd.model; import lombok.*; +import org.openmrs.module.ipd.api.model.Slot; import java.util.List; diff --git a/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java b/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java new file mode 100644 index 0000000..d88ba30 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java @@ -0,0 +1,21 @@ +package org.openmrs.module.ipd.model; + +import lombok.*; +import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction.DrugOrder; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IPDDrugOrder { + + private DrugOrder drugOrder; + private DrugOrderSchedule drugOrderSchedule; + + public static IPDDrugOrder createFrom(DrugOrder drugOrder,DrugOrderSchedule drugOrderSchedule){ + return IPDDrugOrder.builder(). + drugOrder(drugOrder). + drugOrderSchedule(drugOrderSchedule). + build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java index 61d525c..6abc974 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java @@ -1,6 +1,6 @@ package org.openmrs.module.ipd.service; -import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.model.IPDDrugOrder; import java.util.Date; import java.util.List; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java index 8833f79..464ca98 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java @@ -9,11 +9,10 @@ import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniOrderAttribute; import org.openmrs.module.bahmniemrapi.drugorder.mapper.BahmniDrugOrderMapper; import org.openmrs.module.bahmniemrapi.encountertransaction.contract.BahmniObservation; -import org.openmrs.module.ipd.api.model.DrugOrderSchedule; -import org.openmrs.module.ipd.api.model.IPDDrugOrder; +import org.openmrs.module.ipd.model.DrugOrderSchedule; +import org.openmrs.module.ipd.model.IPDDrugOrder; import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; import org.openmrs.module.ipd.service.IPDDrugOrderService; import org.openmrs.module.ipd.service.IPDScheduleService; import org.springframework.beans.factory.annotation.Autowired; @@ -65,7 +64,7 @@ private List getIPDDrugOrders(String patientUuid, List bahmniDrugOrders=sortDrugOrdersAccordingToTheirSortWeight(bahmniDrugOrders); Map drugOrderScheduleByOrders = getDrugOrderScheduleForOrders(patientUuid, bahmniDrugOrders); - return bahmniDrugOrders.stream().map(bahmniDrugOrder -> IPDDrugOrder.createFrom(bahmniDrugOrder,drugOrderScheduleByOrders.get(bahmniDrugOrder.getUuid()))).collect(Collectors.toList()); + return bahmniDrugOrders.stream().map(bahmniDrugOrder -> IPDDrugOrder.createFrom(bahmniDrugOrder.getDrugOrder(),drugOrderScheduleByOrders.get(bahmniDrugOrder.getUuid()))).collect(Collectors.toList()); } catch (IOException e) { throw new RuntimeException("Could not parse drug order", e); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 1a89c4f..24b4361 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -2,8 +2,7 @@ import org.openmrs.DrugOrder; import org.openmrs.api.impl.BaseOpenmrsService; -import org.openmrs.module.ipd.api.model.DrugOrderSchedule; -import org.openmrs.module.ipd.api.model.Schedule; +import org.openmrs.module.ipd.model.DrugOrderSchedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; import org.springframework.stereotype.Component; diff --git a/pom.xml b/pom.xml index 98cc14a..1a8a3be 100644 --- a/pom.xml +++ b/pom.xml @@ -165,12 +165,6 @@ emrapi-api ${emrapi-omod.version} provided - - - org.hamcrest - hamcrest-library - - From 1b6c4b55e75b6cee1b1e00f2cbdeceb87034d853 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Thu, 4 Jan 2024 12:13:06 +0530 Subject: [PATCH 48/50] Fix to convert time to UTC intead of Local Time --- .../ipd/api/dao/impl/HibernateSlotDAO.java | 7 ++++--- .../service/impl/SlotTimeCreationService.java | 17 +++++++++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 59ecb5a..241e4f7 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -47,7 +47,7 @@ public Slot saveSlot(Slot slot) throws DAOException { @Override public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType) { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType"); + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType and slot.voided=0"); query.setParameter("subject", subject); query.setParameter("forYear", forDate.getYear()); @@ -61,7 +61,7 @@ public List getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference @Override public List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) { Query query = sessionFactory.getCurrentSession() - .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.serviceType=:serviceType"); + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.serviceType=:serviceType and slot.voided=0"); query.setParameter("subject", subject); query.setParameter("serviceType", serviceType); @@ -75,7 +75,8 @@ public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere .createQuery("FROM Slot slot " + "WHERE slot.schedule.subject=:subject and " + "slot.serviceType=:serviceType and" - + " slot.order.uuid IN :orderUuids"); + + " slot.order.uuid IN :orderUuids and " + + "slot.voided = 0"); query.setParameter("subject", subject); query.setParameter("serviceType", serviceType); diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 24b4361..ef8efc9 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -2,6 +2,7 @@ import org.openmrs.DrugOrder; import org.openmrs.api.impl.BaseOpenmrsService; +import org.openmrs.module.ipd.api.util.DateTimeUtil; import org.openmrs.module.ipd.model.DrugOrderSchedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.contract.ScheduleMedicationRequest; @@ -103,31 +104,31 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche for (DrugOrder drugOrder : slotsByOrder.keySet()) { Double frequencyPerDay = drugOrder.getFrequency().getFrequencyPerDay(); String frequency=drugOrder.getFrequency().getName(); - Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream() + Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream() .collect(Collectors.groupingBy( obj -> obj.getStartDateTime().toLocalDate(), Collectors.mapping( - obj -> obj.getStartDateTime().toEpochSecond(java.time.ZoneOffset.UTC), + obj -> obj.getStartDateTime(), Collectors.toList() ) )); - List> sortedList = groupedByDateAndEpoch.entrySet().stream() + List> sortedList = groupedByDateAndEpoch.entrySet().stream() .sorted(Map.Entry.comparingByKey()) // Sort by LocalDate in ascending order .map(Map.Entry::getValue) // Get the list of Longs for each entry .collect(Collectors.toList()); // Collect the list of lists into a single ArrayList DrugOrderSchedule drugOrderSchedule=new DrugOrderSchedule(); if (START_TIME_FREQUENCIES.contains(frequency)){ - drugOrderSchedule.setSlotStartTime(sortedList.get(0).get(0)); + drugOrderSchedule.setSlotStartTime(DateTimeUtil.convertLocalDateTimeToUTCEpoc(sortedList.get(0).get(0))); } else if (sortedList.get(0).size() == frequencyPerDay || (sortedList.size() == 1)) { - drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(0)); + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); } else { - drugOrderSchedule.setFirstDaySlotsStartTime(sortedList.get(0)); - drugOrderSchedule.setRemainingDaySlotsStartTime(sortedList.get(sortedList.size() - 1)); + drugOrderSchedule.setFirstDaySlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + drugOrderSchedule.setRemainingDaySlotsStartTime(sortedList.get(sortedList.size() - 1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); if (sortedList.size() > 2) { - drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(1)); + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); } } drugOrderSchedule.setSlots(slotsByOrder.get(drugOrder)); From 8fb2b199c17c25c399b98e31f3f6cd4d72667e36 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Thu, 4 Jan 2024 14:01:41 +0530 Subject: [PATCH 49/50] Kavitha | refactored treatments API to include emergency medications --- .../openmrs/module/ipd/api/dao/SlotDAO.java | 5 +- .../ipd/api/dao/impl/HibernateSlotDAO.java | 13 +++++ .../module/ipd/api/service/SlotService.java | 4 +- .../ipd/api/service/impl/SlotServiceImpl.java | 9 ++-- .../contract/DrugOrderScheduleResponse.java | 18 +++---- .../ipd/contract/IPDTreatmentsResponse.java | 28 +++++++++++ .../ipd/contract/VisitInfoResponse.java | 22 -------- .../controller/IPDDrugOrderController.java | 49 ------------------ .../ipd/controller/IPDVisitController.java | 48 ++++++++++++++++++ .../ipd/service/IPDDrugOrderService.java | 11 ---- .../module/ipd/service/IPDVisitService.java | 14 ++++++ .../service/impl/IPDScheduleServiceImpl.java | 1 - ...viceImpl.java => IPDVisitServiceImpl.java} | 50 +++++++++++++++---- 13 files changed, 164 insertions(+), 108 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java rename omod/src/main/java/org/openmrs/module/ipd/service/impl/{IPDDrugOrderServiceImpl.java => IPDVisitServiceImpl.java} (71%) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 36546c3..939b1f8 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.dao; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.db.DAOException; @@ -23,4 +24,6 @@ public interface SlotDAO { List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); -} \ No newline at end of file + + List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType); +} diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 241e4f7..a494c1a 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -2,6 +2,7 @@ import org.hibernate.query.Query; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; @@ -84,4 +85,16 @@ public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere return query.getResultList(); } + + @Override + public List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.schedule.visit=:visit and slot.serviceType=:serviceType"); + + query.setParameter("subject", subject); + query.setParameter("visit", visit); + query.setParameter("serviceType", serviceType); + + return query.getResultList(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index e4fb189..46725a5 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -1,8 +1,8 @@ package org.openmrs.module.ipd.api.service; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; @@ -30,4 +30,6 @@ public interface SlotService extends OpenmrsService { List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); void voidSlot(Slot slot,String voidReason); + + List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 8767cea..3eb063a 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -2,9 +2,9 @@ import org.openmrs.Concept; import org.openmrs.api.context.Context; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.api.APIException; @@ -16,8 +16,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; @@ -75,4 +73,9 @@ public void voidSlot(Slot slot, String voidReason) throws APIException { slotDAO.saveSlot(slot); } + + @Override + public List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) { + return slotDAO.getSlotsByPatientAndVisitAndServiceType(subject, visit, serviceType); + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java index 27a5f98..c7ee133 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java @@ -2,10 +2,8 @@ import lombok.*; import org.openmrs.module.ipd.model.DrugOrderSchedule; -import org.openmrs.module.webservices.rest.web.representation.Representation; import java.util.List; -import java.util.stream.Collectors; @Getter @Builder @@ -17,15 +15,15 @@ public class DrugOrderScheduleResponse { private List dayWiseSlotsStartTime; private List remainingDaySlotsStartTime; private Long slotStartTime; - private List slots; + private Boolean medicationAdministrationStarted; public static DrugOrderScheduleResponse createFrom(DrugOrderSchedule drugOrderSchedule){ - return DrugOrderScheduleResponse.builder(). - firstDaySlotsStartTime(drugOrderSchedule.getFirstDaySlotsStartTime()). - dayWiseSlotsStartTime(drugOrderSchedule.getDayWiseSlotsStartTime()). - remainingDaySlotsStartTime(drugOrderSchedule.getRemainingDaySlotsStartTime()). - slotStartTime(drugOrderSchedule.getSlotStartTime()). - slots(drugOrderSchedule.getSlots().stream().map(slot -> MedicationSlotResponse.createFrom(slot, Representation.REF)).collect(Collectors.toList())). - build(); + return DrugOrderScheduleResponse.builder(). + firstDaySlotsStartTime(drugOrderSchedule.getFirstDaySlotsStartTime()). + dayWiseSlotsStartTime(drugOrderSchedule.getDayWiseSlotsStartTime()). + remainingDaySlotsStartTime(drugOrderSchedule.getRemainingDaySlotsStartTime()). + slotStartTime(drugOrderSchedule.getSlotStartTime()). + medicationAdministrationStarted(drugOrderSchedule.getSlots().stream().anyMatch(slot -> slot.getMedicationAdministration() != null)). + build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java new file mode 100644 index 0000000..1b9e195 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java @@ -0,0 +1,28 @@ +package org.openmrs.module.ipd.contract; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IPDTreatmentsResponse { + + private List ipdDrugOrders; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private List emergencyMedications; + + public static IPDTreatmentsResponse createFrom(List ipdDrugOrders, List emergencyMedications) { + return IPDTreatmentsResponse.builder() + .ipdDrugOrders(ipdDrugOrders) + .emergencyMedications(emergencyMedications) + .build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java deleted file mode 100644 index 13d5f85..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/VisitInfoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.openmrs.module.ipd.contract; - -import lombok.*; -import org.openmrs.module.bahmniemrapi.visit.contract.VisitData; - -import java.util.Date; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class VisitInfoResponse { - private String uuid; - private Date startDateTime; - - public static VisitInfoResponse createFrom(VisitData visitData){ - return VisitInfoResponse.builder(). - uuid(visitData.getUuid()). - startDateTime(visitData.getStartDateTime()). - build(); - } -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java deleted file mode 100644 index 9972913..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.openmrs.module.ipd.controller; - -import lombok.extern.slf4j.Slf4j; -import org.bahmni.module.bahmnicore.util.BahmniDateUtil; -import org.openmrs.module.ipd.model.IPDDrugOrder; -import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; -import org.openmrs.module.ipd.service.IPDDrugOrderService; -import org.openmrs.module.webservices.rest.web.RestConstants; -import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import java.text.ParseException; -import java.util.*; -import java.util.stream.Collectors; - -@Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd") -@Slf4j -public class IPDDrugOrderController extends BaseRestController { - - private IPDDrugOrderService ipdDrugOrderService; - - @Autowired - public IPDDrugOrderController(IPDDrugOrderService ipdDrugOrderService) { - this.ipdDrugOrderService = ipdDrugOrderService; - } - - @RequestMapping(value = "/drugOrders", method = RequestMethod.GET) - @ResponseBody - public List getVisitWisePrescribedAndOtherActiveOrders( - @RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "numberOfVisits", required = false) Integer numberOfVisits, - @RequestParam(value = "visitUuids", required = false) List visitUuids, - @RequestParam(value = "startDate", required = false) String startDateStr, - @RequestParam(value = "endDate", required = false) String endDateStr, - @RequestParam(value = "includes", required = false) List includes, - @RequestParam(value = "getEffectiveOrdersOnly", required = false) Boolean getEffectiveOrdersOnly) throws ParseException { - - Date startDate = BahmniDateUtil.convertToDate(startDateStr, BahmniDateUtil.DateFormatType.UTC); - Date endDate = BahmniDateUtil.convertToDate(endDateStr, BahmniDateUtil.DateFormatType.UTC); - - List prescribedOrders = ipdDrugOrderService.getPrescribedOrders(visitUuids, patientUuid, true, numberOfVisits, startDate, endDate, Boolean.TRUE.equals(getEffectiveOrdersOnly)); - return prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList()); - } -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java new file mode 100644 index 0000000..d6857e6 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java @@ -0,0 +1,48 @@ +package org.openmrs.module.ipd.controller; + +import lombok.extern.slf4j.Slf4j; +import org.openmrs.module.ipd.api.model.ServiceType; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; +import org.openmrs.module.ipd.contract.IPDTreatmentsResponse; +import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.ipd.model.IPDDrugOrder; +import org.openmrs.module.ipd.service.IPDVisitService; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; + +@Controller +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipdVisit/{visitUuid}") +@Slf4j +public class IPDVisitController extends BaseRestController { + + private IPDVisitService ipdVisitService; + + @Autowired + public IPDVisitController(IPDVisitService ipdVisitService) { + this.ipdVisitService = ipdVisitService; + } + + @RequestMapping(value = "/medication", method = RequestMethod.GET) + @ResponseBody + public IPDTreatmentsResponse getVisitWiseMedications ( + @PathVariable("visitUuid") String visitUuid, + @RequestParam(value = "includes", required = false) List includes) throws ParseException { + + List prescribedOrders = ipdVisitService.getPrescribedOrders(visitUuid, true, null, null, null, false); + List prescribedOrderResponse = prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList()); + List emergencyMedications = null; + if (includes != null && includes.contains("emergencyMedications")) { + List emergencyMedicationSlots = ipdVisitService.getMedicationSlots(visitUuid, ServiceType.EMERGENCY_MEDICATION_REQUEST); + emergencyMedications = emergencyMedicationSlots.stream().map(slot -> MedicationAdministrationResponse.createFrom(slot.getMedicationAdministration())).collect(Collectors.toList()); + } + return IPDTreatmentsResponse.createFrom(prescribedOrderResponse, emergencyMedications); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java deleted file mode 100644 index 6abc974..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.openmrs.module.ipd.service; - -import org.openmrs.module.ipd.model.IPDDrugOrder; - -import java.util.Date; -import java.util.List; - -public interface IPDDrugOrderService { - - List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly); -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java new file mode 100644 index 0000000..c000f32 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java @@ -0,0 +1,14 @@ +package org.openmrs.module.ipd.service; + +import org.openmrs.module.ipd.model.IPDDrugOrder; +import org.openmrs.module.ipd.api.model.ServiceType; +import org.openmrs.module.ipd.api.model.Slot; + +import java.util.Date; +import java.util.List; + +public interface IPDVisitService { + + List getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly); + List getMedicationSlots(String visitUuid, ServiceType serviceType); +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 14110d7..64cbc5c 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -8,7 +8,6 @@ import org.openmrs.api.OrderService; import org.openmrs.api.PatientService; import org.openmrs.api.VisitService; -import org.openmrs.api.context.Context; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.ServiceType; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java similarity index 71% rename from omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java rename to omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java index 464ca98..af9fb09 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java @@ -4,7 +4,10 @@ import org.bahmni.module.bahmnicore.service.BahmniObsService; import org.openmrs.Concept; import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.Visit; import org.openmrs.api.ConceptService; +import org.openmrs.api.VisitService; import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniOrderAttribute; import org.openmrs.module.bahmniemrapi.drugorder.mapper.BahmniDrugOrderMapper; @@ -13,7 +16,10 @@ import org.openmrs.module.ipd.model.IPDDrugOrder; import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.service.IPDDrugOrderService; +import org.openmrs.module.ipd.api.model.*; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.openmrs.module.ipd.api.service.SlotService; +import org.openmrs.module.ipd.service.IPDVisitService; import org.openmrs.module.ipd.service.IPDScheduleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -25,7 +31,7 @@ @Service @Transactional -public class IPDDrugOrderServiceImpl implements IPDDrugOrderService { +public class IPDVisitServiceImpl implements IPDVisitService { private BahmniDrugOrderService drugOrderService; private IPDScheduleService ipdScheduleService; @@ -33,27 +39,39 @@ public class IPDDrugOrderServiceImpl implements IPDDrugOrderService { private BahmniObsService bahmniObsService; private ConceptService conceptService; private BahmniDrugOrderMapper bahmniDrugOrderMapper; + private ReferenceService referenceService; + private VisitService visitService; + private SlotService slotService; @Autowired - public IPDDrugOrderServiceImpl(BahmniDrugOrderService drugOrderService, - IPDScheduleService ipdScheduleService, - SlotTimeCreationService slotTimeCreationService, - BahmniObsService bahmniObsService, - ConceptService conceptService) { + public IPDVisitServiceImpl(BahmniDrugOrderService drugOrderService, + IPDScheduleService ipdScheduleService, + SlotTimeCreationService slotTimeCreationService, + BahmniObsService bahmniObsService, + ConceptService conceptService, + ReferenceService referenceService, + VisitService visitService, + SlotService slotService) { this.drugOrderService = drugOrderService; this.ipdScheduleService = ipdScheduleService; this.slotTimeCreationService = slotTimeCreationService; this.bahmniObsService = bahmniObsService; this.conceptService = conceptService; this.bahmniDrugOrderMapper = new BahmniDrugOrderMapper(); + this.referenceService = referenceService; + this.visitService = visitService; + this.slotService = slotService; } @Override - public List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) { - List prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuids, patientUuid, includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly); - return getIPDDrugOrders(patientUuid, prescribedDrugOrders); + public List getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) { + List visitUuidsList = new ArrayList<>(); + visitUuidsList.add(visitUuid); + Visit visit = visitService.getVisitByUuid(visitUuid); + List prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuidsList, visit.getPatient().getUuid(), includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly); + return getIPDDrugOrders(visit.getPatient().getUuid(), prescribedDrugOrders); } private List getIPDDrugOrders(String patientUuid, List drugOrders) { @@ -124,4 +142,16 @@ private Collection getOrdAttributeConcepts() { Concept orderAttribute = conceptService.getConceptByName(BahmniOrderAttribute.ORDER_ATTRIBUTES_CONCEPT_SET_NAME); return orderAttribute == null ? Collections.EMPTY_LIST : orderAttribute.getSetMembers(); } + + @Override + public List getMedicationSlots(String visitUuid, ServiceType serviceType) { + Visit visit = visitService.getVisitByUuid(visitUuid); + Concept concept = conceptService.getConceptByName(serviceType.conceptName()); + Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), visit.getPatient().getUuid()); + + if(!subjectReference.isPresent()) + return Collections.emptyList(); + + return slotService.getSlotsByPatientAndVisitAndServiceType(subjectReference.get(), visit, concept); + } } From c97cee49a7fa5030a3e7c294e1856ed4a7732bd0 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Fri, 5 Jan 2024 11:33:28 +0530 Subject: [PATCH 50/50] Kavitha,Kalai | add provider as part of drug order response --- .../openmrs/module/ipd/contract/IPDDrugOrderResponse.java | 5 ++++- .../java/org/openmrs/module/ipd/model/IPDDrugOrder.java | 8 +++++--- .../module/ipd/service/impl/IPDVisitServiceImpl.java | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java index 0103fe3..5ccb047 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDDrugOrderResponse.java @@ -12,11 +12,14 @@ public class IPDDrugOrderResponse { private EncounterTransaction.DrugOrder drugOrder; + private EncounterTransaction.Provider provider; private DrugOrderScheduleResponse drugOrderSchedule; public static IPDDrugOrderResponse createFrom(IPDDrugOrder ipdDrugOrder) { IPDDrugOrderResponse ipdDrugOrderResponse= IPDDrugOrderResponse.builder(). - drugOrder(ipdDrugOrder.getDrugOrder()).build(); + drugOrder(ipdDrugOrder.getBahmniDrugOrder().getDrugOrder()) + .provider(ipdDrugOrder.getBahmniDrugOrder().getProvider()) + .build(); if (ipdDrugOrder.getDrugOrderSchedule() != null){ ipdDrugOrderResponse.setDrugOrderSchedule(DrugOrderScheduleResponse.createFrom(ipdDrugOrder.getDrugOrderSchedule())); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java b/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java index d88ba30..d4c809d 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java +++ b/omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java @@ -1,6 +1,8 @@ package org.openmrs.module.ipd.model; import lombok.*; +import org.openmrs.Provider; +import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction.DrugOrder; @Getter @@ -9,12 +11,12 @@ @AllArgsConstructor public class IPDDrugOrder { - private DrugOrder drugOrder; + private BahmniDrugOrder bahmniDrugOrder; private DrugOrderSchedule drugOrderSchedule; - public static IPDDrugOrder createFrom(DrugOrder drugOrder,DrugOrderSchedule drugOrderSchedule){ + public static IPDDrugOrder createFrom(BahmniDrugOrder bahmniDrugOrder,DrugOrderSchedule drugOrderSchedule){ return IPDDrugOrder.builder(). - drugOrder(drugOrder). + bahmniDrugOrder(bahmniDrugOrder). drugOrderSchedule(drugOrderSchedule). build(); } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java index af9fb09..def90cb 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java @@ -82,7 +82,7 @@ private List getIPDDrugOrders(String patientUuid, List bahmniDrugOrders=sortDrugOrdersAccordingToTheirSortWeight(bahmniDrugOrders); Map drugOrderScheduleByOrders = getDrugOrderScheduleForOrders(patientUuid, bahmniDrugOrders); - return bahmniDrugOrders.stream().map(bahmniDrugOrder -> IPDDrugOrder.createFrom(bahmniDrugOrder.getDrugOrder(),drugOrderScheduleByOrders.get(bahmniDrugOrder.getUuid()))).collect(Collectors.toList()); + return bahmniDrugOrders.stream().map(bahmniDrugOrder -> IPDDrugOrder.createFrom(bahmniDrugOrder,drugOrderScheduleByOrders.get(bahmniDrugOrder.getUuid()))).collect(Collectors.toList()); } catch (IOException e) { throw new RuntimeException("Could not parse drug order", e);