renalware-forms 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 347e9f7644d2f72db868d81b7c16a22403285db8bed1bdf545041f53fcae2b79
4
+ data.tar.gz: b909b6addb49a49c618324e41c34cadb19eb04ce9140d1a48562cbbab0deea0f
5
+ SHA512:
6
+ metadata.gz: d2d1937839e25b9ceabc0e4eb03e21e571a831f795fce8cea0194cdfd5f6c2147d53d18174bee50125854872bcee892c865522cecbe7bb0a8c46b573ea2d0440
7
+ data.tar.gz: 95f1eb71ec37fbaac84f61956a9193812feb613ee9188966cf1c4d139d10e5fbb30d4f1ba7202b114a2f7a346a5ec3c749637a0f919bfe7d1cf59d8a9fc2524a
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2020 Tim Crowe
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # Renalware::Forms
2
+
3
+ This gem
4
+ - is a library of pre-defined generic PDF forms that Renalware can populate and present
5
+ to the user, for example when a user needs to print and sign a list of drugs to be delivered for
6
+ homecare.
7
+ - provides a API for creating these PDFs, and others (see renalware-forms-* gems) so that form
8
+ creation is abstracted from Renalware.
9
+
10
+ The PDFs are constructed using Prawn, chosen mainly for its speed.
11
+
12
+ The gem exposes an API for a caller to specify the type and version of the PDF they require, along
13
+ with data to populate it (patient name and address etc).
14
+
15
+ See other gems ie `renalware-forms-<provider>` for instances where we have built custom forms
16
+ based on this gem.
17
+
18
+ ## Future enhancements
19
+
20
+ To be more extensible and remove the need for developer input when adding new forms, an alternative
21
+ implementation is possible where the request to create for example "Fresenius Homecare
22
+ Supply Version 1.1" will load a PDF file with the corrersponding name. If the PDF is created for
23
+ example in Acrobat or LibreOffice and specifically-named form fields are inserted, these can be
24
+ populated with the supplied the data the caller also provides. It could even allow the path to a
25
+ custom PDF form to be supplied by the caller. Using a shared library of PDF files stored inside this
26
+ gem will provide more re-usue opportunity across sites, though there could be nothing stopping a
27
+ hospital developing a custom form stored outside of this gem, and not sharing it.
28
+
29
+ ## Installation
30
+ Add this line to your application's Gemfile:
31
+
32
+ ```ruby
33
+ gem 'renalware-forms'
34
+ ```
35
+
36
+ And then execute:
37
+ ```bash
38
+ $ bundle
39
+ ```
40
+
41
+ Or install it yourself as:
42
+ ```bash
43
+ $ gem install renalware-forms
44
+ ```
45
+ ## Testing
46
+
47
+ You can generate example instances of all the PDFs in this gem from the command line.
48
+
49
+ You can see a list available tasks:
50
+
51
+ ```bash
52
+ $ bundle exec rake -T
53
+ ```
54
+
55
+ For example:
56
+
57
+ ```bash
58
+ $ bundle exec rake forms:generic:homecare:v1
59
+ ```
60
+
61
+ will create the version 1 PDF with test data and open it in Linux (will require a change
62
+ for it to open on a Mac).
63
+
64
+ ## License
65
+
66
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ begin
2
+ require "bundler/setup"
3
+ rescue LoadError
4
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
5
+ end
6
+
7
+ require "rdoc/task"
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = "rdoc"
11
+ rdoc.title = "Renalware::Forms"
12
+ rdoc.options << "--line-numbers"
13
+ rdoc.rdoc_files.include("README.md")
14
+ rdoc.rdoc_files.include("lib/**/*.rb")
15
+ end
16
+
17
+ Dir.glob("lib/tasks/**/*.rake").each { |r| load r }
18
+
19
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "prawn"
4
+ require "prawn/table"
5
+ require "attr_extras"
6
+ require "active_support"
7
+
8
+ module Renalware
9
+ module Forms
10
+ extend ActiveSupport::Autoload
11
+
12
+ autoload :Helpers
13
+ autoload :Base
14
+ autoload :Homecare
15
+ autoload :Generic
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms
4
+ class Base
5
+ include Prawn::View
6
+ EMPTY_CHECKBOX = "o " # in ZapfDingbats
7
+ CHECKBOX = "3 "
8
+
9
+ # lower case o is an empty checkbox in ZapfDingbats
10
+ def cell_with_leading_checkbox(text, checked: false, **options)
11
+ if checked
12
+ {
13
+ content: "<font name='ZapfDingbats'>#{CHECKBOX}</font>#{text}",
14
+ inline_format: true,
15
+ **options
16
+ }
17
+ else
18
+ {
19
+ content: "<font name='ZapfDingbats'>#{EMPTY_CHECKBOX}</font>#{text}",
20
+ inline_format: true,
21
+ **options
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms
4
+ module Generic
5
+ extend ActiveSupport::Autoload
6
+
7
+ autoload :Homecare
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms
4
+ module Generic
5
+ module Homecare
6
+ extend ActiveSupport::Autoload
7
+
8
+ autoload :V1
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms::Generic
4
+ module Homecare
5
+ module V1
6
+ extend ActiveSupport::Autoload
7
+
8
+ autoload :Base
9
+ autoload :Document
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms::Generic
4
+ module Homecare::V1
5
+ class Base < Renalware::Forms::Base
6
+ pattr_initialize :document, :args
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms::Generic
4
+ module Homecare::V1
5
+ class Document < Base
6
+ pattr_initialize :args
7
+
8
+ def self.build(args)
9
+ new(args).tap(&:build)
10
+ end
11
+
12
+ def document
13
+ @document ||= Prawn::Document.new(page_size: "A4", page_layout: :portrait, margin: 15)
14
+ end
15
+
16
+ def build; end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tempfile"
4
+
5
+ module Renalware
6
+ module Forms
7
+ module Helpers
8
+ def render_and_open(prawn_pdf_doc)
9
+ filename = File.join(Dir.pwd, "./tmp", "#{Time.now.to_i}.pdf")
10
+ prawn_pdf_doc.render_file filename
11
+ open_pdf filename
12
+ end
13
+
14
+ def open_pdf(filename)
15
+ # Open the test file in ubuntu - just use "open" if mac?
16
+ # You may need to fo
17
+ # `sudo apt-get install appmenu-gtk2-module appmenu-gtk3-module`
18
+
19
+ `gio open #{filename}`
20
+ rescue StandardError
21
+ nil
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "prawn"
4
+ require "prawn/table"
5
+ require "attr_extras"
6
+ require "active_support"
7
+
8
+ module Renalware::Forms
9
+ module Homecare
10
+ extend ActiveSupport::Autoload
11
+
12
+ autoload :Pdf
13
+ autoload :Args
14
+ autoload :Generic
15
+ end
16
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "virtus"
4
+ require "active_model"
5
+
6
+ module Renalware::Forms
7
+ class Homecare::Args
8
+ include Virtus::Model
9
+ include ActiveModel::Validations
10
+
11
+ # The first 2 attrbutes are used to drive what PDF to build
12
+ attribute :provider, String
13
+ attribute :version, Integer
14
+
15
+ attribute :title, String
16
+ attribute :given_name, String
17
+ attribute :family_name, String
18
+ attribute :nhs_number, String
19
+ attribute :born_on, Date
20
+ attribute :fmc_patient, String
21
+ attribute :telephone, String
22
+ attribute :hospital_number, String
23
+ attribute :address, String
24
+ attribute :postcode, String
25
+ attribute :modality, String
26
+ attribute :prescriber_name, String
27
+ attribute :prescription_date, Date
28
+ attribute :hospital_name, String
29
+ attribute :hospital_department, String
30
+ attribute :hospital_address, Array[String]
31
+ attribute :po_number, String
32
+ attribute :no_known_allergies, Boolean
33
+ attribute :allergies, Array[String]
34
+ attribute :administration_route, String
35
+ attribute :administration_frequency, String
36
+ attribute :prescription_duration, String
37
+ attribute :administration_device, String
38
+
39
+ # validates! will raise eg ActiveModel::StrictValidationFailed: Family name can't be blank
40
+ validates! :family_name, presence: true
41
+ validates! :given_name, presence: true
42
+
43
+ def formatted_address
44
+ format_address_array address
45
+ end
46
+
47
+ def formatted_hospital_address
48
+ format_address_array hospital_address
49
+ end
50
+
51
+ def formatted_hospital_name_and_address
52
+ arr = [hospital_name] + hospital_address
53
+ format_address_array arr
54
+ end
55
+
56
+ def format_address_array(add)
57
+ return unless add&.is_a?(Array)
58
+
59
+ add.compact.reject { |line| line == "" }&.uniq&.join("\n")
60
+ end
61
+
62
+ def formatted_prescription_date
63
+ return unless prescription_date
64
+
65
+ prescription_date
66
+ end
67
+
68
+ def allergies_as_list
69
+ Array(allergies).uniq.compact.join("<br>")
70
+ end
71
+
72
+ def self.test_data(provider: :generic, version: 1)
73
+ new.tap do |args|
74
+ args.provider = provider
75
+ args.version = version
76
+ args.title = "Mr"
77
+ args.given_name = "Jack"
78
+ args.family_name = "JONES"
79
+ args.nhs_number = "0123456789"
80
+ args.born_on = Date.parse("2001-01-01")
81
+ args.fmc_patient = "123"
82
+ args.telephone = "07000 000001"
83
+ args.hospital_number = "ABC123"
84
+ args.address = ["line1", "", nil, "line2", "line3. "]
85
+ args.postcode = "TW1 1UU"
86
+ args.modality = "HD"
87
+ args.prescriber_name = "Dr X Yz"
88
+ args.prescription_date = Date.today.to_s
89
+ args.hospital_name = "THE ROYAL LONDON HOSPITAL"
90
+ args.hospital_department = ""
91
+ args.hospital_address = [
92
+ nil,
93
+ "WHITECHAPEL",
94
+ "",
95
+ "LONDON",
96
+ "E1 1FR"
97
+ ]
98
+ args.no_known_allergies = false
99
+ args.allergies = ["Nuts", nil, "Penicillin", "Mown grass"]
100
+ args.administration_frequency = "Daily"
101
+ args.administration_route = "Per Oral"
102
+ args.prescription_duration = "1 month"
103
+ args.administration_device = "device?"
104
+
105
+ raise ArgumentError, args.errors unless args.valid?
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware::Forms
4
+ class Homecare::Pdf
5
+ # Given an Args instance containing a provider (eg :fresenius) and a version (eg 1),
6
+ # get the document class for e.g. Renalware::Forms::Fresenius::Homecare::Document
7
+ # and use it to build a new PDF with the data (patient name etc supplied in args)
8
+ def self.generate(args)
9
+ raise ArgumentError unless args
10
+ raise(ArgumentError, "Missing provider") unless args.provider
11
+ raise(ArgumentError, "Missing provider") if args.provider == ""
12
+ raise(ArgumentError, "Version must be >0") if args.version.to_i == 0
13
+
14
+ provider = args.provider.to_s.capitalize
15
+ version = "V#{args.version.to_i}"
16
+ document_klass_name = "#{provider}::Homecare::#{version}::Document"
17
+ document_klass = Renalware::Forms.const_get(document_klass_name)
18
+ document_klass.build(args)
19
+ rescue NameError
20
+ raise(
21
+ ArgumentError,
22
+ "No PDF forms found for provider=#{args.provider} version=#{args.version} "\
23
+ "trying to resolve Renalware::Forms::#{document_klass_name}"
24
+ )
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware
4
+ module Forms
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+
2
+ require "./lib/renalware/forms"
3
+ require "tempfile"
4
+
5
+ namespace :forms do
6
+ namespace :generic do
7
+ namespace :homecare do
8
+ include Renalware::Forms::Helpers
9
+
10
+ desc "Generate test Generic Homecare Supply PDF V1"
11
+ task :v1 do
12
+ args = Renalware::Forms::Homecare::Args.test_data(provider: :generic, version: 1)
13
+ pdf = Renalware::Forms::Homecare::Pdf.generate(args)
14
+ render_and_open pdf
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ desc "Starts irb so we can debug the gem"
2
+ task :console do
3
+ exec "irb -r ./lib/renalware/forms"
4
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: renalware-forms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Airslie Ltd
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: attr_extras
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '6.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '6.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: prawn
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: prawn-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: virtus
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pdf-reader
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: The home for various forms for external providers e.g. home care prescriptions
140
+ email:
141
+ - dev@aisrlie.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - MIT-LICENSE
147
+ - README.md
148
+ - Rakefile
149
+ - lib/renalware/forms.rb
150
+ - lib/renalware/forms/base.rb
151
+ - lib/renalware/forms/generic.rb
152
+ - lib/renalware/forms/generic/homecare.rb
153
+ - lib/renalware/forms/generic/homecare/v1.rb
154
+ - lib/renalware/forms/generic/homecare/v1/base.rb
155
+ - lib/renalware/forms/generic/homecare/v1/document.rb
156
+ - lib/renalware/forms/helpers.rb
157
+ - lib/renalware/forms/homecare.rb
158
+ - lib/renalware/forms/homecare/args.rb
159
+ - lib/renalware/forms/homecare/pdf.rb
160
+ - lib/renalware/forms/version.rb
161
+ - lib/tasks/homecare.rake
162
+ - lib/tasks/tasks.rake
163
+ homepage: http://airslie.com
164
+ licenses:
165
+ - MIT
166
+ metadata: {}
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubygems_version: 3.0.3
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: PDF library for Renalware forms
186
+ test_files: []