sunnyside 0.0.2 → 0.0.3
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.
- data/lib/sunnyside/cash_receipts/cash_receipt.rb +62 -38
- data/lib/sunnyside/ledger/auth_report.rb +26 -32
- data/lib/sunnyside/ledger/edi.rb +63 -28
- data/lib/sunnyside/ledger/ledger.rb +22 -8
- data/lib/sunnyside/models/db_setup.rb +35 -1
- data/lib/sunnyside/reports/mco_mltc.rb +1 -2
- data/lib/sunnyside/reports/pdf_report_draft.rb +44 -24
- data/lib/sunnyside/version.rb +1 -1
- data/lib/sunnyside.rb +10 -2
- metadata +31 -17
- checksums.yaml +0 -7
@@ -1,18 +1,24 @@
|
|
1
1
|
module Sunnyside
|
2
2
|
|
3
3
|
def payment_type
|
4
|
-
puts
|
5
|
-
|
4
|
+
puts "1.) EDI PAYMENT"
|
5
|
+
puts "2.) MANUAL PAYMENT"
|
6
|
+
return gets.chomp.upcase == '1' ? EdiPayment.new : ManualPayment.new
|
6
7
|
end
|
7
8
|
|
8
|
-
def
|
9
|
-
puts 'Enter in check number followed by the
|
10
|
-
|
9
|
+
def check_date_abbre
|
10
|
+
puts 'Enter in check number, post date and then followed by the provider abbreviation (separated by a space - ex: 235345 10/12/2013 WEL): '
|
11
|
+
ans = gets.chomp.split
|
12
|
+
if ans.size == 3
|
13
|
+
return ans
|
14
|
+
else
|
15
|
+
raise 'You need to enter in the specified fields.'
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
19
|
def invoice_numbers
|
14
20
|
puts 'Enter in invoices, each separated by a space. If an invoice contains any denials, flag it by typing in a "-d" right after the last number. '
|
15
|
-
return gets.chomp.split
|
21
|
+
return gets.chomp.split
|
16
22
|
end
|
17
23
|
|
18
24
|
class CashReceipt
|
@@ -29,10 +35,10 @@ module Sunnyside
|
|
29
35
|
|
30
36
|
class EdiPayment
|
31
37
|
include Sunnyside
|
32
|
-
attr_reader :check_number, :post_date
|
38
|
+
attr_reader :check_number, :post_date, :prov
|
33
39
|
|
34
40
|
def initialize
|
35
|
-
@check_number, @post_date = self.
|
41
|
+
@check_number, @post_date, @prov = self.check_date_abbre
|
36
42
|
end
|
37
43
|
|
38
44
|
def invoices
|
@@ -64,23 +70,27 @@ module Sunnyside
|
|
64
70
|
end
|
65
71
|
|
66
72
|
class ManualPayment < CashReceipt
|
67
|
-
attr_reader :check, :
|
73
|
+
attr_reader :check, :manual_invs, :post_date, :prov
|
68
74
|
|
69
75
|
def initialize
|
70
|
-
@check, @post_date = self.
|
71
|
-
@
|
76
|
+
@check, @post_date, @prov = self.check_date_abbre
|
77
|
+
@manual_invs = self.invoice_numbers
|
78
|
+
end
|
79
|
+
|
80
|
+
def provider
|
81
|
+
Provider.where(abbreviation: prov).first
|
72
82
|
end
|
73
83
|
|
74
84
|
def payment_id
|
75
85
|
if check_exists?
|
76
|
-
Payment.where(check_number: check).get(:id)
|
86
|
+
Payment.where(check_number: check, post_date: post_date, provider_id: provider.id).get(:id)
|
77
87
|
else
|
78
|
-
Payment.insert(check_number: check)
|
88
|
+
Payment.insert(check_number: check, post_date: post_date, provider_id: provider.id)
|
79
89
|
end
|
80
90
|
end
|
81
91
|
|
82
92
|
def check_exists?
|
83
|
-
Payment.where(check_number: check).count > 0
|
93
|
+
Payment.where(check_number: check, post_date: post_date, provider_id: provider.id).count > 0
|
84
94
|
end
|
85
95
|
|
86
96
|
def date
|
@@ -88,13 +98,12 @@ module Sunnyside
|
|
88
98
|
end
|
89
99
|
|
90
100
|
def collate
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
}
|
101
|
+
manual_invs.each { |inv|
|
102
|
+
invoice = Invoice[inv.gsub(/-d/, '')]
|
103
|
+
claim_id = create_claim(invoice)
|
104
|
+
create_services(invoice, claim_id)
|
105
|
+
edit_services(claim_id) if denial_present?(inv)
|
106
|
+
self.receivable_csv(invoice, payment_id, check, post_date)
|
98
107
|
}
|
99
108
|
end
|
100
109
|
|
@@ -105,12 +114,11 @@ module Sunnyside
|
|
105
114
|
|
106
115
|
def create_claim(invoice)
|
107
116
|
Claim.insert(
|
108
|
-
:invoice_id => invoice.
|
117
|
+
:invoice_id => invoice.id,
|
109
118
|
:client_id => invoice.client_id,
|
110
119
|
:billed => invoice.amount,
|
111
120
|
:paid => 0.0,
|
112
121
|
:payment_id => payment_id,
|
113
|
-
:check_number => check,
|
114
122
|
:provider_id => invoice.provider_id
|
115
123
|
)
|
116
124
|
end
|
@@ -126,6 +134,7 @@ module Sunnyside
|
|
126
134
|
:billed => visit.amount,
|
127
135
|
:dos => visit.dos,
|
128
136
|
:units => visit.units
|
137
|
+
:client_id => Claim[claim_id].client_id
|
129
138
|
)
|
130
139
|
}
|
131
140
|
end
|
@@ -134,27 +143,15 @@ module Sunnyside
|
|
134
143
|
Visit.where(invoice_id: invoice.invoice_number).all
|
135
144
|
end
|
136
145
|
|
137
|
-
|
138
|
-
|
139
146
|
def services(inv)
|
140
147
|
Service.where(payment_id: payment_id, invoice_id: inv)
|
141
148
|
end
|
142
149
|
|
143
150
|
def edit_services(inv)
|
144
|
-
|
145
|
-
print "Select the day you wish to edit by the corresponding number followed by the adjusted amount\n"
|
146
|
-
print "When you are finished, type 'done'."
|
147
|
-
print "(e.g. 3451 23.50) Enter in the number now: "
|
151
|
+
service = EditServices.new(inv, payment_id)
|
148
152
|
loop do
|
149
|
-
|
150
|
-
|
151
|
-
if !id.nil?
|
152
|
-
print "Type in the denial reason now: "
|
153
|
-
denial_reason = gets.chomp
|
154
|
-
Service[id].update(paid: adjusted_amt, denial_reason: denial_reason)
|
155
|
-
else
|
156
|
-
break
|
157
|
-
end
|
153
|
+
service.show_all
|
154
|
+
service.adjust
|
158
155
|
end
|
159
156
|
end
|
160
157
|
|
@@ -165,5 +162,32 @@ module Sunnyside
|
|
165
162
|
def visits(invoice)
|
166
163
|
Visit.where(invoice_id: invoice.invoice_number).all
|
167
164
|
end
|
165
|
+
|
166
|
+
class EditServices < ManualPayment::CashReceipt
|
167
|
+
attr_reader :claim
|
168
|
+
|
169
|
+
def initialize(claim_id)
|
170
|
+
@claim = Claim[claim_id]
|
171
|
+
@services = Service.where(claim_id: claim_id).all
|
172
|
+
end
|
173
|
+
|
174
|
+
def show_all
|
175
|
+
services.each { |svc| puts "ID: #{svc.id} #{svc.dos} #{svc.amount}" }
|
176
|
+
end
|
177
|
+
|
178
|
+
def adjust
|
179
|
+
print "Type in the Service ID # to change the amount: "
|
180
|
+
id = gets.chomp
|
181
|
+
print "You selected #{id} - Type in the adjusted amount: "
|
182
|
+
amt = gets.chomp
|
183
|
+
print "And now type in the denial reason: "
|
184
|
+
reason = gets.chomp
|
185
|
+
adjust_service(id, amt, reason)
|
186
|
+
end
|
187
|
+
|
188
|
+
def adjust_service
|
189
|
+
Service[id].update(paid: amt, denial_reason: reason)
|
190
|
+
end
|
191
|
+
end
|
168
192
|
end
|
169
193
|
end
|
@@ -16,7 +16,7 @@ module Sunnyside
|
|
16
16
|
attr_reader :client_line, :visits
|
17
17
|
|
18
18
|
def initialize(entry)
|
19
|
-
@client_line = entry.split(/\n/).select { |line| line =~
|
19
|
+
@client_line = entry.split(/\n/).select { |line| line =~ /\s+001\s+/ }
|
20
20
|
@visits = entry.split(/\n/).select { |line| line =~ /^\d{6}/ }
|
21
21
|
end
|
22
22
|
|
@@ -45,33 +45,7 @@ module Sunnyside
|
|
45
45
|
|
46
46
|
# only the invoices lines and the client info line gets selected and passed onto the next object level
|
47
47
|
end
|
48
|
-
class ClientData < ParseInvoice
|
49
|
-
attr_reader :client_id, :service_id, :recipient_id, :authorization
|
50
|
-
|
51
|
-
def initialize(client)
|
52
|
-
@client_id, @service_id, @recipient_id, @authorization = client.map { |line| line.strip }
|
53
|
-
end
|
54
48
|
|
55
|
-
def show_me
|
56
|
-
puts "#{client_id} #{service_id} #{recipient_id} #{authorization}"
|
57
|
-
end
|
58
|
-
|
59
|
-
def client_number
|
60
|
-
if client_exists?
|
61
|
-
client_id
|
62
|
-
else
|
63
|
-
insert_client
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def client_exists?
|
68
|
-
Client.where(client_number: client_id).count > 0
|
69
|
-
end
|
70
|
-
|
71
|
-
def insert_client
|
72
|
-
Client.insert(client_number: client_id)
|
73
|
-
end
|
74
|
-
end
|
75
49
|
|
76
50
|
class InvoiceDetail < ParseInvoice
|
77
51
|
attr_reader :invoice, :service_code, :modifier, :dos, :units, :amount, :client
|
@@ -86,10 +60,6 @@ module Sunnyside
|
|
86
60
|
@amount = invoice_line[:amount]
|
87
61
|
end
|
88
62
|
|
89
|
-
def show
|
90
|
-
puts "#{invoice} #{service_code} #{modifier} #{dos} #{units} #{amount} #{client.show_me}"
|
91
|
-
end
|
92
|
-
|
93
63
|
def to_db
|
94
64
|
Visit.insert(
|
95
65
|
:client_id => client.client_number,
|
@@ -104,7 +74,31 @@ module Sunnyside
|
|
104
74
|
end
|
105
75
|
|
106
76
|
def update_invoice
|
107
|
-
Invoice[invoice].update(:
|
77
|
+
Invoice[invoice].update(:auth => client.auth, :recipient_id => client.recipient_id)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class ClientData < ParseInvoice
|
82
|
+
attr_reader :client_id, :service_id, :recipient_id, :authorization
|
83
|
+
|
84
|
+
def initialize(client)
|
85
|
+
@client_id, @service_id, @recipient_id, @authorization = client.map { |line| line.strip }
|
86
|
+
end
|
87
|
+
|
88
|
+
def client_number
|
89
|
+
if client_missing?
|
90
|
+
puts 'how the hell is it happening? ' + client_id
|
91
|
+
else
|
92
|
+
client_id
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def auth
|
97
|
+
authorization
|
98
|
+
end
|
99
|
+
|
100
|
+
def client_missing?
|
101
|
+
Client[client_id].nil?
|
108
102
|
end
|
109
103
|
end
|
110
104
|
end
|
data/lib/sunnyside/ledger/edi.rb
CHANGED
@@ -3,13 +3,22 @@ module Sunnyside
|
|
3
3
|
print "checking for new files...\n"
|
4
4
|
Dir["#{LOCAL_FILES}/835/*.txt"].select { |file| Filelib.where(:filename => file).count == 0 }.each do |file|
|
5
5
|
print "processing #{file}...\n"
|
6
|
-
data
|
6
|
+
data = File.open(file).read
|
7
|
+
|
8
|
+
# Detect to see if the EDI file already has new lines inserted. If so, the newlines are removed before the file gets processed.
|
9
|
+
|
10
|
+
if data.include?(/\n/)
|
11
|
+
data.gsub!(/\n/, '')
|
12
|
+
end
|
13
|
+
|
14
|
+
data = data.split(/~CLP\*/)
|
7
15
|
edi = Edi.new(data, file)
|
8
16
|
edi.parse_claim_header
|
9
17
|
Filelib.insert(filename: file, created_at: Time.now, purpose: 'EDI Import', file_type: '835 Remittance')
|
10
18
|
edi.save_payment_to_db
|
11
19
|
end
|
12
20
|
end
|
21
|
+
|
13
22
|
class Edi
|
14
23
|
attr_reader :header, :claims, :file
|
15
24
|
def initialize(data, file)
|
@@ -147,34 +156,60 @@ module Sunnyside
|
|
147
156
|
|
148
157
|
def set_code(code)
|
149
158
|
case code
|
150
|
-
when '125'
|
151
|
-
|
152
|
-
when '
|
153
|
-
|
154
|
-
when '
|
155
|
-
|
156
|
-
when '
|
157
|
-
|
158
|
-
when '
|
159
|
-
|
160
|
-
when '
|
161
|
-
|
162
|
-
when '
|
163
|
-
|
164
|
-
when '
|
165
|
-
|
166
|
-
when '
|
167
|
-
|
168
|
-
when '
|
169
|
-
|
170
|
-
when '
|
171
|
-
|
172
|
-
when '
|
173
|
-
|
174
|
-
when '
|
175
|
-
|
159
|
+
when '125'
|
160
|
+
'Submission/billing error(s). At least one Remark Code must be provided'
|
161
|
+
when '140'
|
162
|
+
'Patient/Insured health identification number and name do not match.'
|
163
|
+
when '31'
|
164
|
+
'INVALID MEMBER ID'
|
165
|
+
when '62'
|
166
|
+
'PAID AUTHORIZED UNITS'
|
167
|
+
when '96'
|
168
|
+
'NO AUTHORIZATION FOR DOS'
|
169
|
+
when '146'
|
170
|
+
'DIAGNOSIS WAS INVALID FOR DATES LISTED'
|
171
|
+
when '197'
|
172
|
+
'Precertification/authorization/notification absent'
|
173
|
+
when '198'
|
174
|
+
'Precertification/authorization exceeded'
|
175
|
+
when '199'
|
176
|
+
'Revenue code and Procedure code do not match'
|
177
|
+
when '9'
|
178
|
+
'DIAGNOSIS ISSUE'
|
179
|
+
when '15'
|
180
|
+
'AUTHORIZATION MISSING/INVALID'
|
181
|
+
when '18'
|
182
|
+
'Exact Duplicate Claim/Service'
|
183
|
+
when '19'
|
184
|
+
'Expenses incurred prior to coverage'
|
185
|
+
when '27'
|
186
|
+
'Expenses incurred after coverage terminated'
|
187
|
+
when '29'
|
188
|
+
'Timely Filing'
|
189
|
+
when '39'
|
190
|
+
'Services denied at the time authorization/pre-certification was requested'
|
191
|
+
when '45'
|
192
|
+
'Charge exceeds fee schedule/maximum allowable'
|
193
|
+
when '16'
|
194
|
+
'Claim/service lacks information which is needed for adjudication'
|
195
|
+
when '50'
|
196
|
+
'These are non-covered services because this is not deemed a medical necessity by the payer'
|
197
|
+
when '192'
|
198
|
+
'Non standard adjustment code from paper remittance'
|
199
|
+
when '181'
|
200
|
+
'Procedure code was invalid on the date of service'
|
201
|
+
when '182'
|
202
|
+
'Procedure modifier was invalid on the date of service'
|
203
|
+
when '204'
|
204
|
+
'This service/equipment/drug is not covered under the patients current benefit plan'
|
205
|
+
when '151'
|
206
|
+
'151 Payment adjusted because the payer deems the information submitted does not support this many/frequency of services'
|
207
|
+
when '177'
|
208
|
+
'Patient has not met the required eligibility requirements'
|
209
|
+
when '109'
|
210
|
+
'Claim/service not covered by this payer/contractor. You must send the claim/service to the correct payer/contractor.'
|
176
211
|
else
|
177
|
-
|
212
|
+
"#{code} is UNIDENTIFIED"
|
178
213
|
end
|
179
214
|
end
|
180
215
|
end
|
@@ -40,7 +40,7 @@ module Sunnyside
|
|
40
40
|
include Sunnyside
|
41
41
|
attr_reader :page_data, :provider, :post_date
|
42
42
|
|
43
|
-
def initialize(page_data, file
|
43
|
+
def initialize(page_data, file)
|
44
44
|
@provider = page_data[/CUSTOMER:\s+(.+)(?=\)')/, 1]
|
45
45
|
@post_date = Date.parse(file[0..7])
|
46
46
|
@page_data = page_data.split(/\n/).select { |line| line =~ /^\([0-9\/]+\s/ }
|
@@ -53,11 +53,11 @@ module Sunnyside
|
|
53
53
|
if provider_missing?
|
54
54
|
case provider
|
55
55
|
when 'ELDERSERVEHEALTH'
|
56
|
-
Provider
|
56
|
+
Provider[5]
|
57
57
|
when 'AMERIGROUP'
|
58
|
-
Provider
|
58
|
+
Provider[1]
|
59
59
|
else
|
60
|
-
Provider
|
60
|
+
Provider[16]
|
61
61
|
end
|
62
62
|
else
|
63
63
|
Provider.where(name: provider).first
|
@@ -101,6 +101,7 @@ module Sunnyside
|
|
101
101
|
def finalize
|
102
102
|
if !client_missing?
|
103
103
|
add_invoice
|
104
|
+
update_client if new_provider?
|
104
105
|
else
|
105
106
|
add_client
|
106
107
|
finalize
|
@@ -111,8 +112,21 @@ module Sunnyside
|
|
111
112
|
Client[client_id].nil?
|
112
113
|
end
|
113
114
|
|
115
|
+
def new_provider?
|
116
|
+
Client[client_id].provider_id != provider.id
|
117
|
+
end
|
118
|
+
|
119
|
+
def update_client
|
120
|
+
Client[client_id].update(provider_id: provider.id, type: provider.type)
|
121
|
+
end
|
122
|
+
|
123
|
+
def fund_id
|
124
|
+
print "Enter in the FUND EZ ID for this client: #{client_name.strip} of #{provider.name}. "
|
125
|
+
return gets.chomp
|
126
|
+
end
|
127
|
+
|
114
128
|
def add_client
|
115
|
-
Client.insert(client_number: client_id, client_name: client_name)
|
129
|
+
Client.insert(client_number: client_id, client_name: client_name.strip, fund_id: fund_id, provider_id: provider.id, type: provider.type)
|
116
130
|
end
|
117
131
|
|
118
132
|
# rarely there may be an invoice line that contains an invoice number that already exists. This method accounts for it, by merely updating the amount.
|
@@ -127,15 +141,15 @@ module Sunnyside
|
|
127
141
|
end
|
128
142
|
|
129
143
|
def invoice_exist?
|
130
|
-
Invoice
|
144
|
+
!Invoice[invoice].nil?
|
131
145
|
end
|
132
146
|
|
133
147
|
def update_invoice
|
134
|
-
Invoice
|
148
|
+
Invoice[invoice].update(amount: amt.to_f)
|
135
149
|
end
|
136
150
|
|
137
151
|
def prev_amt
|
138
|
-
Invoice
|
152
|
+
Invoice[invoice].amount
|
139
153
|
end
|
140
154
|
end
|
141
155
|
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
module Sunnyside
|
2
2
|
class << self
|
3
3
|
def create_tables
|
4
|
+
DB.create_table :logins do
|
5
|
+
primary_key :id
|
6
|
+
String :site
|
7
|
+
String :username
|
8
|
+
String :password
|
9
|
+
String :provider
|
10
|
+
end
|
11
|
+
|
4
12
|
DB.create_table :charges do
|
5
13
|
primary_key :id
|
6
14
|
foreign_key :invoice_id, :invoices
|
@@ -20,9 +28,11 @@ module Sunnyside
|
|
20
28
|
foreign_key :client_id, :clients
|
21
29
|
foreign_key :provider_id, :providers
|
22
30
|
foreign_key :filelib_id, :filelibs
|
31
|
+
String :auth
|
23
32
|
String :client_name
|
24
33
|
Float :rate
|
25
34
|
Float :hours
|
35
|
+
String :recipient_id
|
26
36
|
end
|
27
37
|
|
28
38
|
DB.create_table :payments do
|
@@ -30,6 +40,7 @@ module Sunnyside
|
|
30
40
|
foreign_key :provider_id, :providers
|
31
41
|
foreign_key :filelib_id, :filelibs
|
32
42
|
Float :check_total
|
43
|
+
Date :post_date, :default=>Date.today
|
33
44
|
String :status
|
34
45
|
Integer :check_number
|
35
46
|
end
|
@@ -68,6 +79,8 @@ module Sunnyside
|
|
68
79
|
String :client_name
|
69
80
|
String :fund_id
|
70
81
|
String :recipient_id
|
82
|
+
foreign_key :provider_id, :providers
|
83
|
+
String :type, :default=>'MLTC'
|
71
84
|
end
|
72
85
|
|
73
86
|
DB.create_table :providers do
|
@@ -104,7 +117,29 @@ module Sunnyside
|
|
104
117
|
primary_key :denial_code, :primary_key=>true
|
105
118
|
String :denial_explanation
|
106
119
|
end
|
120
|
+
|
121
|
+
DB.create_table :authorizations do
|
122
|
+
primary_key :id
|
123
|
+
String :auth
|
124
|
+
foreign_key :client_id, :clients
|
125
|
+
Integer :service_id
|
126
|
+
Date :start_date
|
127
|
+
Date :end_date
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def add_clients
|
132
|
+
TT[:clients].all.each { |client|
|
133
|
+
if DB[:clients].where(client_number: client[:med_id]).count == 0
|
134
|
+
DB[:clients].insert(client_number: client[:med_id])
|
135
|
+
end
|
136
|
+
}
|
137
|
+
end
|
107
138
|
|
139
|
+
def add_ftp_data
|
140
|
+
end
|
141
|
+
|
142
|
+
def add_providers
|
108
143
|
DB[:providers].insert(:credit_account=>1206, :fund=>500, :debit_account=>5005, :name=>"AMERIGROUP 2", :abbreviation=>"AMG", :type=>"MCO")
|
109
144
|
DB[:providers].insert(:credit_account=>1207, :fund=>300, :debit_account=>5007, :name=>"CHILDREN'S AID SOCIETY", :abbreviation=>"CAS", :type=>"MLTC")
|
110
145
|
DB[:providers].insert(:credit_account=>1226, :fund=>300, :debit_account=>5026, :name=>"COMPREHENSIVE CARE MANAGEMENT", :abbreviation=>"CCM", :type=>"MLTC")
|
@@ -129,7 +164,6 @@ module Sunnyside
|
|
129
164
|
DB[:providers].insert(:credit_account=>1310, :fund=>300, :debit_account=>5030, :name=>"VILLAGE CARE MAX", :abbreviation=>"VIL", :type=>"MLTC")
|
130
165
|
DB[:providers].insert(:credit_account=>1222, :fund=>500, :debit_account=>5022, :name=>"AFFINITY HEALTH PLUS", :abbreviation=>"AFF", :type=>"MCO")
|
131
166
|
DB[:providers].insert(:credit_account=>1218, :fund=>500, :debit_account=>5018, :name=>"HEALTH PLUS PHSP,INC", :abbreviation=>"HFS", :type=>"MCO")
|
132
|
-
|
133
167
|
end
|
134
168
|
end
|
135
169
|
end
|
@@ -20,12 +20,11 @@ module Sunnyside
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def run
|
23
|
-
mco_total
|
23
|
+
mco_total = 0.0
|
24
24
|
mltc_total = 0.0
|
25
25
|
invoices.each do |inv|
|
26
26
|
if inv[:type] == 'MCO'
|
27
27
|
mco_total += inv[:hours]
|
28
|
-
# mco_total += inv.hours
|
29
28
|
elsif inv[:type] == 'MLTC'
|
30
29
|
mltc_total += inv[:hours]
|
31
30
|
end
|
@@ -22,26 +22,31 @@ module Sunnyside
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def denials_present?
|
25
|
-
claims.where(
|
25
|
+
claims.where(denial_reason: '4').count > 0
|
26
26
|
end
|
27
27
|
|
28
28
|
def create_pdf
|
29
29
|
Prawn::Document.generate("#{provider}_CHECK_#{check}.pdf", :page_layout => :landscape) do |pdf|
|
30
|
-
report = ReportPDF.new(
|
30
|
+
report = ReportPDF.new(
|
31
|
+
pdf,
|
32
|
+
{ :claim_data => claims,
|
33
|
+
:service_data => services,
|
34
|
+
:provider => provider,
|
35
|
+
:check => check
|
36
|
+
})
|
37
|
+
|
31
38
|
report.create_check_header
|
39
|
+
report.claim_table
|
32
40
|
if takeback_present?
|
33
41
|
report.takeback_table
|
34
42
|
elsif denials_present?
|
35
43
|
report.denial_table
|
36
|
-
else
|
37
|
-
report.claim_table
|
38
44
|
end
|
39
45
|
end
|
40
46
|
end
|
41
47
|
end
|
42
48
|
class ReportPDF
|
43
49
|
attr_reader :pdf, :claims, :services, :provider, :check
|
44
|
-
|
45
50
|
def initialize(pdf, data = {})
|
46
51
|
@pdf = pdf
|
47
52
|
@claims = data[:claim_data]
|
@@ -77,13 +82,24 @@ module Sunnyside
|
|
77
82
|
end
|
78
83
|
|
79
84
|
def denial_table
|
85
|
+
pdf.start_new_page
|
86
|
+
pdf.move_down 10
|
80
87
|
pdf.text 'CLAIMS WITH DENIALS'
|
81
88
|
pdf.move_down 10
|
89
|
+
claims.where(denial_reason: '4').all.each { |clm| claim_header(clm) }
|
82
90
|
end
|
83
91
|
|
84
92
|
def takeback_header
|
93
|
+
pdf.start_new_page
|
94
|
+
pdf.move_down 10
|
85
95
|
pdf.text 'ADJUSTED CLAIMS'
|
86
96
|
pdf.move_down 10
|
97
|
+
claims.where(denial_reason: '22').all.each { |clm| claim_header(clm) }
|
98
|
+
end
|
99
|
+
|
100
|
+
def table_create
|
101
|
+
pdf.text 'asdasds'
|
102
|
+
and_this_too_please
|
87
103
|
end
|
88
104
|
|
89
105
|
def client(inv)
|
@@ -91,37 +107,41 @@ module Sunnyside
|
|
91
107
|
end
|
92
108
|
|
93
109
|
def claim_header(claim)
|
110
|
+
puts claim.control_number
|
94
111
|
pdf.move_down 10
|
95
112
|
claim_data = [[claim.control_number, client(claim.invoice_number), claim.invoice_number, currency(claim.amount_charged), currency(claim.amount_paid), claim.denial_reason]]
|
96
|
-
pdf.table(
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
:height => 30
|
103
|
-
}) # SHOULD ONLY HAVE ONE CLAIM
|
113
|
+
pdf.table(claim_data, :column_widths => [85, 75, 75, 75, 75, 150], :cell_style => {
|
114
|
+
:align => :center,
|
115
|
+
:overflow => :shrink_to_fit,
|
116
|
+
:size => 12,
|
117
|
+
:height => 30
|
118
|
+
}) # SHOULD ONLY HAVE ONE CLAIM
|
104
119
|
pdf.move_down 10
|
105
120
|
create_service_table(claim.id)
|
106
121
|
end
|
107
122
|
|
108
123
|
def service_data(id)
|
109
|
-
services.where(claim_id: id).map { |svc| ['', svc.dos, svc
|
124
|
+
services.where(claim_id: id).map { |svc| ['', svc.dos, svc_code(svc), svc.units, currency(svc.amount_charged), currency(svc.amount_paid), svc.denial_reason] }
|
125
|
+
end
|
126
|
+
|
127
|
+
def svc_code(svc)
|
128
|
+
if svc.mod_1
|
129
|
+
svc.service_code + ':' + svc.mod_1
|
130
|
+
else
|
131
|
+
svc.service_code
|
132
|
+
end
|
110
133
|
end
|
111
134
|
|
112
135
|
def create_service_table(id)
|
113
|
-
pdf.table(service_data(id),
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
:height => 30
|
120
|
-
}) # SHOULD ONLY HAVE ONE CLAIM
|
136
|
+
pdf.table(service_data(id), :column_widths => [85, 75, 75, 75, 75, 150], :cell_style => {
|
137
|
+
:align => :center,
|
138
|
+
:overflow => :shrink_to_fit,
|
139
|
+
:size => 12,
|
140
|
+
:height => 30
|
141
|
+
}) # SHOULD ONLY HAVE ONE CLAIM
|
121
142
|
end
|
122
143
|
|
123
144
|
def claim_table
|
124
145
|
claims.exclude(denial_reason: ['22', '4']).all.each { |clm| claim_header(clm) }
|
125
146
|
end
|
126
|
-
end
|
127
|
-
end
|
147
|
+
end
|
data/lib/sunnyside/version.rb
CHANGED
data/lib/sunnyside.rb
CHANGED
@@ -17,11 +17,19 @@ require 'sunnyside/menu'
|
|
17
17
|
require 'sunnyside/expiring_auth'
|
18
18
|
|
19
19
|
module Sunnyside
|
20
|
+
# doesn't work on some Windows machines
|
20
21
|
LOCAL_FILES = ENV["HOME"] + "/sunnyside-files"
|
21
22
|
DB = Sequel.connect("sqlite:/#{LOCAL_FILES}/db/sunnyside.db")
|
23
|
+
|
24
|
+
# Second database for copying old data
|
25
|
+
|
22
26
|
if DB.tables.empty?
|
23
|
-
|
24
|
-
|
27
|
+
require 'sunnyside/models/db_setup'
|
28
|
+
TT = Sequel.connect("sqlite:/#{LOCAL_FILES}/db/project.db")
|
29
|
+
Sunnyside.create_tables
|
30
|
+
Sunnyside.add_providers
|
31
|
+
Sunnyside.add_ftp_data
|
32
|
+
Sunnyside.add_clients
|
25
33
|
end
|
26
34
|
require 'sunnyside/models/sequel_classes'
|
27
35
|
end
|
metadata
CHANGED
@@ -1,32 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunnyside
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- wismer
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
12
|
+
date: 2013-12-27 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: sqlite3
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: bundler
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,57 +46,65 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rake
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- - '>='
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '0'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- - '>='
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: sequel
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
|
-
- - '>='
|
67
|
+
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
61
69
|
version: '0'
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
|
-
- - '>='
|
75
|
+
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '0'
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: money
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
|
-
- - '>='
|
83
|
+
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: '0'
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
|
-
- - '>='
|
91
|
+
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: '0'
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: prawn
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
|
-
- - '>='
|
99
|
+
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: '0'
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
|
-
- - '>='
|
107
|
+
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: '0'
|
97
110
|
description: gem for Sunnyside Citywide Home Care, Inc.
|
@@ -124,25 +137,26 @@ files:
|
|
124
137
|
homepage: ''
|
125
138
|
licenses:
|
126
139
|
- MIT
|
127
|
-
metadata: {}
|
128
140
|
post_install_message:
|
129
141
|
rdoc_options: []
|
130
142
|
require_paths:
|
131
143
|
- lib
|
132
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
133
146
|
requirements:
|
134
|
-
- - '>='
|
147
|
+
- - ! '>='
|
135
148
|
- !ruby/object:Gem::Version
|
136
149
|
version: '0'
|
137
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
138
152
|
requirements:
|
139
|
-
- - '>='
|
153
|
+
- - ! '>='
|
140
154
|
- !ruby/object:Gem::Version
|
141
155
|
version: '0'
|
142
156
|
requirements: []
|
143
157
|
rubyforge_project:
|
144
|
-
rubygems_version:
|
158
|
+
rubygems_version: 1.8.24
|
145
159
|
signing_key:
|
146
|
-
specification_version:
|
160
|
+
specification_version: 3
|
147
161
|
summary: EDI/PDF parser, fiscal tools for accounting
|
148
162
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 1cb352e0ac28b56b294e7736a05ea8c3862c41b0
|
4
|
-
data.tar.gz: 8b00db12da4d56584417a1dc52e5b8cbb73226f8
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 5b8236a4f85643a031ecaed56c69d19bbc426c96443ce2d32624f85e32f27beb26b77a49866d2006d57b5e39ec65711d2ebe123a7c9fcf45d94c811f70c41c6f
|
7
|
-
data.tar.gz: af009aeedc0ecffc3f462233e5c628dd269d455366d84d4b809ba326fb8c3a53bcece65738d18b05870fcf72bf8513b4bea5acb23469ffe61cb7a6c22e1ebf51
|