mno-enterprise-core 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/mno_enterprise/application_controller.rb +5 -5
- data/app/helpers/mno_enterprise/image_helper.rb +32 -0
- data/app/models/mno_enterprise/app.rb +11 -2
- data/app/models/mno_enterprise/base_resource.rb +2 -0
- data/app/models/mno_enterprise/credit_card.rb +7 -4
- data/app/models/mno_enterprise/impac/dashboard.rb +4 -1
- data/app/models/mno_enterprise/impac/widget.rb +10 -4
- data/app/models/mno_enterprise/org_invite.rb +7 -3
- data/app/models/mno_enterprise/shared_entity.rb +17 -0
- data/app/models/mno_enterprise/user.rb +7 -2
- data/app/pdf/mno_enterprise/invoice_pdf.rb +176 -183
- data/app/views/system_notifications/email-change.html.erb +1 -1
- data/app/views/system_notifications/email-change.text.erb +1 -1
- data/config/initializers/audit_log.rb +28 -1
- data/config/locales/templates/components/en.yml +29 -4
- data/config/locales/templates/dashboard/en.yml +2 -2
- data/config/locales/templates/dashboard/marketplace/en.yml +5 -5
- data/config/locales/templates/dashboard/organization/en.yml +14 -8
- data/config/locales/templates/dashboard/organization/id.yml +4 -4
- data/config/locales/templates/dashboard/organization/zh.yml +4 -4
- data/config/locales/templates/dashboard/teams/en.yml +3 -3
- data/config/locales/templates/dashboard/teams/id.yml +3 -3
- data/config/locales/templates/dashboard/teams/zh.yml +3 -3
- data/config/locales/templates/onboarding/en.yml +45 -0
- data/config/locales/views/auth/confirmations/en.yml +5 -3
- data/config/locales/views/webhook/o_auth/providers/en.yml +2 -2
- data/lib/generators/mno_enterprise/install/install_generator.rb +19 -1
- data/lib/generators/mno_enterprise/install/templates/Procfile.dev +1 -0
- data/lib/generators/mno_enterprise/install/templates/config/initializers/mno_enterprise.rb +7 -50
- data/lib/generators/mno_enterprise/install/templates/config/newrelic.yml +3 -3
- data/lib/generators/mno_enterprise/install/templates/config/settings.yml +49 -2
- data/lib/generators/mno_enterprise/install/templates/nginx.conf +71 -0
- data/lib/generators/mno_enterprise/install/templates/stylesheets/variables.less +148 -141
- data/lib/html_processor.rb +14 -14
- data/lib/mno_enterprise/concerns/controllers/auth/registrations_controller.rb +18 -15
- data/lib/mno_enterprise/concerns/models/ability.rb +6 -3
- data/lib/mno_enterprise/concerns/models/app_instance.rb +2 -3
- data/lib/mno_enterprise/concerns/models/intercom_user.rb +22 -0
- data/lib/mno_enterprise/concerns/models/organization.rb +8 -0
- data/lib/mno_enterprise/concerns/models/shared_entity.rb +36 -0
- data/lib/mno_enterprise/concerns/models/team.rb +7 -0
- data/lib/mno_enterprise/testing_support/common_rake.rb +1 -1
- data/lib/mno_enterprise/testing_support/factories/apps.rb +6 -0
- data/lib/mno_enterprise/testing_support/factories/audit_event.rb +2 -0
- data/lib/mno_enterprise/testing_support/mno_enterprise_api_test_helper.rb +47 -16
- data/lib/mno_enterprise/testing_support/organizations_shared_helpers.rb +6 -9
- data/lib/mno_enterprise/version.rb +1 -1
- data/spec/config/initializers/audit_log_spec.rb +5 -0
- data/spec/controllers/mno_enterprise/application_controller_spec.rb +4 -4
- data/spec/helpers/image_helper_spec.rb +69 -0
- data/spec/models/mno_enterprise/ability_spec.rb +5 -0
- data/spec/models/mno_enterprise/app_spec.rb +1 -1
- data/spec/models/mno_enterprise/base_resource_spec.rb +37 -0
- data/spec/models/mno_enterprise/credit_card_spec.rb +18 -0
- data/spec/models/mno_enterprise/organization_spec.rb +16 -0
- data/spec/models/mno_enterprise/shared_entity_spec.rb +7 -0
- data/spec/models/mno_enterprise/user_spec.rb +83 -15
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31badd1b35fad273dd0d904445d60c9af708e87f
|
4
|
+
data.tar.gz: 415613eb183bd7f511be46f2cd221a6228e67847
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5efebbd5a99177c6a089de239354cb0d2b14c63f421b93eabcebf40dab9a4883855ed1735e8c71935afa6cba87233f3b9af7b4890b4be4e78faaf5f4dec88291
|
7
|
+
data.tar.gz: c23a3e38b6f423f49fac9be8faeb7821d99ce0d59c972488860ce86ae1de49b9c4923f157586a765eed773351050a267bfb6b4db8d8258bfa11baed56d7e0bd2
|
@@ -126,13 +126,13 @@ module MnoEnterprise
|
|
126
126
|
private
|
127
127
|
|
128
128
|
# Append params to the fragment part of an existing url String
|
129
|
-
#
|
130
|
-
# => "
|
131
|
-
#
|
132
|
-
# => "
|
129
|
+
# add_param_to_fragment("/#!/platform/accounts", 'foo', 'bar')
|
130
|
+
# => "/#!/platform/accounts?foo=bar"
|
131
|
+
# add_param_to_fragment("/#!/platform/dashboard/he/43?en=690", 'foo', 'bar')
|
132
|
+
# => "/#!/platform/dashboard/he/43?en=690&foo=bar"
|
133
133
|
def add_param_to_fragment(url, param_name, param_value)
|
134
134
|
uri = URI(url)
|
135
|
-
fragment = URI(uri.fragment || "")
|
135
|
+
fragment = URI(uri.fragment || "!")
|
136
136
|
params = URI.decode_www_form(fragment.query || "") << [param_name, param_value]
|
137
137
|
fragment.query = URI.encode_www_form(params)
|
138
138
|
uri.fragment = fragment.to_s
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module MnoEnterprise
|
2
|
+
module ImageHelper
|
3
|
+
|
4
|
+
IMAGES_LOCATION = "/app/assets/images/mno_enterprise/"
|
5
|
+
|
6
|
+
# Helper method to easily access and select the images
|
7
|
+
# If full_path is true returns filename appended to the path
|
8
|
+
# If full_path is false returns filename
|
9
|
+
# Return the main-logo-whitebg.png if exists, otherwise get main-logo.png
|
10
|
+
def main_logo_white_bg_path(full_path=false)
|
11
|
+
logo_path = app_image_path("main-logo-whitebg.png") || main_logo_path
|
12
|
+
full_path ? logo_path : "mno_enterprise/#{File.basename(logo_path)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return the main-logo.png if exists otherwise get engine's logo
|
16
|
+
def main_logo_path
|
17
|
+
file_name = "main-logo.png"
|
18
|
+
app_image_path(file_name) || engine_image_path(file_name)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Build path and checks if the logo exists
|
22
|
+
def app_image_path(file_name)
|
23
|
+
app_path = "#{Rails.root}#{IMAGES_LOCATION}#{file_name}"
|
24
|
+
app_path if File.exists?(app_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get engine's logo and return it
|
28
|
+
def engine_image_path(file_name)
|
29
|
+
"#{MnoEnterprise::Engine.root}#{IMAGES_LOCATION}#{file_name}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -42,6 +42,7 @@ module MnoEnterprise
|
|
42
42
|
has_many :reviews, class_name: 'AppReview'
|
43
43
|
has_many :feedbacks, class_name: 'AppFeedback'
|
44
44
|
has_many :questions, class_name: 'AppQuestion'
|
45
|
+
has_many :shared_entities
|
45
46
|
|
46
47
|
# Return the list of available categories
|
47
48
|
def self.categories(list = nil)
|
@@ -64,12 +65,20 @@ module MnoEnterprise
|
|
64
65
|
end
|
65
66
|
|
66
67
|
# Methods for appinfo flags
|
67
|
-
%w(coming_soon single_billing add_on).each do |method|
|
68
|
+
%w(responsive coming_soon single_billing add_on).each do |method|
|
68
69
|
define_method "#{method}?" do
|
69
|
-
appinfo.presence && appinfo[method]
|
70
|
+
!!(appinfo.presence && appinfo[method])
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
74
|
+
def star_ready?
|
75
|
+
!!(appinfo.presence && appinfo['starReady'])
|
76
|
+
end
|
77
|
+
|
78
|
+
def connec_ready?
|
79
|
+
!!(appinfo.presence && !!appinfo['connecReady'])
|
80
|
+
end
|
81
|
+
|
73
82
|
def regenerate_api_key!
|
74
83
|
data = self.put(operation: 'regenerate_api_key')
|
75
84
|
self.api_key = data[:data][:api_key]
|
@@ -115,9 +115,11 @@ module MnoEnterprise
|
|
115
115
|
.max
|
116
116
|
end
|
117
117
|
|
118
|
+
# Clear the record association cache
|
118
119
|
def clear_association_cache
|
119
120
|
self.class.associations[:has_many].each do |assoc|
|
120
121
|
instance_variable_set(:"@_her_association_#{assoc[:name]}", nil)
|
122
|
+
attributes.delete(assoc[:name].to_s)
|
121
123
|
end
|
122
124
|
end
|
123
125
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# == Schema Information
|
2
2
|
#
|
3
|
-
# Endpoint:
|
3
|
+
# Endpoint:
|
4
4
|
# - /v1/credit_cards
|
5
5
|
# - /v1/organizations/:organization_id/credit_card
|
6
6
|
#
|
@@ -27,14 +27,17 @@
|
|
27
27
|
|
28
28
|
module MnoEnterprise
|
29
29
|
class CreditCard < BaseResource
|
30
|
-
|
30
|
+
|
31
31
|
attributes :id, :created_at, :updated_at, :title, :first_name, :last_name, :country, :masked_number, :number,
|
32
32
|
:month, :year, :billing_address, :billing_city, :billing_postcode, :billing_country, :verification_value, :organization_id
|
33
|
-
|
33
|
+
|
34
34
|
#==============================================================
|
35
35
|
# Associations
|
36
36
|
#==============================================================
|
37
37
|
belongs_to :organization, class_name: 'MnoEnterprise::Organization'
|
38
|
-
|
38
|
+
|
39
|
+
def expiry_date
|
40
|
+
year && month && Date.new(year, month).end_of_month
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
@@ -1,15 +1,21 @@
|
|
1
1
|
module MnoEnterprise
|
2
2
|
class Impac::Widget < BaseResource
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
alias_attribute :endpoint, :widget_category
|
4
|
+
# TODO: remove :widget_category when mnohub migrated to new model
|
5
|
+
attributes :name, :width, :widget_category, :settings, :endpoint
|
7
6
|
|
8
7
|
belongs_to :dashboard, class_name: 'MnoEnterprise::Impac::Dashboard'
|
9
8
|
has_many :kpis, class_name: 'MnoEnterprise::Impac::Kpi'
|
10
9
|
|
11
10
|
def to_audit_event
|
12
|
-
|
11
|
+
|
12
|
+
if settings['organization_ids'].any?
|
13
|
+
organization = MnoEnterprise::Organization.find_by(uid: settings['organization_ids'].first)
|
14
|
+
{ name: name, organization_id: organization.id }
|
15
|
+
else
|
16
|
+
{ name: name }
|
17
|
+
end
|
18
|
+
|
13
19
|
end
|
14
20
|
|
15
21
|
end
|
@@ -29,23 +29,27 @@ module MnoEnterprise
|
|
29
29
|
belongs_to :referrer, class_name: 'MnoEnterprise::User'
|
30
30
|
belongs_to :organization, class_name: 'MnoEnterprise::Organization'
|
31
31
|
belongs_to :team, class_name: 'MnoEnterprise::Team'
|
32
|
-
|
32
|
+
|
33
33
|
# TODO: specs
|
34
34
|
# Add the user to the organization and update the status of the invite
|
35
35
|
# Add team
|
36
36
|
def accept!(user = self.user)
|
37
37
|
self.put(operation: 'accept', data: { user_id: user.id})
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# TODO: specs
|
41
41
|
def cancel!
|
42
42
|
self.put(operation: 'cancel')
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
# TODO: specs
|
46
46
|
# Check whether the invite is expired or not
|
47
47
|
def expired?
|
48
48
|
self.status != 'pending' || self.created_at < 3.days.ago
|
49
49
|
end
|
50
|
+
|
51
|
+
def to_audit_event
|
52
|
+
self.attributes.slice(:team_id, :user_role, :user_email, :user_id, :referrer_id, :organization_id)
|
53
|
+
end
|
50
54
|
end
|
51
55
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# == Schema Information
|
3
|
+
#
|
4
|
+
# Endpoint:
|
5
|
+
# - /v1/app/:app_id/shared_entities
|
6
|
+
#
|
7
|
+
# id :integer not null, primary key
|
8
|
+
# nid :string
|
9
|
+
# name :string
|
10
|
+
# created_at :datetime not null
|
11
|
+
# updated_at :datetime not null
|
12
|
+
|
13
|
+
module MnoEnterprise
|
14
|
+
class SharedEntity < BaseResource
|
15
|
+
include MnoEnterprise::Concerns::Models::SharedEntity
|
16
|
+
end
|
17
|
+
end
|
@@ -54,9 +54,14 @@ module MnoEnterprise
|
|
54
54
|
:api_key, :api_secret, :developer, :kpi_enabled, :external_id, :meta_data
|
55
55
|
|
56
56
|
define_model_callbacks :validation #required by Devise
|
57
|
-
|
57
|
+
|
58
|
+
devise_modules = [
|
59
|
+
:remote_authenticatable, :registerable, :recoverable, :rememberable,
|
58
60
|
:trackable, :validatable, :lockable, :confirmable, :timeoutable, :password_expirable,
|
59
|
-
:omniauthable
|
61
|
+
:omniauthable
|
62
|
+
]
|
63
|
+
devise_modules.delete(:registerable) if Settings.try(:devise).try(:registration).try(:disabled)
|
64
|
+
devise(*devise_modules, omniauth_providers: Devise.omniauth_providers)
|
60
65
|
|
61
66
|
#================================
|
62
67
|
# Validation
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module MnoEnterprise
|
2
2
|
class InvoicePdf
|
3
|
+
include MnoEnterprise::ImageHelper
|
3
4
|
attr_reader :invoice, :pdf, :data
|
4
5
|
|
5
6
|
# InvoicePdf requires to be initialized
|
@@ -41,7 +42,6 @@ module MnoEnterprise
|
|
41
42
|
@data[:invoice_currency] = @invoice.price.currency_as_string
|
42
43
|
@data[:invoice_currency_name] = @invoice.price.currency.name
|
43
44
|
@data[:invoice_credit_paid] = @invoice.credit_paid
|
44
|
-
@data[:invoice_total_due] = @invoice.total_due
|
45
45
|
@data[:invoice_total_payable] = @invoice.total_payable
|
46
46
|
@data[:invoice_tax_payable] = @invoice.tax_payable
|
47
47
|
@data[:invoice_tax_pips] = (@invoice.tax_pips_applied || 0)
|
@@ -117,31 +117,21 @@ module MnoEnterprise
|
|
117
117
|
}
|
118
118
|
end
|
119
119
|
|
120
|
-
# Helper method to easily access
|
121
|
-
# images
|
122
|
-
def image_path(name)
|
123
|
-
path = "/app/assets/images/#{name}"
|
124
|
-
engine_path = "#{MnoEnterprise::Engine.root}#{path}"
|
125
|
-
app_path = "#{Rails.root}#{path}"
|
126
|
-
|
127
|
-
File.exists?(app_path) ? app_path : engine_path
|
128
|
-
end
|
129
|
-
|
130
120
|
# Format a money object
|
131
121
|
def money(m)
|
132
122
|
"#{m.format(symbol: false)} #{m.currency_as_string}"
|
133
123
|
end
|
134
124
|
|
135
|
-
|
136
125
|
# Add a repeated header to the document
|
137
126
|
def add_page_header
|
127
|
+
title = Settings.payment.disabled ? 'Account Statement - ' : 'Monthly Invoice - '
|
138
128
|
@pdf.repeat :all do
|
139
129
|
@pdf.bounding_box([0, @pdf.bounds.top+@format[:header_size]], width: 540, height: @format[:footer_size]) do
|
140
130
|
@pdf.float do
|
141
|
-
@pdf.image
|
131
|
+
@pdf.image main_logo_white_bg_path(true), scale: 0.5
|
142
132
|
end
|
143
133
|
@pdf.move_down 52
|
144
|
-
@pdf.font_size(20) { @pdf.text "
|
134
|
+
@pdf.font_size(20) { @pdf.text "#{title} #{@data[:period_month]}", style: :bold, align: :right }
|
145
135
|
end
|
146
136
|
end
|
147
137
|
end
|
@@ -156,7 +146,7 @@ module MnoEnterprise
|
|
156
146
|
@pdf.move_down 10
|
157
147
|
@pdf.font_size(8) do
|
158
148
|
@pdf.text "<color rgb='999999'>Maestrano is a service of Maestrano Pty Ltd (ABN: 80 152 564 424),</color>", inline_format: true
|
159
|
-
@pdf.text "<color rgb='999999'>Suite
|
149
|
+
@pdf.text "<color rgb='999999'>Suite 504, 46 Market Street, Sydney, NSW 2000, Australia.</color>", inline_format: true
|
160
150
|
@pdf.text "<color rgb='999999'>All charges are in #{@data[:invoice_currency_name]} (#{@data[:invoice_currency]}).</color>", inline_format: true
|
161
151
|
end
|
162
152
|
end
|
@@ -179,6 +169,8 @@ module MnoEnterprise
|
|
179
169
|
# This method is responsible for
|
180
170
|
# generating the actual pdf content
|
181
171
|
def add_page_body
|
172
|
+
payment_enabled = !Settings.payment.disabled
|
173
|
+
|
182
174
|
@pdf.stroke_color '999999'
|
183
175
|
|
184
176
|
#===============================
|
@@ -191,10 +183,10 @@ module MnoEnterprise
|
|
191
183
|
@pdf.fill_color = original_color
|
192
184
|
|
193
185
|
@pdf.text_box "Your Reference", at: [310,@pdf.cursor], width: 65, height: 13, align: :center, valign: :center,
|
194
|
-
|
186
|
+
style: :bold_italic, size: 7
|
195
187
|
|
196
188
|
@pdf.text_box @data[:invoice_reference], at: [310,@pdf.cursor], width: 230, height: 50, align: :center, valign: :center,
|
197
|
-
|
189
|
+
style: :bold
|
198
190
|
end
|
199
191
|
|
200
192
|
#===============================
|
@@ -211,8 +203,6 @@ module MnoEnterprise
|
|
211
203
|
@pdf.text "<color rgb='999999'>#{@data[:customer_billing_address]}</color>", align: :left, inline_format: true, style: :italic, size: 9
|
212
204
|
end
|
213
205
|
|
214
|
-
|
215
|
-
|
216
206
|
#===============================
|
217
207
|
# Summary
|
218
208
|
#===============================
|
@@ -221,9 +211,12 @@ module MnoEnterprise
|
|
221
211
|
@pdf.stroke_horizontal_rule
|
222
212
|
@pdf.move_down 10
|
223
213
|
|
214
|
+
summary_data_amount = @data[:invoice_price]
|
215
|
+
summary_data_amount = @data[:invoice_total_payable_with_tax] if payment_enabled
|
216
|
+
|
224
217
|
summary_data = []
|
225
218
|
summary_data << ['Period', 'Total Payable' + (@data[:invoice_tax_pips] > 0 ? "\n<font size='8'><i>(incl. GST)</i></font>" : '')]
|
226
|
-
summary_data << ["#{@data[:period_started_at].strftime("%B, %e %Y")} to #{@data[:period_ended_at].strftime("%B, %e %Y")}",money(
|
219
|
+
summary_data << ["#{@data[:period_started_at].strftime("%B, %e %Y")} to #{@data[:period_ended_at].strftime("%B, %e %Y")}",money(summary_data_amount)]
|
227
220
|
|
228
221
|
# Draw Table background
|
229
222
|
bg_height = @data[:invoice_tax_pips] > 0 ? 58 : 50
|
@@ -284,7 +277,7 @@ module MnoEnterprise
|
|
284
277
|
@pdf.fill_color = original_color
|
285
278
|
|
286
279
|
@pdf.text_box "Credit Remaining", at: [445,@pdf.cursor], width: 95, height: 23, align: :center, valign: :center,
|
287
|
-
|
280
|
+
style: :bold, size: 10
|
288
281
|
|
289
282
|
@pdf.text_box money(@data[:customer_current_credit]), at: [445,@pdf.cursor], width: 95, height: 37, align: :center, valign: :bottom
|
290
283
|
end
|
@@ -292,140 +285,79 @@ module MnoEnterprise
|
|
292
285
|
@pdf.move_down 40
|
293
286
|
end
|
294
287
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
'',
|
309
|
-
'Due Last Month',
|
310
|
-
'',
|
311
|
-
'Paid (Thank You)',
|
312
|
-
'',
|
313
|
-
'This Month',
|
314
|
-
'',
|
315
|
-
'Credit',
|
316
|
-
'',
|
317
|
-
'Total'
|
318
|
-
]
|
319
|
-
|
320
|
-
#Content
|
321
|
-
situation_data << [
|
322
|
-
'',
|
323
|
-
'',
|
324
|
-
money(@data[:invoice_previous_total_due]),
|
325
|
-
'-',
|
326
|
-
money(@data[:invoice_previous_total_paid]),
|
327
|
-
'+',
|
328
|
-
money(@data[:invoice_price]),
|
329
|
-
'-',
|
330
|
-
money(@data[:invoice_credit_paid]),
|
331
|
-
'=',
|
332
|
-
money(@data[:invoice_total_payable])
|
333
|
-
]
|
334
|
-
|
335
|
-
# Draw background
|
336
|
-
@pdf.float do
|
337
|
-
original_color = @pdf.fill_color
|
338
|
-
@pdf.fill_color "F0F0F0"
|
339
|
-
@pdf.fill_rounded_rectangle [0,@pdf.cursor], 540, 50, 5
|
340
|
-
@pdf.fill_color = original_color
|
341
|
-
end
|
342
|
-
|
343
|
-
|
344
|
-
# Draw left background
|
345
|
-
@pdf.float do
|
346
|
-
original_color = @pdf.fill_color
|
347
|
-
@pdf.fill_color "E0E0E0"
|
348
|
-
@pdf.fill_rounded_rectangle [0,@pdf.cursor], 80, 50, 5
|
349
|
-
@pdf.fill_color = original_color
|
350
|
-
@pdf.move_down 21
|
351
|
-
if @data[:invoice_tax_pips] > 0
|
352
|
-
@pdf.text_box 'Excl. GST', at: [12,@pdf.cursor]
|
353
|
-
else
|
354
|
-
@pdf.text_box 'Details', at: [20,@pdf.cursor]
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
# Draw table
|
359
|
-
@pdf.table(situation_data) do |t|
|
360
|
-
t.header = true
|
361
|
-
t.width = 540
|
362
|
-
t.column_widths = [75,18,75,18,75,18,75,18,75,18,75]
|
363
|
-
t.row(0).font_style = :bold
|
364
|
-
t.row(0).size = 8
|
365
|
-
t.row(0).height = 22
|
366
|
-
t.row(1).height = 25
|
367
|
-
|
368
|
-
t.cell_style = {
|
369
|
-
borders: [],
|
370
|
-
overflow: :shrink_to_fit,
|
371
|
-
align: :center
|
372
|
-
}
|
373
|
-
|
374
|
-
# Color the '+','-' and '=' characters
|
375
|
-
t.cells.style do |c|
|
376
|
-
if c.row == 1 && c.column.odd?
|
377
|
-
c.text_color = "a8a8a8"
|
378
|
-
end
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
|
383
|
-
#=================================
|
384
|
-
# Account Situation - Tax Section
|
385
|
-
#=================================
|
386
|
-
if @data[:invoice_tax_pips] > 0
|
387
|
-
|
388
|
-
#-----------------
|
389
|
-
# GST row
|
390
|
-
#-----------------
|
391
|
-
@pdf.move_down 8
|
392
|
-
|
393
|
-
table_data = []
|
394
|
-
table_data << [
|
288
|
+
if payment_enabled
|
289
|
+
#===============================
|
290
|
+
# Account Situation
|
291
|
+
#===============================
|
292
|
+
@pdf.move_down 30
|
293
|
+
@pdf.font_size(20) { @pdf.text 'Account Situation', style: :bold }
|
294
|
+
@pdf.stroke_horizontal_rule
|
295
|
+
@pdf.move_down 10
|
296
|
+
|
297
|
+
# Situation Data
|
298
|
+
situation_data = []
|
299
|
+
# Header
|
300
|
+
situation_data << [
|
395
301
|
'',
|
396
302
|
'',
|
303
|
+
'Due Last Month',
|
397
304
|
'',
|
305
|
+
'Paid (Thank You)',
|
398
306
|
'',
|
307
|
+
'This Month',
|
399
308
|
'',
|
309
|
+
'Credit',
|
400
310
|
'',
|
311
|
+
'Total'
|
312
|
+
]
|
313
|
+
|
314
|
+
#Content
|
315
|
+
situation_data << [
|
401
316
|
'',
|
402
317
|
'',
|
403
|
-
|
318
|
+
money(@data[:invoice_previous_total_due]),
|
319
|
+
'-',
|
320
|
+
money(@data[:invoice_previous_total_paid]),
|
404
321
|
'+',
|
405
|
-
money(@data[:
|
322
|
+
money(@data[:invoice_price]),
|
323
|
+
'-',
|
324
|
+
money(@data[:invoice_credit_paid]),
|
325
|
+
'=',
|
326
|
+
money(@data[:invoice_total_payable])
|
406
327
|
]
|
407
328
|
|
408
|
-
# Draw
|
329
|
+
# Draw background
|
409
330
|
@pdf.float do
|
410
331
|
original_color = @pdf.fill_color
|
411
332
|
@pdf.fill_color "F0F0F0"
|
412
|
-
@pdf.fill_rounded_rectangle [
|
333
|
+
@pdf.fill_rounded_rectangle [0,@pdf.cursor], 540, 50, 5
|
413
334
|
@pdf.fill_color = original_color
|
414
335
|
end
|
415
336
|
|
337
|
+
|
416
338
|
# Draw left background
|
417
339
|
@pdf.float do
|
418
340
|
original_color = @pdf.fill_color
|
419
|
-
@pdf.fill_color "
|
420
|
-
@pdf.fill_rounded_rectangle [
|
341
|
+
@pdf.fill_color "E0E0E0"
|
342
|
+
@pdf.fill_rounded_rectangle [0,@pdf.cursor], 80, 50, 5
|
421
343
|
@pdf.fill_color = original_color
|
344
|
+
@pdf.move_down 21
|
345
|
+
if @data[:invoice_tax_pips] > 0
|
346
|
+
@pdf.text_box 'Excl. GST', at: [12,@pdf.cursor]
|
347
|
+
else
|
348
|
+
@pdf.text_box 'Details', at: [20,@pdf.cursor]
|
349
|
+
end
|
422
350
|
end
|
423
351
|
|
424
|
-
|
352
|
+
# Draw table
|
353
|
+
@pdf.table(situation_data) do |t|
|
425
354
|
t.header = true
|
426
355
|
t.width = 540
|
427
356
|
t.column_widths = [75,18,75,18,75,18,75,18,75,18,75]
|
428
|
-
t.row(0).
|
357
|
+
t.row(0).font_style = :bold
|
358
|
+
t.row(0).size = 8
|
359
|
+
t.row(0).height = 22
|
360
|
+
t.row(1).height = 25
|
429
361
|
|
430
362
|
t.cell_style = {
|
431
363
|
borders: [],
|
@@ -435,73 +367,134 @@ module MnoEnterprise
|
|
435
367
|
|
436
368
|
# Color the '+','-' and '=' characters
|
437
369
|
t.cells.style do |c|
|
438
|
-
if c.row ==
|
370
|
+
if c.row == 1 && c.column.odd?
|
439
371
|
c.text_color = "a8a8a8"
|
440
372
|
end
|
441
373
|
end
|
442
374
|
end
|
443
375
|
|
444
376
|
|
445
|
-
|
446
|
-
#
|
447
|
-
|
448
|
-
@
|
377
|
+
#=================================
|
378
|
+
# Account Situation - Tax Section
|
379
|
+
#=================================
|
380
|
+
if @data[:invoice_tax_pips] > 0
|
449
381
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
382
|
+
#-----------------
|
383
|
+
# GST row
|
384
|
+
#-----------------
|
385
|
+
@pdf.move_down 8
|
386
|
+
|
387
|
+
table_data = []
|
388
|
+
table_data << [
|
389
|
+
'',
|
390
|
+
'',
|
391
|
+
'',
|
392
|
+
'',
|
393
|
+
'',
|
394
|
+
'',
|
395
|
+
'',
|
396
|
+
'',
|
397
|
+
'GST',
|
398
|
+
'+',
|
399
|
+
money(@data[:invoice_tax_payable]),
|
400
|
+
]
|
401
|
+
|
402
|
+
# Draw table background
|
403
|
+
@pdf.float do
|
404
|
+
original_color = @pdf.fill_color
|
405
|
+
@pdf.fill_color "F0F0F0"
|
406
|
+
@pdf.fill_rounded_rectangle [368,@pdf.cursor], 172, 24, 5
|
407
|
+
@pdf.fill_color = original_color
|
408
|
+
end
|
464
409
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
410
|
+
# Draw left background
|
411
|
+
@pdf.float do
|
412
|
+
original_color = @pdf.fill_color
|
413
|
+
@pdf.fill_color "FAB451"
|
414
|
+
@pdf.fill_rounded_rectangle [368,@pdf.cursor], 80, 24, 5
|
415
|
+
@pdf.fill_color = original_color
|
416
|
+
end
|
472
417
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
418
|
+
@pdf.table(table_data) do |t|
|
419
|
+
t.header = true
|
420
|
+
t.width = 540
|
421
|
+
t.column_widths = [75,18,75,18,75,18,75,18,75,18,75]
|
422
|
+
t.row(0).height = 25
|
423
|
+
|
424
|
+
t.cell_style = {
|
425
|
+
borders: [],
|
426
|
+
overflow: :shrink_to_fit,
|
427
|
+
align: :center
|
428
|
+
}
|
429
|
+
|
430
|
+
# Color the '+','-' and '=' characters
|
431
|
+
t.cells.style do |c|
|
432
|
+
if c.row == 0 && c.column.odd?
|
433
|
+
c.text_color = "a8a8a8"
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
480
437
|
|
481
|
-
@pdf.table(table_data) do |t|
|
482
|
-
t.header = true
|
483
|
-
t.width = 540
|
484
|
-
t.row(0).font_style = :bold
|
485
|
-
t.column_widths = [75,18,75,18,75,18,75,18,75,18,75]
|
486
|
-
t.row(0).height = 25
|
487
438
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
439
|
+
#-----------------
|
440
|
+
# Total (incl. GST)
|
441
|
+
#-----------------
|
442
|
+
@pdf.move_down 5
|
443
|
+
|
444
|
+
table_data = []
|
445
|
+
table_data << [
|
446
|
+
'',
|
447
|
+
'',
|
448
|
+
'',
|
449
|
+
'',
|
450
|
+
'',
|
451
|
+
'',
|
452
|
+
'',
|
453
|
+
'',
|
454
|
+
'Total (incl. GST)',
|
455
|
+
'=',
|
456
|
+
money(@data[:invoice_total_payable_with_tax]),
|
457
|
+
]
|
458
|
+
|
459
|
+
# Draw table background
|
460
|
+
@pdf.float do
|
461
|
+
original_color = @pdf.fill_color
|
462
|
+
@pdf.fill_color "F0F0F0"
|
463
|
+
@pdf.fill_rounded_rectangle [368,@pdf.cursor], 172, 24, 5
|
464
|
+
@pdf.fill_color = original_color
|
465
|
+
end
|
493
466
|
|
494
|
-
#
|
495
|
-
|
496
|
-
|
497
|
-
|
467
|
+
# Draw left background
|
468
|
+
@pdf.float do
|
469
|
+
original_color = @pdf.fill_color
|
470
|
+
@pdf.fill_color "DAE173"
|
471
|
+
@pdf.fill_rounded_rectangle [368,@pdf.cursor], 80, 24, 5
|
472
|
+
@pdf.fill_color = original_color
|
473
|
+
end
|
474
|
+
|
475
|
+
@pdf.table(table_data) do |t|
|
476
|
+
t.header = true
|
477
|
+
t.width = 540
|
478
|
+
t.row(0).font_style = :bold
|
479
|
+
t.column_widths = [75,18,75,18,75,18,75,18,75,18,75]
|
480
|
+
t.row(0).height = 25
|
481
|
+
|
482
|
+
t.cell_style = {
|
483
|
+
borders: [],
|
484
|
+
overflow: :shrink_to_fit,
|
485
|
+
align: :center
|
486
|
+
}
|
487
|
+
|
488
|
+
# Color the '+','-' and '=' characters
|
489
|
+
t.cells.style do |c|
|
490
|
+
if c.row == 0 && c.column.odd?
|
491
|
+
c.text_color = "a8a8a8"
|
492
|
+
end
|
498
493
|
end
|
499
494
|
end
|
500
495
|
end
|
501
|
-
|
502
496
|
end
|
503
497
|
|
504
|
-
|
505
498
|
#===============================
|
506
499
|
# Details
|
507
500
|
#===============================
|
@@ -520,10 +513,10 @@ module MnoEnterprise
|
|
520
513
|
t.row_colors = ["FFFFFF", "F0F0F0"]
|
521
514
|
t.column_widths = [240,100,100,100]
|
522
515
|
t.cell_style = { borders: [:bottom],
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
516
|
+
border_width: 1,
|
517
|
+
border_color: "999999",
|
518
|
+
inline_format: true
|
519
|
+
}
|
527
520
|
t.row(0).borders = [:bottom]
|
528
521
|
t.row(0).border_width = 2
|
529
522
|
t.row(0).font_style = :bold
|