mno-enterprise-core 3.2.1 → 3.3.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 +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
|