renalware-forms 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []