ydim_html 1.0.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.
- data/History.txt +6 -0
- data/LICENSE.txt +339 -0
- data/Manifest.txt +47 -0
- data/README.txt +21 -0
- data/Rakefile +28 -0
- data/bin/ydim-htmld +38 -0
- data/lib/ydim/html.rb +10 -0
- data/lib/ydim/html/config.rb +37 -0
- data/lib/ydim/html/state/ajax_values.rb +16 -0
- data/lib/ydim/html/state/autoinvoice.rb +93 -0
- data/lib/ydim/html/state/confirm.rb +15 -0
- data/lib/ydim/html/state/debitor.rb +81 -0
- data/lib/ydim/html/state/debitors.rb +23 -0
- data/lib/ydim/html/state/global.rb +99 -0
- data/lib/ydim/html/state/global_predefine.rb +13 -0
- data/lib/ydim/html/state/init.rb +20 -0
- data/lib/ydim/html/state/invoice.rb +179 -0
- data/lib/ydim/html/state/invoices.rb +69 -0
- data/lib/ydim/html/state/pdf.rb +16 -0
- data/lib/ydim/html/util/lookandfeel.rb +132 -0
- data/lib/ydim/html/util/server.rb +36 -0
- data/lib/ydim/html/util/session.rb +27 -0
- data/lib/ydim/html/util/validator.rb +62 -0
- data/lib/ydim/html/view/ajax_values.rb +22 -0
- data/lib/ydim/html/view/autoinvoice.rb +79 -0
- data/lib/ydim/html/view/autoinvoices.rb +41 -0
- data/lib/ydim/html/view/confirm.rb +27 -0
- data/lib/ydim/html/view/debitor.rb +111 -0
- data/lib/ydim/html/view/debitors.rb +44 -0
- data/lib/ydim/html/view/htmlgrid.rb +103 -0
- data/lib/ydim/html/view/init.rb +29 -0
- data/lib/ydim/html/view/invoice.rb +217 -0
- data/lib/ydim/html/view/invoices.rb +158 -0
- data/lib/ydim/html/view/navigation.rb +28 -0
- data/lib/ydim/html/view/pdf.rb +23 -0
- data/lib/ydim/html/view/template.rb +70 -0
- data/test/selenium.rb +1687 -0
- data/test/selenium/selenium-server.jar +0 -0
- data/test/selenium/test_autoinvoice.rb +318 -0
- data/test/selenium/test_debitor.rb +343 -0
- data/test/selenium/test_debitors.rb +46 -0
- data/test/selenium/test_init.rb +104 -0
- data/test/selenium/test_invoice.rb +295 -0
- data/test/selenium/test_invoices.rb +175 -0
- data/test/selenium/unit.rb +124 -0
- data/test/stub/http_server.rb +139 -0
- data/test/suite.rb +14 -0
- metadata +138 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::State::Invoices -- ydim -- 13.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'ydim/html/state/global_predefine'
|
5
|
+
require 'ydim/html/view/invoices'
|
6
|
+
|
7
|
+
module YDIM
|
8
|
+
module Html
|
9
|
+
module State
|
10
|
+
class AjaxInvoices < SBSM::State
|
11
|
+
VOLATILE = true
|
12
|
+
VIEW = Html::View::InvoiceList
|
13
|
+
end
|
14
|
+
module AjaxInvoiceMethods
|
15
|
+
def ajax_invoices(model=@model)
|
16
|
+
keys = [:payment_received, :unique_id, :deleted]
|
17
|
+
input = user_input(keys, [:unique_id])
|
18
|
+
id = input.delete(:unique_id).to_i
|
19
|
+
if(!error? && !input.empty? && (invoice = @session.invoice(id)))
|
20
|
+
input.each { |key, val|
|
21
|
+
invoice.send("#{key}=", val)
|
22
|
+
}
|
23
|
+
invoice.odba_store
|
24
|
+
model.delete_if { |info| info.unique_id == id }
|
25
|
+
end
|
26
|
+
AjaxInvoices.new(@session, model)
|
27
|
+
end
|
28
|
+
def ajax_status
|
29
|
+
AjaxInvoices.new(@session, load_invoices)
|
30
|
+
end
|
31
|
+
def currency_convert(invoices)
|
32
|
+
currency = Html.config.currency
|
33
|
+
converter = @session.currency_converter
|
34
|
+
invoices.each { |inv|
|
35
|
+
if(icur = inv.currency)
|
36
|
+
inv.total_netto = converter.convert(inv.total_netto, icur, currency)
|
37
|
+
inv.total_brutto = converter.convert(inv.total_brutto, icur, currency)
|
38
|
+
end
|
39
|
+
inv.currency = currency
|
40
|
+
}
|
41
|
+
end
|
42
|
+
def sort_invoices(invoices)
|
43
|
+
null_date = Date.new(9999)
|
44
|
+
invoices.sort_by { |inv|
|
45
|
+
[null_date - (inv.date || null_date), inv.description.to_s]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
class Invoices < Global
|
50
|
+
include AjaxInvoiceMethods
|
51
|
+
VIEW = Html::View::Invoices
|
52
|
+
def init
|
53
|
+
super
|
54
|
+
invs = @session.invoice_infos('is_open')
|
55
|
+
invs.concat @session.invoice_infos('is_due')
|
56
|
+
@model = sort_invoices(currency_convert(invs))
|
57
|
+
end
|
58
|
+
def ajax_collect_garbage
|
59
|
+
@session.collect_garbage
|
60
|
+
AjaxInvoices.new(@session, [])
|
61
|
+
end
|
62
|
+
private
|
63
|
+
def load_invoices
|
64
|
+
@model = sort_invoices(currency_convert(@session.invoices))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::State::Pdf -- ydim -- 17.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'ydim/html/view/pdf'
|
5
|
+
|
6
|
+
module YDIM
|
7
|
+
module Html
|
8
|
+
module State
|
9
|
+
class Pdf < SBSM::State
|
10
|
+
VOLATILE = true
|
11
|
+
VIEW = Html::View::Pdf
|
12
|
+
attr_accessor :sortby, :sort_reverse
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::Custom::Lookandfeel -- ydim -- 12.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'sbsm/lookandfeel'
|
5
|
+
|
6
|
+
module YDIM
|
7
|
+
module Html
|
8
|
+
module Custom
|
9
|
+
class Lookandfeel < SBSM::Lookandfeel
|
10
|
+
DICTIONARIES = {
|
11
|
+
'de' => {
|
12
|
+
:address_lines => 'Strasse/Nr.',
|
13
|
+
:autoinvoices => 'Vorlagen',
|
14
|
+
:CHF => 'CHF',
|
15
|
+
:collect_garbage => 'Papierkorb Leeren',
|
16
|
+
:comma => ', ',
|
17
|
+
:confirm_send_invoice0 => 'Die Rechnung wurde an folgende Email-Adressen verschickt: ',
|
18
|
+
:confirm_send_invoice1 => '.',
|
19
|
+
:contact => 'Name',
|
20
|
+
:contact_firstname => 'Vorname',
|
21
|
+
:contact_title => 'Titel',
|
22
|
+
:country => 'Land',
|
23
|
+
:cpr_link => ' ywesee GmbH',
|
24
|
+
:create_debitor => 'Neuer Kunde',
|
25
|
+
:create_autoinvoice => 'Neue Vorlage',
|
26
|
+
:create_invoice => 'Neue Rechnung',
|
27
|
+
:create_item => 'Neue Position',
|
28
|
+
:currency => 'Währung',
|
29
|
+
:dash => ' – ',
|
30
|
+
:date => 'Rechnungsdatum',
|
31
|
+
:date_format => '%d.%m.%Y',
|
32
|
+
:debitors => 'Kunden',
|
33
|
+
:debitor_name => 'Kunde',
|
34
|
+
:debitor_type => 'Kundenart',
|
35
|
+
:delete => 'L�schen',
|
36
|
+
:description => 'Beschreibung',
|
37
|
+
:dt_consulting => 'Beratung',
|
38
|
+
:dt_doctor => 'Arzt',
|
39
|
+
:dt_health => 'Gesundheitsdienstleister',
|
40
|
+
:dt_hospital => 'Spital',
|
41
|
+
:dt_hosting => 'Hosting-Kunde',
|
42
|
+
:dt_info => 'ODDB.org-User',
|
43
|
+
:dt_insurance => 'Krankenkasse',
|
44
|
+
:dt_pharma => 'Pharma-Firma',
|
45
|
+
:dt_pharmacy => 'Apotheke',
|
46
|
+
:e_domainless_email_address => 'Wir akzeptieren keine lokalen Email-Adressen.',
|
47
|
+
:e_invalid_email_address => 'Die angegebene Email-Adresse ist ung�ltig.',
|
48
|
+
:e_invalid_numeric_format => 'Ung�ltiges Zahlenformat',
|
49
|
+
:e_invalid_phone => 'Die angegebene Telefonnummer ist ung�ltig.',
|
50
|
+
:e_too_many_emails => 'Es sind maximal 3 Email-Adressen erlaubt.',
|
51
|
+
:email => 'Email',
|
52
|
+
:emails => 'Email (max. 3)',
|
53
|
+
:e_bygone_date => 'Bitte geben Sie ein Datum an, welches in der Zukuft liegt.',
|
54
|
+
:e_missing0 => 'Bitte geben Sie das Feld "',
|
55
|
+
:e_missing1 => '" an.',
|
56
|
+
:EUR => 'EUR',
|
57
|
+
:Frau => 'Frau',
|
58
|
+
:generate_invoice => 'Generieren',
|
59
|
+
:Herr => 'Herr',
|
60
|
+
:html_title => 'YDIM',
|
61
|
+
:invoice_interval => 'Rechnungs-Intervall',
|
62
|
+
:inv_m => 'Nur Manuell',
|
63
|
+
:inv_3 => 'Viertelj�hrlich',
|
64
|
+
:inv_6 => 'Halbj�hrlich',
|
65
|
+
:inv_12 => 'J�hrlich',
|
66
|
+
:inv_24 => 'Alle zwei Jahre',
|
67
|
+
:invoices => 'Rechnungen',
|
68
|
+
:is_due => 'Fällige Rechnungen',
|
69
|
+
:is_open => 'Offene Rechnungen',
|
70
|
+
:is_paid => 'Bezahlte Rechnungen',
|
71
|
+
:is_trash => 'Papierkorb',
|
72
|
+
:lgpl_license => 'LGPL',
|
73
|
+
:location => 'PLZ/Ort',
|
74
|
+
:login => 'Login',
|
75
|
+
:logout => 'Logout',
|
76
|
+
:name => 'Firma',
|
77
|
+
:pass => 'Passwort',
|
78
|
+
:payment_period0 => ' Zahlbar in ',
|
79
|
+
:payment_period1 => ' Tagen',
|
80
|
+
:pdf => 'PDF',
|
81
|
+
:phone => 'Telefon',
|
82
|
+
:precision => 'Kommastellen',
|
83
|
+
:reminder_body => 'Erinnerungsmail Text',
|
84
|
+
:reminder_date => 'Wird am %d.%m.%Y versendet',
|
85
|
+
:reminder_none => 'Es wird kein Erinnerungsmail versendet',
|
86
|
+
:reminder_subject => 'Erinnerungsmail Betreff',
|
87
|
+
:salutation => 'Anrede',
|
88
|
+
:send_invoice => 'Email Senden',
|
89
|
+
:suppress_vat => 'OHNE MwSt.',
|
90
|
+
:th_currency => 'Währung',
|
91
|
+
:th_debitor_email => 'Email',
|
92
|
+
:th_debitor_name => 'Name',
|
93
|
+
:th_debitor_type => 'Kundenart',
|
94
|
+
:th_description => 'Beschreibung',
|
95
|
+
:th_domain => 'Domain',
|
96
|
+
:th_email => 'Email',
|
97
|
+
:th_formatted_date => 'Datum',
|
98
|
+
:th_name => 'Name',
|
99
|
+
:th_next_invoice_date => 'N�chste Rechnung',
|
100
|
+
:th_phone => 'Telefon',
|
101
|
+
:th_price => 'Preis',
|
102
|
+
:th_quantity => 'Anzahl',
|
103
|
+
:th_text => 'Positionstext',
|
104
|
+
:th_time => 'Zeit',
|
105
|
+
:th_toggle_payment_received => 'Status',
|
106
|
+
:th_total_brutto => 'Brutto',
|
107
|
+
:th_total_netto => 'Netto',
|
108
|
+
:th_unique_id => 'ID',
|
109
|
+
:th_unit => 'Einheit',
|
110
|
+
:time_format => '%d.%m.%Y %H:%M',
|
111
|
+
:toggle_deleted => 'l�schen',
|
112
|
+
:toggle_paid => 'offen',
|
113
|
+
:toggle_recovered => 'wiederherstellen',
|
114
|
+
:toggle_unpaid => 'bezahlt',
|
115
|
+
:total => 'Total',
|
116
|
+
:total_brutto => 'Total Brutto',
|
117
|
+
:total_netto => 'Total Netto',
|
118
|
+
:unique_id => 'ID',
|
119
|
+
:update => 'Speichern',
|
120
|
+
:vat => 'MwSt. (7.6%)',
|
121
|
+
:ydim => 'YDIM',
|
122
|
+
:ydim_version => 'Commit-ID',
|
123
|
+
},
|
124
|
+
}
|
125
|
+
RESOURCES = {
|
126
|
+
:css => 'ydim.css',
|
127
|
+
:javascript => 'javascript',
|
128
|
+
}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::Util::Server -- ydim -- 12.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'openssl'
|
5
|
+
require 'sbsm/drbserver'
|
6
|
+
require 'ydim/html/util/session'
|
7
|
+
require 'ydim/html/util/validator'
|
8
|
+
require 'ydim/client'
|
9
|
+
|
10
|
+
module YDIM
|
11
|
+
module Html
|
12
|
+
module Util
|
13
|
+
class Server < SBSM::DRbServer
|
14
|
+
SESSION = Html::Util::Session
|
15
|
+
VALIDATOR = Html::Util::Validator
|
16
|
+
def initialize(server)
|
17
|
+
@server = server
|
18
|
+
@private_key = OpenSSL::PKey::DSA.new(File.read(Html.config.root_key))
|
19
|
+
@system = YDIM::Client.new(Html.config)
|
20
|
+
super(@system)
|
21
|
+
end
|
22
|
+
def login(email, pass_hash)
|
23
|
+
(email == Html.config.email) && (pass_hash == Html.config.md5_pass)
|
24
|
+
end
|
25
|
+
def method_missing(meth, *args)
|
26
|
+
@system.login(@server, @private_key)
|
27
|
+
begin
|
28
|
+
@system.send(meth, *args)
|
29
|
+
ensure
|
30
|
+
@system.logout
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::Util::Session -- ydim -- 12.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'sbsm/session'
|
5
|
+
require 'ydim/html/state/global'
|
6
|
+
require 'ydim/html/util/lookandfeel'
|
7
|
+
|
8
|
+
module YDIM
|
9
|
+
module Html
|
10
|
+
module Util
|
11
|
+
class Session < SBSM::Session
|
12
|
+
DEFAULT_LANGUAGE = 'de'
|
13
|
+
DEFAULT_STATE = Html::State::Init
|
14
|
+
LOOKANDFEEL = Html::Custom::Lookandfeel
|
15
|
+
def login
|
16
|
+
@app.login(user_input(:email), user_input(:pass))
|
17
|
+
end
|
18
|
+
def invoices
|
19
|
+
@app.invoice_infos(user_input(:status) || 'is_open')
|
20
|
+
end
|
21
|
+
def method_missing(meth, *args)
|
22
|
+
@app.send(meth, *args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::Util::Validator -- ydim -- 12.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'sbsm/validator'
|
5
|
+
|
6
|
+
module YDIM
|
7
|
+
module Html
|
8
|
+
module Util
|
9
|
+
class Validator < SBSM::Validator
|
10
|
+
BOOLEAN = [:payment_received, :deleted, :suppress_vat]
|
11
|
+
DATES = [:date, :hosting_invoice_date]
|
12
|
+
ALLOWED_TAGS = %{a b br div font h1 h2 h3 i img invoice li ol p pre span
|
13
|
+
strong u ul year}
|
14
|
+
ENUMS = {
|
15
|
+
:currency => [ 'CHF', 'EUR', ],
|
16
|
+
:debitor_type => [ nil, 'dt_hosting', 'dt_pharmacy', 'dt_pharma',
|
17
|
+
'dt_insurance', 'dt_info', 'dt_hospital', 'dt_health', 'dt_doctor',
|
18
|
+
'dt_consulting' ],
|
19
|
+
:invoice_interval => [ 'inv_12', 'inv_6', 'inv_3', 'inv_24', 'inv_m', ],
|
20
|
+
:salutation => [ nil, 'Frau', 'Herr', ],
|
21
|
+
:status => [ nil, 'is_open', 'is_due', 'is_paid', 'is_trash'],
|
22
|
+
}
|
23
|
+
EVENTS = [ :ajax_collect_garbage, :ajax_create_item, :ajax_debitor,
|
24
|
+
:ajax_delete_autoinvoice, :ajax_delete_item, :ajax_item,
|
25
|
+
:ajax_invoice, :ajax_invoices, :ajax_status, :autoinvoice,
|
26
|
+
:create_autoinvoice, :create_debitor, :create_invoice, :debitor,
|
27
|
+
:debitors, :generate_invoice, :invoice, :invoices, :login, :logout,
|
28
|
+
:pdf, :send_invoice, :sort, :update ]
|
29
|
+
STRINGS = [ :name, :contact, :contact_firstname, :contact_title,
|
30
|
+
:country, :description, :location, :sortvalue, :text, :unit ]
|
31
|
+
NUMERIC = [ :unique_id, :hosting_price, :index, :precision, :price,
|
32
|
+
:quantity ]
|
33
|
+
HTML = [ :reminder_body, :reminder_subject ]
|
34
|
+
def address_lines(value)
|
35
|
+
validate_string(value).split(/\r|\n|\r\n/)
|
36
|
+
end
|
37
|
+
def emails(value)
|
38
|
+
value.to_s.split(/\s*,\s*/).collect do |val| email(val) end
|
39
|
+
rescue SBSM::InvalidDataError => err
|
40
|
+
raise SBSM::InvalidDataError.new(err.message, :emails, value)
|
41
|
+
end
|
42
|
+
def phone(value)
|
43
|
+
str = value.to_s.strip
|
44
|
+
return if(str.empty?)
|
45
|
+
if(/^00[0-9 ]{10,}$/.match(str))
|
46
|
+
str
|
47
|
+
else
|
48
|
+
raise SBSM::InvalidDataError.new(:e_invalid_phone, :phone, str)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
def validate_numeric(key, value)
|
52
|
+
match = /-?\d*(\.\d{1,2})?/.match(value)
|
53
|
+
if(match[1])
|
54
|
+
match[0].to_f
|
55
|
+
else
|
56
|
+
match[0].to_i
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::View::AjaxValues -- ydim -- 18.01.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'htmlgrid/component'
|
5
|
+
require 'cgi'
|
6
|
+
|
7
|
+
module YDIM
|
8
|
+
module Html
|
9
|
+
module View
|
10
|
+
class AjaxValues < HtmlGrid::Component
|
11
|
+
HTTP_HEADERS = {
|
12
|
+
'Content-Type' => 'text/javascript; charset=ISO-8859-1',
|
13
|
+
}
|
14
|
+
def to_html(context)
|
15
|
+
"var ajaxResponse = {\n" << @model.collect { |key, val|
|
16
|
+
"'#{escape(key)}': '#{escape(val)}'"
|
17
|
+
}.join(",\n") << "\n};"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Html::View::AutoInvoice -- ydim -- 13.12.2006 -- hwyss@ywesee.com
|
3
|
+
|
4
|
+
require 'ydim/html/view/invoice'
|
5
|
+
|
6
|
+
module YDIM
|
7
|
+
module Html
|
8
|
+
module View
|
9
|
+
class AutoInvoiceInnerComposite < InvoiceInnerComposite
|
10
|
+
COMPONENTS = {
|
11
|
+
[0,0] => :unique_id,
|
12
|
+
[0,1,0] => :debitor_name,
|
13
|
+
[1,1,1] => 'dash',
|
14
|
+
[1,1,2] => :debitor_email,
|
15
|
+
[0,2] => :description,
|
16
|
+
[0,3] => :date,
|
17
|
+
[0,4] => :currency,
|
18
|
+
[0,5] => :precision,
|
19
|
+
[0,6] => :invoice_interval,
|
20
|
+
}
|
21
|
+
end
|
22
|
+
class AutoInvoiceReminderComposite < HtmlGrid::Composite
|
23
|
+
COMPONENTS = {
|
24
|
+
[0,0] => :reminder_subject,
|
25
|
+
[0,1] => :reminder_body,
|
26
|
+
[1,2] => :reminder_date,
|
27
|
+
}
|
28
|
+
CSS_MAP = {
|
29
|
+
[0,1] => 'top',
|
30
|
+
}
|
31
|
+
COMPONENT_CSS_MAP = {
|
32
|
+
[0,0] => 'extralarge',
|
33
|
+
}
|
34
|
+
LABELS = true
|
35
|
+
def reminder_body(model)
|
36
|
+
input = HtmlGrid::Textarea.new(:reminder_body, model, @session, self)
|
37
|
+
input.set_attribute('wrap', 'hard')
|
38
|
+
input.set_attribute('cols', '72')
|
39
|
+
input.set_attribute('style', 'font-family: fixed;')
|
40
|
+
input.label = true
|
41
|
+
input.unescaped = true
|
42
|
+
value = model.reminder_body
|
43
|
+
if(value.nil? || value.empty?)
|
44
|
+
input.value = @session.state.format_invoice
|
45
|
+
end
|
46
|
+
input
|
47
|
+
end
|
48
|
+
def reminder_date(model)
|
49
|
+
body = model.reminder_body.to_s.strip
|
50
|
+
subject = model.reminder_subject.to_s.strip
|
51
|
+
if(body.empty? || subject.empty? || !model.date)
|
52
|
+
@lookandfeel.lookup(:reminder_none)
|
53
|
+
else
|
54
|
+
(model.date << 1).strftime(@lookandfeel.lookup(:reminder_date))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
class AutoInvoiceComposite < InvoiceComposite
|
59
|
+
COMPONENTS = {
|
60
|
+
[0,0] => AutoInvoiceInnerComposite,
|
61
|
+
[0,1] => :items,
|
62
|
+
[0,2] => InvoiceTotalComposite,
|
63
|
+
[0,3] => AutoInvoiceReminderComposite,
|
64
|
+
[0,4] => :submit,
|
65
|
+
[1,4] => :generate_invoice,
|
66
|
+
}
|
67
|
+
CSS_MAP = {
|
68
|
+
4 => 'padded'
|
69
|
+
}
|
70
|
+
def generate_invoice(model)
|
71
|
+
button(:generate_invoice, model)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
class AutoInvoice < Invoice
|
75
|
+
CONTENT = AutoInvoiceComposite
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|