eboshi 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +28 -0
- data/Rakefile +8 -0
- data/app/assets/config/eboshi_manifest.js +1 -0
- data/app/assets/stylesheets/eboshi/application.css +15 -0
- data/app/controllers/eboshi/adjustments_controller.rb +77 -0
- data/app/controllers/eboshi/application_controller.rb +62 -0
- data/app/controllers/eboshi/assignments_controller.rb +31 -0
- data/app/controllers/eboshi/budgets_controller.rb +43 -0
- data/app/controllers/eboshi/calendar_controller.rb +12 -0
- data/app/controllers/eboshi/clients_controller.rb +41 -0
- data/app/controllers/eboshi/invoices_controller.rb +69 -0
- data/app/controllers/eboshi/line_items_controller.rb +28 -0
- data/app/controllers/eboshi/payments_controller.rb +31 -0
- data/app/controllers/eboshi/user_sessions_controller.rb +25 -0
- data/app/controllers/eboshi/users_controller.rb +41 -0
- data/app/controllers/eboshi/works_controller.rb +83 -0
- data/app/helpers/eboshi/application_helper.rb +15 -0
- data/app/helpers/eboshi/calendar_helper.rb +80 -0
- data/app/helpers/eboshi/shallow_route_helper.rb +68 -0
- data/app/jobs/eboshi/application_job.rb +4 -0
- data/app/mailers/eboshi/application_mailer.rb +6 -0
- data/app/models/eboshi/adjustment.rb +37 -0
- data/app/models/eboshi/application_record.rb +5 -0
- data/app/models/eboshi/assignment.rb +20 -0
- data/app/models/eboshi/budget.rb +33 -0
- data/app/models/eboshi/client.rb +85 -0
- data/app/models/eboshi/invoice.rb +87 -0
- data/app/models/eboshi/line_item.rb +94 -0
- data/app/models/eboshi/payment.rb +20 -0
- data/app/models/eboshi/user.rb +128 -0
- data/app/models/eboshi/user_session.rb +6 -0
- data/app/models/eboshi/work.rb +66 -0
- data/app/views/eboshi/adjustments/_adjustment.html.slim +15 -0
- data/app/views/eboshi/adjustments/_form.html.haml +27 -0
- data/app/views/eboshi/adjustments/edit.html.haml +7 -0
- data/app/views/eboshi/adjustments/new.html.haml +8 -0
- data/app/views/eboshi/assignments/new.html.haml +18 -0
- data/app/views/eboshi/budgets/form.html.haml +22 -0
- data/app/views/eboshi/calendar/index.html.slim +32 -0
- data/app/views/eboshi/clients/_form.html.haml +34 -0
- data/app/views/eboshi/clients/edit.html.haml +4 -0
- data/app/views/eboshi/clients/index.html.haml +19 -0
- data/app/views/eboshi/clients/new.html.haml +4 -0
- data/app/views/eboshi/invoices/_form.html.slim +68 -0
- data/app/views/eboshi/invoices/_full.html.haml +76 -0
- data/app/views/eboshi/invoices/_invoice.html.haml +2 -0
- data/app/views/eboshi/invoices/_mini.html.haml +21 -0
- data/app/views/eboshi/invoices/edit.html.haml +14 -0
- data/app/views/eboshi/invoices/index.html.haml +46 -0
- data/app/views/eboshi/invoices/new.html.haml +11 -0
- data/app/views/eboshi/invoices/show.pdf.haml +118 -0
- data/app/views/eboshi/layouts/application.html.haml +120 -0
- data/app/views/eboshi/payments/_form.html.haml +10 -0
- data/app/views/eboshi/payments/new.html.haml +9 -0
- data/app/views/eboshi/user_sessions/new.html.haml +19 -0
- data/app/views/eboshi/users/_form.html.haml +65 -0
- data/app/views/eboshi/users/edit.html.haml +16 -0
- data/app/views/eboshi/users/index.html.haml +11 -0
- data/app/views/eboshi/users/new.html.haml +13 -0
- data/app/views/eboshi/users/show.html.haml +39 -0
- data/app/views/eboshi/works/_form.html.slim +25 -0
- data/app/views/eboshi/works/_work.html.slim +27 -0
- data/app/views/eboshi/works/edit.html.haml +9 -0
- data/app/views/eboshi/works/new.html.haml +8 -0
- data/app/views/layouts/eboshi/application.html.haml +120 -0
- data/config/routes.rb +35 -0
- data/lib/eboshi/engine.rb +15 -0
- data/lib/eboshi/version.rb +3 -0
- data/lib/eboshi.rb +6 -0
- data/lib/tasks/eboshi_tasks.rake +4 -0
- metadata +253 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
|
5
|
+
%title
|
6
|
+
Eboshi »
|
7
|
+
= yield :title
|
8
|
+
= csrf_meta_tags
|
9
|
+
|
10
|
+
= stylesheet_link_tag "application"
|
11
|
+
= yield :css
|
12
|
+
|
13
|
+
- if current_user
|
14
|
+
%style
|
15
|
+
:plain
|
16
|
+
a:hover, input.button:hover {color: ##{current_user.color};}
|
17
|
+
.button:hover, input.button:hover {border-color:##{current_user.color};}
|
18
|
+
.line_item_selected {background-color:##{current_user.color};}
|
19
|
+
|
20
|
+
= javascript_importmap_tags
|
21
|
+
|
22
|
+
%link{rel: "shortcut icon", href: image_path("/favicon.png"), type: "image/x-icon"}
|
23
|
+
|
24
|
+
%body
|
25
|
+
#flash_notice= flash.notice
|
26
|
+
#flash_error= flash.alert
|
27
|
+
|
28
|
+
#wrapper
|
29
|
+
#header_container
|
30
|
+
#header
|
31
|
+
#login
|
32
|
+
#account.right
|
33
|
+
- if current_user
|
34
|
+
= link_to 'Logout', logout_path, method: :delete, class: "button right"
|
35
|
+
- if current_user.admin?
|
36
|
+
= link_to 'All Users', users_path, class: "button right"
|
37
|
+
= link_to 'My Account', edit_user_path(current_user), class: "button right"
|
38
|
+
.user_name.right.sm_pad{style: "color: ##{current_user.color}"}
|
39
|
+
%span Welcome, #{current_user.name}!
|
40
|
+
.clear
|
41
|
+
.clear
|
42
|
+
#title
|
43
|
+
%h1
|
44
|
+
%a(href="/") EBO$HI
|
45
|
+
%p a simple rails invoicing application
|
46
|
+
.clear
|
47
|
+
.clear
|
48
|
+
|
49
|
+
#breadcrumbs_container
|
50
|
+
#breadcrumbs
|
51
|
+
%h2= yield :title
|
52
|
+
= yield :header
|
53
|
+
|
54
|
+
#actions= yield :actions
|
55
|
+
|
56
|
+
#all_content
|
57
|
+
#sidebar
|
58
|
+
- if current_user
|
59
|
+
%h2#summaries_control Activity Summary
|
60
|
+
%table#summaries(width="100%" border="0" cellspacing="0" cellpadding="0")
|
61
|
+
%col(width="60%")
|
62
|
+
%col(width="20%")
|
63
|
+
%col(width="20%")
|
64
|
+
%tr
|
65
|
+
%td Year
|
66
|
+
%td= pluralize number_with_precision(current_user.hours_by_year(Date.today), precision: 0), 'hour'
|
67
|
+
%td= currency_or_empty current_user.total_by_year(Date.today)
|
68
|
+
%tr
|
69
|
+
%td Month
|
70
|
+
%td= pluralize number_with_precision(current_user.hours_by_month(Date.today), precision: 0), 'hour'
|
71
|
+
%td= currency_or_empty current_user.total_by_month(Date.today)
|
72
|
+
%tr
|
73
|
+
%td Week
|
74
|
+
%td= pluralize number_with_precision(current_user.hours_by_week(Date.today), precision: 0), 'hour'
|
75
|
+
%td= currency_or_empty current_user.total_by_week(Date.today)
|
76
|
+
%tr
|
77
|
+
%td Day
|
78
|
+
%td= pluralize number_with_precision(current_user.hours_by_date(Date.today), precision: 0), 'hour'
|
79
|
+
%td= currency_or_empty current_user.total_by_date(Date.today)
|
80
|
+
|
81
|
+
%p= link_to "details", "/calendar"
|
82
|
+
%br
|
83
|
+
|
84
|
+
- if @client and !@client.new_record?
|
85
|
+
%h2 Collaborators
|
86
|
+
%ul#collaborators
|
87
|
+
- @client.assignments.each do |assignment|
|
88
|
+
- next if assignment.new_record?
|
89
|
+
%li
|
90
|
+
%span= assignment.user.name
|
91
|
+
= link_to "delete", assignment, :method => :delete
|
92
|
+
= link_to '+ Invite collaborator', new_assignment_path(@client), :class=>"button right"
|
93
|
+
.clear
|
94
|
+
|
95
|
+
- if current_user
|
96
|
+
%h2= link_to "Clients", clients_path
|
97
|
+
%table#clients_summary(width="100%" border="0" cellspacing="0" cellpadding="0")
|
98
|
+
%col(width="60%")
|
99
|
+
%col(width="20%")
|
100
|
+
%col(width="20%")
|
101
|
+
- current_user.clients.each do |client|
|
102
|
+
= cache client do
|
103
|
+
%tr
|
104
|
+
%td= link_to client.name, [client, :invoices], class: "inline"
|
105
|
+
%td= currency_or_empty client.unbilled_balance
|
106
|
+
%td.red= currency_or_empty client.overdue_balance
|
107
|
+
|
108
|
+
= link_to '+ Add Client', new_client_path, :class=>"button right"
|
109
|
+
.clear
|
110
|
+
|
111
|
+
|
112
|
+
#content
|
113
|
+
= yield
|
114
|
+
.clear
|
115
|
+
.clear
|
116
|
+
|
117
|
+
#footer_container
|
118
|
+
#footer
|
119
|
+
= yield :footer
|
120
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
Login
|
3
|
+
|
4
|
+
%h2 Login
|
5
|
+
|
6
|
+
= form_for @user_session, :url => user_session_path do |f|
|
7
|
+
= f.error_messages
|
8
|
+
%p
|
9
|
+
= f.label :email
|
10
|
+
= f.text_field :email
|
11
|
+
%p
|
12
|
+
= f.label :password
|
13
|
+
= f.password_field :password
|
14
|
+
%p
|
15
|
+
= f.label :remember_me
|
16
|
+
= f.check_box :remember_me
|
17
|
+
%hr
|
18
|
+
%p.center_align
|
19
|
+
= f.submit "Login", :class=>"button lg"
|
@@ -0,0 +1,65 @@
|
|
1
|
+
%p
|
2
|
+
= form.label :name
|
3
|
+
= form.text_field :name
|
4
|
+
|
5
|
+
%p
|
6
|
+
= form.label :email, "Email Address"
|
7
|
+
= form.text_field :email
|
8
|
+
|
9
|
+
%p
|
10
|
+
= form.label :password, form.object.new_record? ? nil : "Change password"
|
11
|
+
= form.password_field :password
|
12
|
+
|
13
|
+
%p
|
14
|
+
= form.label :password_confirmation
|
15
|
+
= form.password_field :password_confirmation
|
16
|
+
|
17
|
+
%p
|
18
|
+
= form.label :rate, "Default Rate"
|
19
|
+
== $#{form.text_field :rate}
|
20
|
+
|
21
|
+
%p
|
22
|
+
= form.label :color
|
23
|
+
= form.text_field :color
|
24
|
+
|
25
|
+
%h1 invoice details
|
26
|
+
|
27
|
+
%p
|
28
|
+
= form.label :business_name
|
29
|
+
= form.text_field :business_name
|
30
|
+
|
31
|
+
%p
|
32
|
+
= form.label :business_email
|
33
|
+
= form.text_field :business_email
|
34
|
+
|
35
|
+
%p
|
36
|
+
= form.label :address
|
37
|
+
= form.text_field :address
|
38
|
+
|
39
|
+
%p
|
40
|
+
= form.label :address2, ""
|
41
|
+
= form.text_field :address2
|
42
|
+
|
43
|
+
%p
|
44
|
+
= form.label :city
|
45
|
+
= form.text_field :city
|
46
|
+
|
47
|
+
%p
|
48
|
+
= form.label :state
|
49
|
+
= form.text_field :state
|
50
|
+
|
51
|
+
%p
|
52
|
+
= form.label :zip, "Zipcode"
|
53
|
+
= form.text_field :zip
|
54
|
+
|
55
|
+
%p
|
56
|
+
= form.label :logo
|
57
|
+
= image_tag @user.logo.url(:pdf) if @user.logo.exists?
|
58
|
+
= form.file_field :logo
|
59
|
+
|
60
|
+
%p
|
61
|
+
= form.label :signature
|
62
|
+
= image_tag @user.signature.url(:pdf) if @user.signature.exists?
|
63
|
+
= form.file_field :signature
|
64
|
+
|
65
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
Users » edit
|
3
|
+
= @user.name
|
4
|
+
|
5
|
+
%h2
|
6
|
+
.user_name{:style => "color: \##{current_user.color}"}
|
7
|
+
%span Users » edit
|
8
|
+
= @user.name
|
9
|
+
|
10
|
+
= form_for @user, :html => { :multipart => true } do |f|
|
11
|
+
= f.error_messages
|
12
|
+
= render :partial => "form", :object => f
|
13
|
+
= f.submit "Update", :class=>"right"
|
14
|
+
|
15
|
+
= link_to "cancel", current_user.admin? ? users_path : root_path, :class=>"button right"
|
16
|
+
.clear
|
@@ -0,0 +1,11 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
users » all
|
3
|
+
|
4
|
+
%h2 users » all
|
5
|
+
%ul
|
6
|
+
- @users.each do |user|
|
7
|
+
%li.user
|
8
|
+
= link_to h(user.name), edit_user_path(user), :style => "color: \##{user.color}"
|
9
|
+
%span= number_to_per_hour user.rate
|
10
|
+
|
11
|
+
.add= link_to '+add user', new_user_path, :class=>"button right clear"
|
@@ -0,0 +1,13 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
Users » new
|
3
|
+
|
4
|
+
%h2
|
5
|
+
Users » new
|
6
|
+
|
7
|
+
= form_for @user, :html => { :multipart => true } do |f|
|
8
|
+
= f.error_messages
|
9
|
+
= render :partial => "form", :object => f
|
10
|
+
= f.submit "Register"
|
11
|
+
|
12
|
+
%br
|
13
|
+
= link_to "cancel", users_path
|
@@ -0,0 +1,39 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
Users »
|
3
|
+
= @user.name
|
4
|
+
|
5
|
+
%h2
|
6
|
+
.user_name{:style => "color: \##{current_user.color}"}
|
7
|
+
%span Users »
|
8
|
+
= @user.name
|
9
|
+
|
10
|
+
%p
|
11
|
+
%b Email:
|
12
|
+
= @user.email
|
13
|
+
|
14
|
+
|
15
|
+
%p
|
16
|
+
%b Login count:
|
17
|
+
=h @user.login_count
|
18
|
+
|
19
|
+
%p
|
20
|
+
%b Last request at:
|
21
|
+
=h @user.last_request_at
|
22
|
+
|
23
|
+
%p
|
24
|
+
%b Last login at:
|
25
|
+
=h @user.last_login_at
|
26
|
+
|
27
|
+
%p
|
28
|
+
%b Current login at:
|
29
|
+
=h @user.current_login_at
|
30
|
+
|
31
|
+
%p
|
32
|
+
%b Last login ip:
|
33
|
+
=h @user.last_login_ip
|
34
|
+
|
35
|
+
%p
|
36
|
+
%b Current login ip:
|
37
|
+
=h @user.current_login_ip
|
38
|
+
|
39
|
+
= link_to 'Edit', edit_user_path, :class=>"button"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
= error_messages_for :work
|
2
|
+
|
3
|
+
= form_for [@client, @work] do |form|
|
4
|
+
= form.hidden_field :type
|
5
|
+
|
6
|
+
p
|
7
|
+
= form.label :start
|
8
|
+
|
|
9
|
+
= form.datetime_field :start
|
10
|
+
p
|
11
|
+
= form.label :finish, "End"
|
12
|
+
|
|
13
|
+
= form.datetime_field :finish
|
14
|
+
p
|
15
|
+
= form.label :rate
|
16
|
+
|
|
17
|
+
| $
|
18
|
+
= form.text_field :rate
|
19
|
+
p
|
20
|
+
= form.label :notes
|
21
|
+
|
|
22
|
+
= form.text_area :notes
|
23
|
+
|
24
|
+
p = form.submit form.object.new_record? ? "Create" : "Update"
|
25
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
tr.line_item.work id="line_item_#{work.id}_tr" class=cycle('even','') data-controller="line-item"
|
2
|
+
td = check_box_tag 'line_item_ids[]', work.id, nil, id: "line_item_ids_#{work.id}", data: { line_item_target: "checkbox" }
|
3
|
+
td.name.user_name style="color: ##{work.user&.color}" = work.user&.name
|
4
|
+
td.time colspan=(work.incomplete? ? 4 : 1)
|
5
|
+
= work.start.to_fs(:slash)
|
6
|
+
br
|
7
|
+
= work.start.to_fs(:time)
|
8
|
+
br
|
9
|
+
- if work.incomplete?
|
10
|
+
= link_to 'Clock Out', clock_out_path(@client, work), class: "clock_out",
|
11
|
+
data: { turbo_frame: dom_id(work.invoice || Eboshi::Invoice.new), turbo: true }
|
12
|
+
- else
|
13
|
+
= work.finish.to_fs(:time)
|
14
|
+
- unless work.incomplete?
|
15
|
+
td.hours = number_with_precision work.hours, precision: 2
|
16
|
+
td.rate = number_to_per_hour work.rate
|
17
|
+
td.total = number_to_currency work.total
|
18
|
+
td.notes
|
19
|
+
textarea.dummy id="notes_#{work.id}" autocomplete="off" data-controller="live-textarea" data-live-textarea-url-value=line_item_path(work)
|
20
|
+
= work.notes
|
21
|
+
|
22
|
+
td
|
23
|
+
= link_to image_tag("edit.png", size: "12x13"), edit_work_path(work), title: "Edit"
|
24
|
+
= link_to image_tag("delete.png", size: "11x10"), work, class: "delete",
|
25
|
+
data: { confirm: "Are you sure you want to delete this line item? This cannot be undone!",
|
26
|
+
turbo_frame: dom_id(work.invoice || Eboshi::Invoice.new), turbo_method: "delete", turbo: true }
|
27
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
|
5
|
+
%title
|
6
|
+
Eboshi »
|
7
|
+
= yield :title
|
8
|
+
= csrf_meta_tags
|
9
|
+
|
10
|
+
= stylesheet_link_tag "application"
|
11
|
+
= yield :css
|
12
|
+
|
13
|
+
- if current_user
|
14
|
+
%style
|
15
|
+
:plain
|
16
|
+
a:hover, input.button:hover {color: ##{current_user.color};}
|
17
|
+
.button:hover, input.button:hover {border-color:##{current_user.color};}
|
18
|
+
.line_item_selected {background-color:##{current_user.color};}
|
19
|
+
|
20
|
+
= javascript_importmap_tags
|
21
|
+
|
22
|
+
%link{rel: "shortcut icon", href: image_path("/favicon.png"), type: "image/x-icon"}
|
23
|
+
|
24
|
+
%body
|
25
|
+
#flash_notice= flash.notice
|
26
|
+
#flash_error= flash.alert
|
27
|
+
|
28
|
+
#wrapper
|
29
|
+
#header_container
|
30
|
+
#header
|
31
|
+
#login
|
32
|
+
#account.right
|
33
|
+
- if current_user
|
34
|
+
= link_to 'Logout', logout_path, method: :delete, class: "button right"
|
35
|
+
- if current_user.admin?
|
36
|
+
= link_to 'All Users', users_path, class: "button right"
|
37
|
+
= link_to 'My Account', edit_user_path(current_user), class: "button right"
|
38
|
+
.user_name.right.sm_pad{style: "color: ##{current_user.color}"}
|
39
|
+
%span Welcome, #{current_user.name}!
|
40
|
+
.clear
|
41
|
+
.clear
|
42
|
+
#title
|
43
|
+
%h1
|
44
|
+
%a(href="/") EBO$HI
|
45
|
+
%p a simple rails invoicing application
|
46
|
+
.clear
|
47
|
+
.clear
|
48
|
+
|
49
|
+
#breadcrumbs_container
|
50
|
+
#breadcrumbs
|
51
|
+
%h2= yield :title
|
52
|
+
= yield :header
|
53
|
+
|
54
|
+
#actions= yield :actions
|
55
|
+
|
56
|
+
#all_content
|
57
|
+
#sidebar
|
58
|
+
- if current_user
|
59
|
+
%h2#summaries_control Activity Summary
|
60
|
+
%table#summaries(width="100%" border="0" cellspacing="0" cellpadding="0")
|
61
|
+
%col(width="60%")
|
62
|
+
%col(width="20%")
|
63
|
+
%col(width="20%")
|
64
|
+
%tr
|
65
|
+
%td Year
|
66
|
+
%td= pluralize number_with_precision(current_user.hours_by_year(Date.today), precision: 0), 'hour'
|
67
|
+
%td= currency_or_empty current_user.total_by_year(Date.today)
|
68
|
+
%tr
|
69
|
+
%td Month
|
70
|
+
%td= pluralize number_with_precision(current_user.hours_by_month(Date.today), precision: 0), 'hour'
|
71
|
+
%td= currency_or_empty current_user.total_by_month(Date.today)
|
72
|
+
%tr
|
73
|
+
%td Week
|
74
|
+
%td= pluralize number_with_precision(current_user.hours_by_week(Date.today), precision: 0), 'hour'
|
75
|
+
%td= currency_or_empty current_user.total_by_week(Date.today)
|
76
|
+
%tr
|
77
|
+
%td Day
|
78
|
+
%td= pluralize number_with_precision(current_user.hours_by_date(Date.today), precision: 0), 'hour'
|
79
|
+
%td= currency_or_empty current_user.total_by_date(Date.today)
|
80
|
+
|
81
|
+
%p= link_to "details", "/calendar"
|
82
|
+
%br
|
83
|
+
|
84
|
+
- if @client and !@client.new_record?
|
85
|
+
%h2 Collaborators
|
86
|
+
%ul#collaborators
|
87
|
+
- @client.assignments.each do |assignment|
|
88
|
+
- next if assignment.new_record?
|
89
|
+
%li
|
90
|
+
%span= assignment.user.name
|
91
|
+
= link_to "delete", assignment, :method => :delete
|
92
|
+
= link_to '+ Invite collaborator', new_assignment_path(@client), :class=>"button right"
|
93
|
+
.clear
|
94
|
+
|
95
|
+
- if current_user
|
96
|
+
%h2= link_to "Clients", clients_path
|
97
|
+
%table#clients_summary(width="100%" border="0" cellspacing="0" cellpadding="0")
|
98
|
+
%col(width="60%")
|
99
|
+
%col(width="20%")
|
100
|
+
%col(width="20%")
|
101
|
+
- current_user.clients.each do |client|
|
102
|
+
= cache client do
|
103
|
+
%tr
|
104
|
+
%td= link_to client.name, [client, :invoices], class: "inline"
|
105
|
+
%td= currency_or_empty client.unbilled_balance
|
106
|
+
%td.red= currency_or_empty client.overdue_balance
|
107
|
+
|
108
|
+
= link_to '+ Add Client', new_client_path, :class=>"button right"
|
109
|
+
.clear
|
110
|
+
|
111
|
+
|
112
|
+
#content
|
113
|
+
= yield
|
114
|
+
.clear
|
115
|
+
.clear
|
116
|
+
|
117
|
+
#footer_container
|
118
|
+
#footer
|
119
|
+
= yield :footer
|
120
|
+
|
data/config/routes.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
Eboshi::Engine.routes.draw do
|
2
|
+
root to: "clients#index"
|
3
|
+
|
4
|
+
resources :clients do
|
5
|
+
resources :invoices do
|
6
|
+
resources :payments
|
7
|
+
end
|
8
|
+
resources :budgets
|
9
|
+
|
10
|
+
resources :line_items, only: [:update]
|
11
|
+
resources :works, except: [:index, :show] do
|
12
|
+
post :merge, on: :collection
|
13
|
+
post :convert, on: :member
|
14
|
+
end
|
15
|
+
resources :adjustments, except: [:index, :show]
|
16
|
+
resources :assignments, only: [:new, :create, :destroy]
|
17
|
+
end
|
18
|
+
|
19
|
+
resources :payments
|
20
|
+
resources :adjustments, except: [:index, :show]
|
21
|
+
resources :assignments, only: [:new, :create, :destroy]
|
22
|
+
resources :works, except: [:index, :show]
|
23
|
+
|
24
|
+
match "/clients/:client_id/clock_in(.:format)" => "works#clock_in", :as => "clock_in", :via => [:get, :post]
|
25
|
+
match "/clients/:client_id/works/:id/clock_out(.:format)" => "works#clock_out", :as => "clock_out", :via => [:get, :post]
|
26
|
+
|
27
|
+
get "/calendar(/:year(/:month))" => "calendar#index", :as => "calendar"
|
28
|
+
|
29
|
+
resources :users
|
30
|
+
resource :account, controller: "users"
|
31
|
+
resource :user_session
|
32
|
+
|
33
|
+
get "login" => "user_sessions#new"
|
34
|
+
delete "logout" => "user_sessions#destroy"
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "authlogic"
|
2
|
+
require "scrypt"
|
3
|
+
require "validates_email_format_of"
|
4
|
+
require "kt-paperclip"
|
5
|
+
require "haml-rails"
|
6
|
+
require "dynamic_form"
|
7
|
+
require "default_value_for"
|
8
|
+
require "wicked_pdf"
|
9
|
+
# require "wkhtmltopdf-binary"
|
10
|
+
|
11
|
+
module Eboshi
|
12
|
+
class Engine < ::Rails::Engine
|
13
|
+
isolate_namespace Eboshi
|
14
|
+
end
|
15
|
+
end
|
data/lib/eboshi.rb
ADDED