invoice_bar 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (436) hide show
  1. data/LICENSE +15 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +39 -0
  4. data/app/assets/javascripts/invoice_bar/invoice_bar.js +98 -0
  5. data/app/assets/stylesheets/invoice_bar/document.css.scss +170 -0
  6. data/app/assets/stylesheets/invoice_bar/forms.css.scss +60 -0
  7. data/app/assets/stylesheets/invoice_bar/invoice_bar.css +10 -0
  8. data/app/assets/stylesheets/invoice_bar/tables.css.scss +14 -0
  9. data/app/controllers/invoice_bar/accounts_controller.rb +26 -0
  10. data/app/controllers/invoice_bar/application_controller.rb +59 -0
  11. data/app/controllers/invoice_bar/contacts_controller.rb +40 -0
  12. data/app/controllers/invoice_bar/currencies_controller.rb +29 -0
  13. data/app/controllers/invoice_bar/dashboard_controller.rb +11 -0
  14. data/app/controllers/invoice_bar/invoice_templates_controller.rb +108 -0
  15. data/app/controllers/invoice_bar/invoices_controller.rb +246 -0
  16. data/app/controllers/invoice_bar/receipt_templates_controller.rb +108 -0
  17. data/app/controllers/invoice_bar/receipts_controller.rb +164 -0
  18. data/app/controllers/invoice_bar/search_controller.rb +26 -0
  19. data/app/controllers/invoice_bar/sessions_controller.rb +35 -0
  20. data/app/controllers/invoice_bar/settings_controller.rb +12 -0
  21. data/app/controllers/invoice_bar/users_controller.rb +83 -0
  22. data/app/helpers/invoice_bar/invoice_bar_helper.rb +43 -0
  23. data/app/models/invoice_bar/account.rb +50 -0
  24. data/app/models/invoice_bar/address.rb +48 -0
  25. data/app/models/invoice_bar/contact.rb +32 -0
  26. data/app/models/invoice_bar/currency.rb +13 -0
  27. data/app/models/invoice_bar/invoice.rb +51 -0
  28. data/app/models/invoice_bar/invoice_template.rb +35 -0
  29. data/app/models/invoice_bar/item.rb +77 -0
  30. data/app/models/invoice_bar/receipt.rb +66 -0
  31. data/app/models/invoice_bar/receipt_template.rb +35 -0
  32. data/app/models/invoice_bar/user.rb +42 -0
  33. data/app/views/invoice_bar/accounts/_form.html.erb +25 -0
  34. data/app/views/invoice_bar/accounts/edit.html.erb +3 -0
  35. data/app/views/invoice_bar/accounts/index.html.erb +44 -0
  36. data/app/views/invoice_bar/accounts/new.html.erb +3 -0
  37. data/app/views/invoice_bar/accounts/show.html.erb +24 -0
  38. data/app/views/invoice_bar/contacts/_form.html.erb +44 -0
  39. data/app/views/invoice_bar/contacts/edit.html.erb +3 -0
  40. data/app/views/invoice_bar/contacts/index.html.erb +42 -0
  41. data/app/views/invoice_bar/contacts/new.html.erb +3 -0
  42. data/app/views/invoice_bar/contacts/show.html.erb +43 -0
  43. data/app/views/invoice_bar/currencies/_form.html.erb +16 -0
  44. data/app/views/invoice_bar/currencies/edit.html.erb +3 -0
  45. data/app/views/invoice_bar/currencies/index.html.erb +40 -0
  46. data/app/views/invoice_bar/currencies/new.html.erb +3 -0
  47. data/app/views/invoice_bar/currencies/show.html.erb +12 -0
  48. data/app/views/invoice_bar/documents/_show.html.erb +110 -0
  49. data/app/views/invoice_bar/forms/_address.html.erb +22 -0
  50. data/app/views/invoice_bar/forms/_address_fields.html.erb +22 -0
  51. data/app/views/invoice_bar/forms/_contact_main_fields.html.erb +23 -0
  52. data/app/views/invoice_bar/forms/_document.html.erb +131 -0
  53. data/app/views/invoice_bar/forms/_errors.html.erb +17 -0
  54. data/app/views/invoice_bar/forms/_filter.html.erb +33 -0
  55. data/app/views/invoice_bar/forms/_item_fields.html.erb +34 -0
  56. data/app/views/invoice_bar/forms/_items.html.erb +40 -0
  57. data/app/views/invoice_bar/forms/_payment_fields.html.erb +22 -0
  58. data/app/views/invoice_bar/invoice_templates/choose_template.html.erb +7 -0
  59. data/app/views/invoice_bar/invoice_templates/edit.html.erb +2 -0
  60. data/app/views/invoice_bar/invoice_templates/index.html.erb +51 -0
  61. data/app/views/invoice_bar/invoice_templates/new.html.erb +3 -0
  62. data/app/views/invoice_bar/invoice_templates/show.html.erb +1 -0
  63. data/app/views/invoice_bar/invoices/edit.html.erb +1 -0
  64. data/app/views/invoice_bar/invoices/index.html.erb +127 -0
  65. data/app/views/invoice_bar/invoices/new.html.erb +4 -0
  66. data/app/views/invoice_bar/invoices/show.html.erb +1 -0
  67. data/app/views/invoice_bar/invoices/show.pdf.prawn +128 -0
  68. data/app/views/invoice_bar/layouts/_head.html.erb +5 -0
  69. data/app/views/invoice_bar/layouts/_messages.html.erb +8 -0
  70. data/app/views/invoice_bar/layouts/_navbar.html.erb +40 -0
  71. data/app/views/invoice_bar/layouts/signed_in.html.erb +20 -0
  72. data/app/views/invoice_bar/layouts/signed_out.html.erb +29 -0
  73. data/app/views/invoice_bar/receipt_templates/choose_template.html.erb +7 -0
  74. data/app/views/invoice_bar/receipt_templates/edit.html.erb +1 -0
  75. data/app/views/invoice_bar/receipt_templates/index.html.erb +51 -0
  76. data/app/views/invoice_bar/receipt_templates/new.html.erb +3 -0
  77. data/app/views/invoice_bar/receipt_templates/show.html.erb +1 -0
  78. data/app/views/invoice_bar/receipts/edit.html.erb +1 -0
  79. data/app/views/invoice_bar/receipts/index.html.erb +82 -0
  80. data/app/views/invoice_bar/receipts/new.html.erb +4 -0
  81. data/app/views/invoice_bar/receipts/show.html.erb +1 -0
  82. data/app/views/invoice_bar/receipts/show.pdf.prawn +128 -0
  83. data/app/views/invoice_bar/search/index.html.erb +201 -0
  84. data/app/views/invoice_bar/sessions/new.html.erb +23 -0
  85. data/app/views/invoice_bar/settings/index.html.erb +42 -0
  86. data/app/views/invoice_bar/users/_form.html.erb +32 -0
  87. data/app/views/invoice_bar/users/edit.html.erb +1 -0
  88. data/app/views/invoice_bar/users/index.html.erb +46 -0
  89. data/app/views/invoice_bar/users/new.html.erb +1 -0
  90. data/app/views/invoice_bar/users/show.html.erb +0 -0
  91. data/app/views/invoice_bar/users/signup.html.erb +25 -0
  92. data/app/views/kaminari/_first_page.html.erb +3 -0
  93. data/app/views/kaminari/_gap.html.erb +3 -0
  94. data/app/views/kaminari/_last_page.html.erb +3 -0
  95. data/app/views/kaminari/_next_page.html.erb +3 -0
  96. data/app/views/kaminari/_page.html.erb +3 -0
  97. data/app/views/kaminari/_paginator.html.erb +17 -0
  98. data/app/views/kaminari/_prev_page.html.erb +3 -0
  99. data/config/database.yml +25 -0
  100. data/config/initializers/backtrace_silencers.rb +7 -0
  101. data/config/initializers/encoding.rb +3 -0
  102. data/config/initializers/inflections.rb +15 -0
  103. data/config/initializers/kaminari_config.rb +10 -0
  104. data/config/initializers/mime_types.rb +5 -0
  105. data/config/initializers/requires.rb +4 -0
  106. data/config/initializers/secret_token.rb +7 -0
  107. data/config/initializers/session_store.rb +8 -0
  108. data/config/initializers/sorcery.rb +401 -0
  109. data/config/initializers/wrap_parameters.rb +14 -0
  110. data/config/locales/cs.yml +424 -0
  111. data/config/routes.rb +50 -0
  112. data/db/migrate/20121012142346_create_invoice_bar_addresses.rb +16 -0
  113. data/db/migrate/20121012142357_create_invoice_bar_invoice_templates.rb +20 -0
  114. data/db/migrate/20121012142418_create_invoice_bar_invoices.rb +27 -0
  115. data/db/migrate/20121012142428_create_invoice_bar_accounts.rb +17 -0
  116. data/db/migrate/20121012142442_create_invoice_bar_items.rb +17 -0
  117. data/db/migrate/20121012142454_create_invoice_bar_currencies.rb +9 -0
  118. data/db/migrate/20121012142502_create_invoice_bar_contacts.rb +19 -0
  119. data/db/migrate/20121012144941_create_invoice_bar_users.rb +24 -0
  120. data/db/migrate/20121205185321_create_invoice_bar_receipts.rb +21 -0
  121. data/db/migrate/20121205185353_create_invoice_bar_receipt_templates.rb +18 -0
  122. data/db/seeds.rb +33 -0
  123. data/db/test.sqlite3 +0 -0
  124. data/lib/billable.rb +305 -0
  125. data/lib/invoice_bar/engine.rb +80 -0
  126. data/lib/invoice_bar/version.rb +5 -0
  127. data/lib/invoice_bar.rb +7 -0
  128. data/lib/searchable.rb +34 -0
  129. data/lib/tasks/invoicebar_tasks.rake +4 -0
  130. data/test/dummy/README.rdoc +261 -0
  131. data/test/dummy/Rakefile +7 -0
  132. data/test/dummy/app/assets/javascripts/application.js +15 -0
  133. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  134. data/test/dummy/app/controllers/application_controller.rb +3 -0
  135. data/test/dummy/app/helpers/application_helper.rb +2 -0
  136. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  137. data/test/dummy/config/application.rb +68 -0
  138. data/test/dummy/config/boot.rb +10 -0
  139. data/test/dummy/config/database.yml +25 -0
  140. data/test/dummy/config/environment.rb +5 -0
  141. data/test/dummy/config/environments/development.rb +37 -0
  142. data/test/dummy/config/environments/production.rb +67 -0
  143. data/test/dummy/config/environments/test.rb +37 -0
  144. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  145. data/test/dummy/config/initializers/inflections.rb +15 -0
  146. data/test/dummy/config/initializers/invoice_bar.rb +10 -0
  147. data/test/dummy/config/initializers/mime_types.rb +5 -0
  148. data/test/dummy/config/initializers/secret_token.rb +7 -0
  149. data/test/dummy/config/initializers/session_store.rb +8 -0
  150. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  151. data/test/dummy/config/routes.rb +3 -0
  152. data/test/dummy/config.ru +4 -0
  153. data/test/dummy/db/development.sqlite3 +0 -0
  154. data/test/dummy/db/production.sqlite3 +0 -0
  155. data/test/dummy/db/schema.rb +174 -0
  156. data/test/dummy/db/test.sqlite3 +0 -0
  157. data/test/dummy/log/development.log +549752 -0
  158. data/test/dummy/log/production.log +12 -0
  159. data/test/dummy/log/test.log +8610 -0
  160. data/test/dummy/public/404.html +26 -0
  161. data/test/dummy/public/422.html +26 -0
  162. data/test/dummy/public/500.html +25 -0
  163. data/test/dummy/public/favicon.ico +0 -0
  164. data/test/dummy/script/rails +6 -0
  165. data/test/dummy/tmp/cache/assets/BF2/9B0/sprockets%2F1649cd914028570da99e391611416461 +0 -0
  166. data/test/dummy/tmp/cache/assets/C11/6D0/sprockets%2F33531011fa6963571866f11d2c35313d +0 -0
  167. data/test/dummy/tmp/cache/assets/C13/000/sprockets%2F5357734603b21a0c32f75614f7067c31 +0 -0
  168. data/test/dummy/tmp/cache/assets/C34/BA0/sprockets%2F476d3ab21730a46162605402631fe23a +0 -0
  169. data/test/dummy/tmp/cache/assets/C4B/E90/sprockets%2F035a31410d4460e61989eeb25886c270 +0 -0
  170. data/test/dummy/tmp/cache/assets/C4E/B20/sprockets%2F7318bf12f2451e817f480b607c746332 +0 -0
  171. data/test/dummy/tmp/cache/assets/C57/D20/sprockets%2Ff88514480770419cd12db0649278b84a +0 -0
  172. data/test/dummy/tmp/cache/assets/C58/6A0/sprockets%2F353374217619061b5ce3969c7cd819b3 +0 -0
  173. data/test/dummy/tmp/cache/assets/C65/E00/sprockets%2F672e89378f0995592ad01994536ba60b +0 -0
  174. data/test/dummy/tmp/cache/assets/C6B/6E0/sprockets%2F3028ed1b448217ad51235f70e14814c0 +0 -0
  175. data/test/dummy/tmp/cache/assets/C6B/720/sprockets%2F371c30ee6af2d2121712842394d550b3 +0 -0
  176. data/test/dummy/tmp/cache/assets/C74/FF0/sprockets%2F2935380ab04cd59423316d55eb65b432 +0 -0
  177. data/test/dummy/tmp/cache/assets/C7E/450/sprockets%2F9cfb945244675bb31d32d80c18317822 +0 -0
  178. data/test/dummy/tmp/cache/assets/C89/6B0/sprockets%2F32372ed7818205654f9b4c6c0f398e41 +0 -0
  179. data/test/dummy/tmp/cache/assets/C8B/580/sprockets%2F643c9f08f9f01f35717241752c6d656b +0 -0
  180. data/test/dummy/tmp/cache/assets/C8D/D10/sprockets%2F637cba17049670418f4286ee7a3e8295 +0 -0
  181. data/test/dummy/tmp/cache/assets/C8E/6E0/sprockets%2Fc66d4743799007238128516ff08dfb6c +0 -0
  182. data/test/dummy/tmp/cache/assets/C93/450/sprockets%2Fe7ba340a2482428011300d2ee814f2b6 +0 -0
  183. data/test/dummy/tmp/cache/assets/C9A/F10/sprockets%2F70b1f5795498d49c48f11a58e094773f +0 -0
  184. data/test/dummy/tmp/cache/assets/CA2/E20/sprockets%2F8f0f457319183311b10ddc6e0337de41 +0 -0
  185. data/test/dummy/tmp/cache/assets/CA3/830/sprockets%2F9a9d172e93422b2192f1a5b80520a7c4 +0 -0
  186. data/test/dummy/tmp/cache/assets/CAD/870/sprockets%2Fa360887b06bad5328d1870349fae6126 +0 -0
  187. data/test/dummy/tmp/cache/assets/CB2/DE0/sprockets%2F639a912fd05bb9acb75624b343618558 +0 -0
  188. data/test/dummy/tmp/cache/assets/CB3/630/sprockets%2F501a45647fb70ab06d9d9566b9f11682 +0 -0
  189. data/test/dummy/tmp/cache/assets/CB9/620/sprockets%2F48651b5837773c5c3f3024e5b713f8ed +0 -0
  190. data/test/dummy/tmp/cache/assets/CBB/730/sprockets%2F93687f971b297d0d1e0a4721e5487c2d +0 -0
  191. data/test/dummy/tmp/cache/assets/CC0/4E0/sprockets%2F0a4620c09e33f12c747fbd798975788b +0 -0
  192. data/test/dummy/tmp/cache/assets/CC2/320/sprockets%2F6f4db22314397e4f29367682f7ad4b69 +0 -0
  193. data/test/dummy/tmp/cache/assets/CC3/3D0/sprockets%2F089add15d2a400824da7221e2b81d034 +0 -0
  194. data/test/dummy/tmp/cache/assets/CC7/C30/sprockets%2Fadb5bf6286f95889bb40657a27195638 +0 -0
  195. data/test/dummy/tmp/cache/assets/CCE/490/sprockets%2F07411fdbe680b6812f75ad74ca421060 +0 -0
  196. data/test/dummy/tmp/cache/assets/CD5/440/sprockets%2F4a93eaa36745c41235d49703bc1e2a94 +0 -0
  197. data/test/dummy/tmp/cache/assets/CD5/6A0/sprockets%2Fd8483c8cc949e29761ed8d26f9981821 +0 -0
  198. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  199. data/test/dummy/tmp/cache/assets/CD8/830/sprockets%2Ffd04d8117670102499a9cc26e03beb91 +0 -0
  200. data/test/dummy/tmp/cache/assets/CDA/7E0/sprockets%2F08273270e5ad4e8c40f032ae65f359a6 +0 -0
  201. data/test/dummy/tmp/cache/assets/CDB/4A0/sprockets%2F9ffe20f0f1056553046b042d4e752d8e +0 -0
  202. data/test/dummy/tmp/cache/assets/CDB/DD0/sprockets%2F77011cabd37795e415d3b39c27ac8532 +0 -0
  203. data/test/dummy/tmp/cache/assets/CDC/3B0/sprockets%2F7b0af18e9e71d15c3bb63853295016d4 +0 -0
  204. data/test/dummy/tmp/cache/assets/CDE/800/sprockets%2F416bd8cb992bd8c80b742034c4286a81 +0 -0
  205. data/test/dummy/tmp/cache/assets/CDF/B00/sprockets%2F3854abaa9035337b6ae850f481b69d81 +0 -0
  206. data/test/dummy/tmp/cache/assets/CE1/B50/sprockets%2F60b3d77c8e86d79212403cddca614934 +0 -0
  207. data/test/dummy/tmp/cache/assets/CE2/120/sprockets%2F46ae2947ec023073bbe827de1d615579 +0 -0
  208. data/test/dummy/tmp/cache/assets/CE2/610/sprockets%2F77999ce208b427f3d1cd786a01d0170d +0 -0
  209. data/test/dummy/tmp/cache/assets/CE4/D30/sprockets%2F3c72e61f887354ae35f015f9d4a06d17 +0 -0
  210. data/test/dummy/tmp/cache/assets/CE6/2C0/sprockets%2Fc1346d6629ff13645b4e2ce9c61a2893 +0 -0
  211. data/test/dummy/tmp/cache/assets/CE6/A90/sprockets%2F0d30a948c673d664a672e936f5b4a8d1 +0 -0
  212. data/test/dummy/tmp/cache/assets/CE9/850/sprockets%2Fc0201847da9589eebe5b28c66872b417 +0 -0
  213. data/test/dummy/tmp/cache/assets/CEA/9E0/sprockets%2Fdfedfb73194983c312432973ade78720 +0 -0
  214. data/test/dummy/tmp/cache/assets/CEE/D20/sprockets%2Fd2d3fcca91c5f7f325e1839984082592 +0 -0
  215. data/test/dummy/tmp/cache/assets/CF2/C90/sprockets%2F94a5468a372fd075ca78973f780c1fc6 +0 -0
  216. data/test/dummy/tmp/cache/assets/CF5/D40/sprockets%2F061b2b8dc611337ead0ae1630d9d6412 +0 -0
  217. data/test/dummy/tmp/cache/assets/CF8/310/sprockets%2F50b6e57b9678d674917d9d7ace69d022 +0 -0
  218. data/test/dummy/tmp/cache/assets/CF8/D30/sprockets%2Ff19cb0e8a30eb388c418d11240d152d0 +0 -0
  219. data/test/dummy/tmp/cache/assets/CFE/410/sprockets%2Fd9f0b12757bcfd24db130773b412314f +0 -0
  220. data/test/dummy/tmp/cache/assets/D00/F20/sprockets%2F8b4c51c2d4c103d0d6a468ac625c1658 +0 -0
  221. data/test/dummy/tmp/cache/assets/D02/010/sprockets%2F4569921d8d0226a3e2d57ad01620ecbe +0 -0
  222. data/test/dummy/tmp/cache/assets/D02/340/sprockets%2F1036c0439cb6b47c2c2fc1712b8e657b +0 -0
  223. data/test/dummy/tmp/cache/assets/D02/C00/sprockets%2F8ccbad1c51529c475316bb90801fe315 +0 -0
  224. data/test/dummy/tmp/cache/assets/D03/9C0/sprockets%2Fc96d3e1ca1315cab038596f20d0792f1 +0 -0
  225. data/test/dummy/tmp/cache/assets/D03/B20/sprockets%2F08d6902adcd450723918aeab800b159e +0 -0
  226. data/test/dummy/tmp/cache/assets/D04/BC0/sprockets%2F27be5fd4190e64c12116475ecc09c2c2 +0 -0
  227. data/test/dummy/tmp/cache/assets/D05/6B0/sprockets%2F51d171ec47d28c1d5722d2b86a0d1f65 +0 -0
  228. data/test/dummy/tmp/cache/assets/D06/E80/sprockets%2Fe62e39d519ee0a8131fae43440c153e5 +0 -0
  229. data/test/dummy/tmp/cache/assets/D09/F80/sprockets%2F0b34327edf1e11f0da567616d772c7e4 +0 -0
  230. data/test/dummy/tmp/cache/assets/D0A/B60/sprockets%2F42131e5fd69f30b0d08266afda8913e5 +0 -0
  231. data/test/dummy/tmp/cache/assets/D0F/390/sprockets%2F5132b836fb094301ff28a6be7dd16d77 +0 -0
  232. data/test/dummy/tmp/cache/assets/D0F/A70/sprockets%2F92ec90512978b6c597112bcaf1da29c3 +0 -0
  233. data/test/dummy/tmp/cache/assets/D0F/B20/sprockets%2Fa0a35bd579e7223e80e1a749e7f2a734 +0 -0
  234. data/test/dummy/tmp/cache/assets/D12/4C0/sprockets%2F88cb06f8a7fb491631fa0093781cd05f +0 -0
  235. data/test/dummy/tmp/cache/assets/D19/3F0/sprockets%2F5de5ba4c867332253b5098d0d1f9ef68 +0 -0
  236. data/test/dummy/tmp/cache/assets/D1A/990/sprockets%2F08909075dd6adc239945db46e13e3fb9 +0 -0
  237. data/test/dummy/tmp/cache/assets/D1C/C80/sprockets%2F4fa92f7c8915da6aa468ed76560953b0 +0 -0
  238. data/test/dummy/tmp/cache/assets/D1D/3F0/sprockets%2F97be6327d4928ac25347c4cc773e66da +0 -0
  239. data/test/dummy/tmp/cache/assets/D1E/230/sprockets%2Ff4317e07329a7c47de1c83f63e8f6a84 +0 -0
  240. data/test/dummy/tmp/cache/assets/D21/190/sprockets%2Fe4c9d0a614ae75783a09fc7e952d7198 +0 -0
  241. data/test/dummy/tmp/cache/assets/D23/290/sprockets%2F1d514a434ff003bf9c55a23a408bc5a1 +0 -0
  242. data/test/dummy/tmp/cache/assets/D23/F40/sprockets%2Fd7a8df989fa0b8678a833877b220e0b7 +0 -0
  243. data/test/dummy/tmp/cache/assets/D24/1D0/sprockets%2F88354bcfd9280ced1df9853346b9c294 +0 -0
  244. data/test/dummy/tmp/cache/assets/D25/040/sprockets%2F3eb1238aefc0b348a7218c93ae001b06 +0 -0
  245. data/test/dummy/tmp/cache/assets/D2D/3E0/sprockets%2F98fc4b59de5e8d96ae5746480a2e9129 +0 -0
  246. data/test/dummy/tmp/cache/assets/D2E/310/sprockets%2F26abc5030ac50e298349385e5dbaa5d0 +0 -0
  247. data/test/dummy/tmp/cache/assets/D30/1A0/sprockets%2Fa1d4848a05a94bf03d1cb69451e0e32e +0 -0
  248. data/test/dummy/tmp/cache/assets/D31/0D0/sprockets%2F8e968fb5539c735f9e65a2c338990ebe +0 -0
  249. data/test/dummy/tmp/cache/assets/D32/3E0/sprockets%2F51d82b9d10a1f278193ae09b2e6cc14c +0 -0
  250. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  251. data/test/dummy/tmp/cache/assets/D33/120/sprockets%2F41ac728e4d2c9fc115030eb2fa94455d +0 -0
  252. data/test/dummy/tmp/cache/assets/D33/EE0/sprockets%2F285d50fab811d6aab44360b43b358ee8 +0 -0
  253. data/test/dummy/tmp/cache/assets/D36/4F0/sprockets%2F6a5e6e2e8a23e1c5e7359e4018ba1a16 +0 -0
  254. data/test/dummy/tmp/cache/assets/D37/6B0/sprockets%2Ffb4b7383d900b9103ee4eeb16a49156a +0 -0
  255. data/test/dummy/tmp/cache/assets/D38/4B0/sprockets%2F4628f5361aa685f70bdbc0efb715c702 +0 -0
  256. data/test/dummy/tmp/cache/assets/D39/180/sprockets%2Fb6a2dcb4f4b6904a6e5f5a5b38572324 +0 -0
  257. data/test/dummy/tmp/cache/assets/D39/E50/sprockets%2F1e19909eba7771baae63c28571d213dc +0 -0
  258. data/test/dummy/tmp/cache/assets/D3A/220/sprockets%2F4ba28941ec4418b83a3e08f5e4b3f22e +0 -0
  259. data/test/dummy/tmp/cache/assets/D3D/0C0/sprockets%2F5f4828a143b7a17c86ad173af45ea44f +0 -0
  260. data/test/dummy/tmp/cache/assets/D3E/D80/sprockets%2F26a353f794ccad1723ad26d564963dae +0 -0
  261. data/test/dummy/tmp/cache/assets/D3F/EE0/sprockets%2F4d4955da738ce18fcb5d5c254c20471d +0 -0
  262. data/test/dummy/tmp/cache/assets/D40/C00/sprockets%2Fafe2733518c27c73f2d19f27edc5c063 +0 -0
  263. data/test/dummy/tmp/cache/assets/D42/790/sprockets%2F54ebab76bb0c774f441f24a9b049a699 +0 -0
  264. data/test/dummy/tmp/cache/assets/D49/080/sprockets%2F47eee138813998c77fb4d63aea0a83b2 +0 -0
  265. data/test/dummy/tmp/cache/assets/D4A/F80/sprockets%2F573908d07c7e4a37eb475c916f44eaeb +0 -0
  266. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  267. data/test/dummy/tmp/cache/assets/D4F/950/sprockets%2Ffe8890753c95311541bfee8ec93bf6a3 +0 -0
  268. data/test/dummy/tmp/cache/assets/D50/660/sprockets%2F8934155ef2c7db6ff48de8d6a572b352 +0 -0
  269. data/test/dummy/tmp/cache/assets/D50/990/sprockets%2F2f7692187d5d687fd78bcbdd44583a0a +0 -0
  270. data/test/dummy/tmp/cache/assets/D52/BE0/sprockets%2F95f7169a509d1fe46b4b8b7f0d9b9d25 +0 -0
  271. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  272. data/test/dummy/tmp/cache/assets/D5B/270/sprockets%2Fd7121a8e796ab4de09bb1d140a03bd38 +0 -0
  273. data/test/dummy/tmp/cache/assets/D5B/B80/sprockets%2F420c9ca8933da2c7ac42af560ba80a72 +0 -0
  274. data/test/dummy/tmp/cache/assets/D5E/9A0/sprockets%2Fcbae55800082a9de23b02dc0f7416c7f +0 -0
  275. data/test/dummy/tmp/cache/assets/D60/890/sprockets%2Fa63fc11056490cd0ad51c725eea3cd87 +0 -0
  276. data/test/dummy/tmp/cache/assets/D60/F10/sprockets%2F251e00aea88ff5a6c41ed112283f1ef4 +0 -0
  277. data/test/dummy/tmp/cache/assets/D61/310/sprockets%2Ff9192502dcd75958872e1edf6cd8e89e +0 -0
  278. data/test/dummy/tmp/cache/assets/D62/480/sprockets%2Feb89e74e65edfd75c4048038f7e4897c +0 -0
  279. data/test/dummy/tmp/cache/assets/D63/D60/sprockets%2Fcca470eef56334f9ee3600394ca06a0c +0 -0
  280. data/test/dummy/tmp/cache/assets/D64/800/sprockets%2F8be19b06af6bb950af657a2a500c459a +0 -0
  281. data/test/dummy/tmp/cache/assets/D66/EC0/sprockets%2F5b533bbfba939b541a49cd9fb302364b +0 -0
  282. data/test/dummy/tmp/cache/assets/D67/CC0/sprockets%2Fd6be1951f1e10b034d95fc7e317ade62 +0 -0
  283. data/test/dummy/tmp/cache/assets/D69/ED0/sprockets%2F8573a0c480d82a6de7d4431cec53ecb4 +0 -0
  284. data/test/dummy/tmp/cache/assets/D6D/310/sprockets%2F9accebd1400d2d65bc13881889ea5e54 +0 -0
  285. data/test/dummy/tmp/cache/assets/D70/E30/sprockets%2Fdb69f2e4f8e94a52181602e81b7dda1c +0 -0
  286. data/test/dummy/tmp/cache/assets/D71/270/sprockets%2F87be1f988bb5dec8ad602202d66e61d1 +0 -0
  287. data/test/dummy/tmp/cache/assets/D71/DD0/sprockets%2Fdb33de95e82ca2e939a7a1173cd19a57 +0 -0
  288. data/test/dummy/tmp/cache/assets/D73/850/sprockets%2F1e6628b9b7568f1c549eeaaf5a101f4d +0 -0
  289. data/test/dummy/tmp/cache/assets/D74/350/sprockets%2F2a7fa3c361bcd65892a8d8cc4c7772d3 +0 -0
  290. data/test/dummy/tmp/cache/assets/D76/8E0/sprockets%2F5af05ee642ef7c6c480c59d2683c05cf +0 -0
  291. data/test/dummy/tmp/cache/assets/D79/530/sprockets%2F87127ee1c6bcf4b91d8e5f2eda951842 +0 -0
  292. data/test/dummy/tmp/cache/assets/D7E/7D0/sprockets%2F44be519f93759ef9d6faa21a8e532b7c +0 -0
  293. data/test/dummy/tmp/cache/assets/D7E/B50/sprockets%2Fd1d6bc2c8e90a69086a3fdd51d49e779 +0 -0
  294. data/test/dummy/tmp/cache/assets/D81/2E0/sprockets%2F0d2d4106bae377afa11cfc40ba8f6222 +0 -0
  295. data/test/dummy/tmp/cache/assets/D81/BE0/sprockets%2Fd17fbca0deb79f1d5fb200b13158010c +0 -0
  296. data/test/dummy/tmp/cache/assets/D82/950/sprockets%2F1f8a65498915f9fbdf8b2da74db800d8 +0 -0
  297. data/test/dummy/tmp/cache/assets/D87/2B0/sprockets%2Ffaf16963d8b856b046a1a96fef6d898b +0 -0
  298. data/test/dummy/tmp/cache/assets/D8A/CA0/sprockets%2F63b0ad83380a8b15a52c34cafe5c2de3 +0 -0
  299. data/test/dummy/tmp/cache/assets/D94/470/sprockets%2F3bf12b0f588dafba93c72a8ae1d20719 +0 -0
  300. data/test/dummy/tmp/cache/assets/D95/FB0/sprockets%2F7c5d5a248061ab4c0db3935cc39ff0fc +0 -0
  301. data/test/dummy/tmp/cache/assets/D97/2B0/sprockets%2Fd1ddf0ff80e01a73c31b2ced62877a94 +0 -0
  302. data/test/dummy/tmp/cache/assets/D98/0E0/sprockets%2F8f1dba887ccd80e10b70c026a3ce498b +0 -0
  303. data/test/dummy/tmp/cache/assets/D99/730/sprockets%2F6f1142f8fa2beb906b4a9ccd8e03a546 +0 -0
  304. data/test/dummy/tmp/cache/assets/D99/B70/sprockets%2F3330226a3ee4588f0e6c083dcbcef6fa +0 -0
  305. data/test/dummy/tmp/cache/assets/D99/D60/sprockets%2Fa5a6f50cb869da7b5d4170b7b2d7e2a6 +0 -0
  306. data/test/dummy/tmp/cache/assets/D9E/1F0/sprockets%2Fb51430da8d69a96e5689aafa8c0ac71b +0 -0
  307. data/test/dummy/tmp/cache/assets/D9E/460/sprockets%2F717a54dade795a66c2f6daea7c325a80 +0 -0
  308. data/test/dummy/tmp/cache/assets/DA1/6E0/sprockets%2F8ad3ca6d1c8f263b9cedad086e598122 +0 -0
  309. data/test/dummy/tmp/cache/assets/DA3/3E0/sprockets%2F37a6f8767ca6016b823aaccee078c8bf +0 -0
  310. data/test/dummy/tmp/cache/assets/DA4/640/sprockets%2F758aa928cedd052eb72b6c4d7dc438b6 +0 -0
  311. data/test/dummy/tmp/cache/assets/DA6/BD0/sprockets%2Ff7c34df9d6167bc3a49b90f74bd82a2c +0 -0
  312. data/test/dummy/tmp/cache/assets/DA9/280/sprockets%2Fc3386f232e36f9522dff1af8eb7d4e4d +0 -0
  313. data/test/dummy/tmp/cache/assets/DA9/BA0/sprockets%2F67d5749f62dd1a31ea998fdfc2b2e6c0 +0 -0
  314. data/test/dummy/tmp/cache/assets/DB0/610/sprockets%2F27f0e95fc9f245cfe45afd4d1f362a99 +0 -0
  315. data/test/dummy/tmp/cache/assets/DB1/AE0/sprockets%2Fbcf7eefe90b850e5b45267f2691c8ee5 +0 -0
  316. data/test/dummy/tmp/cache/assets/DB1/CC0/sprockets%2F449b63a2ccce6c96ca656fe56f4f29b8 +0 -0
  317. data/test/dummy/tmp/cache/assets/DB6/8D0/sprockets%2F99b8bcd8e7ac9e932a271c13e98fee45 +0 -0
  318. data/test/dummy/tmp/cache/assets/DBD/470/sprockets%2F449cee166e97d8dd62dcf38dc48f47c6 +0 -0
  319. data/test/dummy/tmp/cache/assets/DC3/D20/sprockets%2Fade0348f1f4f6d204cf07c256ccd33fa +0 -0
  320. data/test/dummy/tmp/cache/assets/DC5/510/sprockets%2Fddbe0b0bccf8028b03ef7993c5af8320 +0 -0
  321. data/test/dummy/tmp/cache/assets/DC6/880/sprockets%2F95ecea645241bc5c7263fbaf5bf3f2b0 +0 -0
  322. data/test/dummy/tmp/cache/assets/DC6/CD0/sprockets%2F2faab17861cdba1eb9e317d38a76da64 +0 -0
  323. data/test/dummy/tmp/cache/assets/DCA/B50/sprockets%2Fd3d82ca385d97142b4e57c7dca6fca0a +0 -0
  324. data/test/dummy/tmp/cache/assets/DCE/020/sprockets%2F6ce5583d1ef1afd8d72012c6dc9a4f4c +0 -0
  325. data/test/dummy/tmp/cache/assets/DCE/EA0/sprockets%2F8119567d3d979c4b91fea2b2bcaaefb0 +0 -0
  326. data/test/dummy/tmp/cache/assets/DD0/7F0/sprockets%2Fef2fa8f93ebd90602b488eaf3a0e554a +0 -0
  327. data/test/dummy/tmp/cache/assets/DD3/850/sprockets%2F3f0d25d896ebcb795fbcac0f45d874b0 +0 -0
  328. data/test/dummy/tmp/cache/assets/DDB/8C0/sprockets%2F837f7b8e8f33dbae4de34ba908bd328f +0 -0
  329. data/test/dummy/tmp/cache/assets/DDB/DA0/sprockets%2F3f6a3c8e4688abce408f6caf5b8dd653 +0 -0
  330. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  331. data/test/dummy/tmp/cache/assets/DDD/1E0/sprockets%2F596348d03c6fbcd9ac02fb9dbde6c878 +0 -0
  332. data/test/dummy/tmp/cache/assets/DE5/B70/sprockets%2Fc77a5e9b5e4f9fd02af4c1ed88d69d73 +0 -0
  333. data/test/dummy/tmp/cache/assets/DF0/CF0/sprockets%2F644ea5f42501f70e1a3daffaa5b9d1fd +0 -0
  334. data/test/dummy/tmp/cache/assets/DF2/260/sprockets%2F35c0090f47903a5efee65ac30cddccaf +0 -0
  335. data/test/dummy/tmp/cache/assets/DF5/5F0/sprockets%2F7f6b1930adca83a531ddbaa53ad76ee9 +0 -0
  336. data/test/dummy/tmp/cache/assets/DF6/390/sprockets%2Fa1c2e7c32b51dbfb4e5cb62f9f43a7a9 +0 -0
  337. data/test/dummy/tmp/cache/assets/DF8/B40/sprockets%2F037ccfb8fa7231bfa7ffbc59d070c3d4 +0 -0
  338. data/test/dummy/tmp/cache/assets/DFB/F00/sprockets%2F010dfb576ac2abb5d9d8ee5a9f6d328a +0 -0
  339. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  340. data/test/dummy/tmp/cache/assets/E05/460/sprockets%2Fefc998afbc280b66df981c0ea0ea29c4 +0 -0
  341. data/test/dummy/tmp/cache/assets/E13/660/sprockets%2F1307359c773fdc80cdee9cf87efdd6fa +0 -0
  342. data/test/dummy/tmp/cache/assets/E1B/2A0/sprockets%2F6a86e3ac6f50aadb84ef5a3600adbc1d +0 -0
  343. data/test/dummy/tmp/cache/assets/E1B/B40/sprockets%2Fff174762b8bfd6df1fd9ad6fed18896d +0 -0
  344. data/test/dummy/tmp/cache/assets/E1E/220/sprockets%2F2c2fccd808a30aff0b21fac944dc6c7c +0 -0
  345. data/test/dummy/tmp/cache/assets/E21/3B0/sprockets%2Fabaa5df24f3535acc9cdfd56b0e0b349 +0 -0
  346. data/test/dummy/tmp/cache/assets/E32/120/sprockets%2F13ebfca6482f8e2fec5eface39805b2d +0 -0
  347. data/test/dummy/tmp/cache/assets/E32/1B0/sprockets%2F8539ffcc451cffbed1e1c8f09fa5a1c5 +0 -0
  348. data/test/dummy/tmp/cache/assets/E34/E20/sprockets%2F1a542cad56953aff56cbfbf337fcf9af +0 -0
  349. data/test/dummy/tmp/cache/assets/E3B/040/sprockets%2Fb8f87d0eb5a059cec709bdff6f7bfc15 +0 -0
  350. data/test/dummy/tmp/cache/assets/E5B/6A0/sprockets%2Fe58ffacd2cad19c5f5bda5b91f4620bf +0 -0
  351. data/test/dummy/tmp/cache/assets/E5C/840/sprockets%2Fcbfdfc7aeac880cc161f9fa61af654c3 +0 -0
  352. data/test/dummy/tmp/cache/assets/E68/250/sprockets%2F88d5fa5be6cb9d7e540bad6e94bdd8aa +0 -0
  353. data/test/dummy/tmp/cache/assets/E6F/F60/sprockets%2Fcf91796bdc66abbcde70ce9fcf47a76d +0 -0
  354. data/test/dummy/tmp/cache/assets/E7D/DA0/sprockets%2F3a4ceceac3e02f2a7b82dcf3f25ea7ad +0 -0
  355. data/test/dummy/tmp/cache/assets/E81/0E0/sprockets%2Fcc36d9cdd3fc1c5a8d1b54ccfadad352 +0 -0
  356. data/test/dummy/tmp/cache/assets/EBE/170/sprockets%2Fa7a17e1d2fe6fb6d5e368cfeddfae1ca +0 -0
  357. data/test/dummy/tmp/cache/assets/EED/8B0/sprockets%2F2c35ce7baabe8d64cceace7cb95bfd9a +0 -0
  358. data/test/dummy/tmp/cache/sass/286d476815ae5a0d73c086d611d7e534638a4c9a/document.css.scssc +0 -0
  359. data/test/dummy/tmp/cache/sass/286d476815ae5a0d73c086d611d7e534638a4c9a/forms.css.scssc +0 -0
  360. data/test/dummy/tmp/cache/sass/286d476815ae5a0d73c086d611d7e534638a4c9a/tables.css.scssc +0 -0
  361. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_accordion.scssc +0 -0
  362. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_alerts.scssc +0 -0
  363. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_breadcrumbs.scssc +0 -0
  364. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_button-groups.scssc +0 -0
  365. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_buttons.scssc +0 -0
  366. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_carousel.scssc +0 -0
  367. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_close.scssc +0 -0
  368. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_code.scssc +0 -0
  369. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_component-animations.scssc +0 -0
  370. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_dropdowns.scssc +0 -0
  371. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_forms.scssc +0 -0
  372. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_grid.scssc +0 -0
  373. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_hero-unit.scssc +0 -0
  374. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_labels-badges.scssc +0 -0
  375. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_layouts.scssc +0 -0
  376. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_media.scssc +0 -0
  377. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_mixins.scssc +0 -0
  378. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_modals.scssc +0 -0
  379. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_navbar.scssc +0 -0
  380. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_navs.scssc +0 -0
  381. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_pager.scssc +0 -0
  382. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_pagination.scssc +0 -0
  383. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_popovers.scssc +0 -0
  384. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_progress-bars.scssc +0 -0
  385. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_reset.scssc +0 -0
  386. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_responsive-1200px-min.scssc +0 -0
  387. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_responsive-767px-max.scssc +0 -0
  388. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_responsive-768px-979px.scssc +0 -0
  389. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_responsive-navbar.scssc +0 -0
  390. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_responsive-utilities.scssc +0 -0
  391. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_scaffolding.scssc +0 -0
  392. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_sprites.scssc +0 -0
  393. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_tables.scssc +0 -0
  394. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_thumbnails.scssc +0 -0
  395. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_tooltip.scssc +0 -0
  396. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_type.scssc +0 -0
  397. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_utilities.scssc +0 -0
  398. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_variables.scssc +0 -0
  399. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/_wells.scssc +0 -0
  400. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/bootstrap.scssc +0 -0
  401. data/test/dummy/tmp/cache/sass/9c4049ac4ab21c80305c119b565d8ccee297f91e/responsive.scssc +0 -0
  402. data/test/dummy/tmp/cache/sass/e3442098eb9df3b4438ecccd23acb9a9a8b7fa1f/bootstrap-responsive.scssc +0 -0
  403. data/test/dummy/tmp/cache/sass/e3442098eb9df3b4438ecccd23acb9a9a8b7fa1f/bootstrap.scssc +0 -0
  404. data/test/factories/invoice_bar_account.rb +16 -0
  405. data/test/factories/invoice_bar_address.rb +10 -0
  406. data/test/factories/invoice_bar_contact.rb +7 -0
  407. data/test/factories/invoice_bar_currency.rb +7 -0
  408. data/test/factories/invoice_bar_invoice.rb +28 -0
  409. data/test/factories/invoice_bar_invoice_template.rb +22 -0
  410. data/test/factories/invoice_bar_item.rb +7 -0
  411. data/test/factories/invoice_bar_receipt.rb +27 -0
  412. data/test/factories/invoice_bar_receipt_template.rb +21 -0
  413. data/test/factories/invoice_bar_user.rb +9 -0
  414. data/test/functional/invoice_bar/accounts_controller_test.rb +65 -0
  415. data/test/functional/invoice_bar/contacts_controller_test.rb +67 -0
  416. data/test/functional/invoice_bar/currencies_controller_test.rb +59 -0
  417. data/test/functional/invoice_bar/invoice_templates_controller_test.rb +71 -0
  418. data/test/functional/invoice_bar/invoices_controller_test.rb +76 -0
  419. data/test/functional/invoice_bar/receipt_templates_controller_test.rb +67 -0
  420. data/test/functional/invoice_bar/receipts_controller_test.rb +68 -0
  421. data/test/functional/invoice_bar/users_controller_test.rb +83 -0
  422. data/test/invoice_bar_test.rb +7 -0
  423. data/test/performance/browsing_test.rb +14 -0
  424. data/test/test_helper.rb +40 -0
  425. data/test/unit/invoice_bar/account_test.rb +31 -0
  426. data/test/unit/invoice_bar/address_test.rb +31 -0
  427. data/test/unit/invoice_bar/contact_test.rb +17 -0
  428. data/test/unit/invoice_bar/currency_test.rb +13 -0
  429. data/test/unit/invoice_bar/helpers/invoice_bar_helper_test.rb +19 -0
  430. data/test/unit/invoice_bar/invoice_template_test.rb +36 -0
  431. data/test/unit/invoice_bar/invoice_test.rb +67 -0
  432. data/test/unit/invoice_bar/item_test.rb +48 -0
  433. data/test/unit/invoice_bar/receipt_template_test.rb +34 -0
  434. data/test/unit/invoice_bar/receipt_test.rb +48 -0
  435. data/test/unit/invoice_bar/user_test.rb +29 -0
  436. metadata +1030 -0
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Copyright (C) 2012 Josef Strzibny
2
+
3
+ This program is free software; you can redistribute it and/or
4
+ modify it under the terms of the GNU General Public License
5
+ as published by the Free Software Foundation; either version 2
6
+ of the License, or (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License
14
+ along with this program; if not, write to the Free Software
15
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = Invoicebar
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Invoicebar'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+
39
+ task :default => :test
@@ -0,0 +1,98 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require bootstrap
15
+ //= require jquery_ujs
16
+ //= require jquery.ui.all
17
+ //= require jquery_nested_form
18
+ //= require_tree .
19
+
20
+ $(function() {
21
+ $.datepicker.regional['cs'] = {
22
+ closeText: 'Cerrar',
23
+ prevText: 'Předchozí',
24
+ nextText: 'Další',
25
+ currentText: 'Hoy',
26
+ monthNames: ['Leden','Únor','Březen','Duben','Květen','Červen', 'Červenec','Srpen','Září','Říjen','Listopad','Prosinec'],
27
+ monthNamesShort: ['Le','Ún','Bř','Du','Kv','Čn', 'Čc','Sr','Zá','Ří','Li','Pr'],
28
+ dayNames: ['Neděle','Pondělí','Úterý','Středa','Čtvrtek','Pátek','Sobota'],
29
+ dayNamesShort: ['Ne','Po','Út','St','Čt','Pá','So',],
30
+ dayNamesMin: ['Ne','Po','Út','St','Čt','Pá','So'],
31
+ weekHeader: 'Sm',
32
+ dateFormat: 'dd.mm.yy',
33
+ firstDay: 1,
34
+ isRTL: false,
35
+ showMonthAfterYear: false,
36
+ yearSuffix: ''};
37
+
38
+ $.datepicker.setDefaults($.datepicker.regional['cs']);
39
+
40
+ // Enables the JQuery's datepicker.
41
+ $('.datepicker').datepicker({
42
+ dateFormat: "yy-mm-dd"
43
+ });
44
+
45
+
46
+ $("#invoice_issuer_true").each(function(index, button){
47
+ $(button).click(function(){
48
+ value = $('#issuer_true_hidden').val()
49
+ current_value = $("#invoice_number").val()
50
+ if (value != undefined) {
51
+ $("#invoice_number").val(value);
52
+ }
53
+ });
54
+ });
55
+ $("#invoice_issuer_false").each(function(index, button){
56
+ $(button).click(function(){
57
+ value = $('#issuer_false_hidden').val()
58
+ current_value = $("#invoice_number").val()
59
+ if (value != undefined) {
60
+ $("#invoice_number").val(value);
61
+ }
62
+ });
63
+ });
64
+ $("#receipt_issuer_true").each(function(index, button){
65
+ $(button).click(function(){
66
+ value = $('#issuer_true_hidden').val()
67
+ current_value = $("#receipt_number").val()
68
+ if (value != undefined) {
69
+ $("#receipt_number").val(value);
70
+ }
71
+ });
72
+ });
73
+ $("#receipt_issuer_false").each(function(index, button){
74
+ $(button).click(function(){
75
+ value = $('#issuer_false_hidden').val()
76
+ current_value = $("#receipt_number").val()
77
+ if (value != undefined) {
78
+ $("#receipt_number").val(value);
79
+ }
80
+ });
81
+ });
82
+
83
+ // Toggles the templates option in bills' forms.
84
+ var prefill = false
85
+
86
+ $('.prefill-toggle').click(function() {
87
+ if (prefill == false) {
88
+ prefill = true;
89
+ $('.prefill-toggle').css('background','lightgrey');
90
+ } else {
91
+ prefill = false;
92
+ $('.prefill-toggle').css('background','white');
93
+ }
94
+ $('#prefill-form').slideToggle('slow', function() {
95
+ // Animation complete.
96
+ });
97
+ });
98
+ });
@@ -0,0 +1,170 @@
1
+ // Bootstrap adjustments
2
+
3
+ .fixmax1 { max-width: 55px; }
4
+ .fixmax2 { max-width: 110px; }
5
+ .fixmax3 { max-width: 165px; }
6
+ .fixmax4 { max-width: 220px; }
7
+ .fixmax5 { max-width: 275px; }
8
+
9
+
10
+ // Headers
11
+
12
+ h1 { margin-bottom: 30px; }
13
+
14
+
15
+ // Buttons
16
+
17
+ .btn-no-link, .btn-no-link:hover { text-decoration: none; }
18
+
19
+
20
+ // Links
21
+
22
+ form a:hover, table a:hover { background: #0C6591; color: white; text-decoration: none; }
23
+
24
+
25
+ // Navigation
26
+
27
+ .sub-navigation .btn-group, .sub-navigation .nav { margin-top: 5px }
28
+ .sub-navigation h1 {
29
+ float: left;
30
+ margin-top: 0;
31
+ padding-top: 0;
32
+ margin-left: 20px;
33
+ font-size: 30px
34
+ }
35
+
36
+ @mixin rounded-corners($px) {
37
+ -moz-border-radius: $px;
38
+ -webkit-border-radius: $px;
39
+ border-radius: $px;
40
+ }
41
+
42
+
43
+ // Fieldsets
44
+
45
+ .show,
46
+ fieldset.user,
47
+ fieldset.customer,
48
+ fieldset.account {
49
+ border: 3px solid lightgrey;
50
+ padding: 10px;
51
+ @include rounded-corners(6px);
52
+ }
53
+
54
+ fieldset .top {
55
+ padding-bottom: 10px;
56
+ color: grey;
57
+ }
58
+
59
+
60
+ // Filter status options
61
+ .status-filter {
62
+ margin-bottom: 20px;
63
+ .not-selected .btn-info,
64
+ .not-selected .btn-success,
65
+ .not-selected .btn-warning,
66
+ .not-selected .btn-inverse,
67
+ .not-selected .btn-danger {
68
+ background: grey;
69
+ }
70
+ }
71
+
72
+
73
+ // Listing items in #show
74
+ #total {
75
+ clear:both;
76
+ font-size: 25px;
77
+ padding-top: 35px;
78
+ text-align: right;
79
+ width: 770px;
80
+ }
81
+
82
+ #bill-items {
83
+ margin-top: 20px;
84
+ clear:both;
85
+
86
+ .header { font-weight: bold; }
87
+
88
+ .item {
89
+ clear: both;
90
+
91
+ div {
92
+ float: left;
93
+ text-align: right;
94
+ border-bottom: 1px solid lightgrey;
95
+ padding-right: 10px;
96
+ }
97
+ .name { width: 400px; text-align: left; }
98
+ .number { width: 50px; }
99
+ .unit { width: 80px; }
100
+ .price { width: 80px; }
101
+ .amount { width: 120px; }
102
+
103
+ }
104
+ }
105
+
106
+ // Prefill toggle part of form
107
+
108
+ .prefill-toggle { background: lightgrey; margin-top: 25px; }
109
+ .prefill-toggle:hover { background: white; }
110
+ #prefill-form {
111
+ margin-top: 20px;
112
+ margin-bottom: 20px;
113
+
114
+ input { margin-top: 25px; }
115
+ }
116
+
117
+
118
+ // No data
119
+ .no-data {
120
+ padding: 20px;
121
+ border: 2px solid lightgrey;
122
+ color: grey;
123
+ @include rounded-corners(6px);
124
+ }
125
+
126
+
127
+ // fix .input-block-level
128
+
129
+ @media (max-width: 767px) {
130
+ body form div.fixmax4 {
131
+ max-width: 100%;
132
+ }
133
+ body form div.fixmax4,
134
+ body form input,
135
+ body form select {
136
+ display: block;
137
+ width: 100%;
138
+ min-height: 30px;
139
+ -webkit-box-sizing: border-box;
140
+ -moz-box-sizing: border-box;
141
+ box-sizing: border-box;
142
+ }
143
+
144
+ body input.city { width: 75%; margin-left: 4%; }
145
+ body input.postcode { width: 20%; }
146
+ body input.street { width: 75%; }
147
+ body input.street_number { width: 20%; margin-left: 4%; }
148
+ html body input.contact_name { width: 100%; }
149
+ html body select.contact_name-select { width: 100%; }
150
+ body input.contact_ic { width: 90%; }
151
+ html body input.contact_dic { width: 100%; }
152
+ .fixmax4 { max-width: 100%; }
153
+ .fixmax5 { max-width: 100%; }
154
+
155
+ }
156
+
157
+ @media (max-width: 480px) {
158
+ body input.city { width: 74%; margin-left: 4%; }
159
+ body input.postcode { width: 20%; }
160
+ body input.street { width: 74%; }
161
+ body input.street_number { width: 20%; margin-left: 4%; }
162
+ html body input.contact_name { width: 100%; }
163
+ html body select.contact_name-select { width: 100%; }
164
+ body input.contact_ic { width: 90%; }
165
+ body input.contact_dic { width: 100%; }
166
+ .fixmax4 { max-width: 100%; }
167
+ .fixmax5 { max-width: 100%; }
168
+
169
+ body .sub-navigation h1 { clear: both; }
170
+ }
@@ -0,0 +1,60 @@
1
+ // Forms
2
+
3
+ form input.suggested { border: 2px solid #999999; }
4
+ form input.optional {}
5
+ form .item-input-box { float: left; }
6
+ form .item {
7
+ clear: both;
8
+
9
+ .name { width: 300px; input { width: 219px; } }
10
+ .unit { width: 90px; input { width: 40px; text-align: right; } }
11
+ .number { width: 108px; input { width: 40px; text-align: right; } }
12
+ .price { width: 210px; input { width: 100px; text-align: right; } }
13
+ .remove { padding-top: 5px; padding-left: 3px; }
14
+ }
15
+ //form .item { clear: both; }
16
+ body input.contact_name { width: 90%; }
17
+ body select.contact_name-select { width: 76%; margin-right: 1%; }
18
+ body input.contact_ic { width: 70%; }
19
+ body input.contact_dic { width: 90%; }
20
+
21
+ .radio { float: left; width: 60px }
22
+
23
+ // Submit buttons
24
+ .load-ic-button { padding: 5px 5px; }
25
+ .load-contact-button { padding: 4px 5px; }
26
+
27
+ // Displaying errors in forms
28
+
29
+ body .field_with_errors {
30
+ input { border-color: #DB490B; }
31
+
32
+ input.city,
33
+ input.postcode,
34
+ input.street,
35
+ input.street_number { float: left; }
36
+ }
37
+ input.city,
38
+ input.postcode,
39
+ input.street,
40
+ input.street_number { float: left; }
41
+ .add-on { float: left; }
42
+
43
+ .error_explanation {
44
+ font-size: 17px;
45
+
46
+ h2 { padding-top: 0; text-align: left; }
47
+ }
48
+
49
+
50
+ // Filter form
51
+
52
+ form .smaller { width: 100px; }
53
+
54
+
55
+ // Address form
56
+
57
+ input.city { width: 126px; margin-left: 7px; }
58
+ input.postcode { width: 50px; text-align: center; }
59
+ input.street { width: 126px; }
60
+ input.street_number { width: 50px; margin-left: 7px; }
@@ -0,0 +1,10 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ *= require_self
6
+ *= require bootstrap
7
+ *= require bootstrap-responsive
8
+ *= require_tree .
9
+ *= require jquery.ui.all
10
+ */
@@ -0,0 +1,14 @@
1
+ // Tables
2
+
3
+ // Bills table
4
+
5
+ .table {
6
+ td { padding-left: 10px; padding-right: 10px; }
7
+ span { display: block; padding-top: 0px; }
8
+
9
+ .name { }
10
+ .amount { width: 115px; text-align: right; }
11
+ .number { width: 200px; }
12
+ .issue_date, .due_date { width: 80px; text-align: right; }
13
+ .state { width: 50px; }
14
+ }
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class AccountsController < InvoiceBar::ApplicationController
5
+ inherit_resources
6
+ respond_to :html, :json
7
+
8
+ before_filter :require_login
9
+ before_filter :fetch_currencies, :only => [:new, :create, :edit, :update]
10
+
11
+ def create
12
+ @account = Account.new(params[:account])
13
+ current_user.accounts << @account
14
+
15
+ create! {}
16
+ end
17
+
18
+ def update
19
+ update! {}
20
+ end
21
+
22
+ def destroy
23
+ destroy! {}
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class ApplicationController < ActionController::Base
5
+ protect_from_forgery
6
+
7
+ helper InvoiceBar::InvoiceBarHelper
8
+ layout 'invoice_bar/layouts/signed_in'
9
+
10
+ protected
11
+
12
+ # For InheritedResources
13
+ def begin_of_association_chain
14
+ current_user
15
+ end
16
+
17
+ def fetch_user_contacts
18
+ @contacts = current_user.contacts
19
+ end
20
+
21
+ def fetch_user_invoice_templates
22
+ @invoice_templates = current_user.invoice_templates
23
+ end
24
+
25
+ def fetch_user_receipt_templates
26
+ @receipt_templates = current_user.receipt_templates
27
+ end
28
+
29
+ def fetch_user_accounts
30
+ @accounts = current_user.accounts
31
+
32
+ if @accounts.empty?
33
+ flash[:alert] = t('messages.no_accounts')
34
+ end
35
+ end
36
+
37
+ def fetch_currencies
38
+ @currencies = Currency.order('priority DESC')
39
+
40
+ if @currencies.empty?
41
+ flash[:alert] = t('messages.no_currencies')
42
+ end
43
+ end
44
+
45
+ def require_admin_rights
46
+ if current_user
47
+ unless current_user.administrator?
48
+ redirect_to root_url, alert: t('messages.not_administrator')
49
+ end
50
+ else
51
+ not_authenticated
52
+ end
53
+ end
54
+
55
+ def not_authenticated
56
+ redirect_to login_url, alert: t('messages.not_authenticated')
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class ContactsController < InvoiceBar::ApplicationController
5
+ inherit_resources
6
+ respond_to :html, :json
7
+
8
+ before_filter :require_login
9
+
10
+ def new
11
+ @contact = Contact.new
12
+ @contact.build_address
13
+
14
+ new!
15
+ end
16
+
17
+ def create
18
+ @contact = Contact.new(params[:contact])
19
+ current_user.contacts << @contact
20
+
21
+ @contact.build_address unless @contact.address
22
+
23
+ create! {}
24
+ end
25
+
26
+ def update
27
+ update! {}
28
+ end
29
+
30
+ def destroy
31
+ destroy! {}
32
+ end
33
+
34
+ protected
35
+
36
+ def collection
37
+ @contacts ||= end_of_association_chain.page(params[:page])
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class CurrenciesController < InvoiceBar::ApplicationController
5
+ inherit_resources
6
+ respond_to :html, :json
7
+
8
+ before_filter :require_admin_rights
9
+
10
+ def create
11
+ create! {}
12
+ end
13
+
14
+ def update
15
+ update! {}
16
+ end
17
+
18
+ def destroy
19
+ destroy! {}
20
+ end
21
+
22
+ protected
23
+
24
+ def begin_of_association_chain
25
+ # For InheritedResources
26
+ # Currencies are general and not user specific
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class DashboardController < InvoiceBar::ApplicationController
5
+ before_filter :require_login
6
+
7
+ def index
8
+ redirect_to invoices_path
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+
3
+ module InvoiceBar
4
+ class InvoiceTemplatesController < InvoiceBar::ApplicationController
5
+ inherit_resources
6
+ respond_to :html, :json
7
+
8
+ before_filter :require_login
9
+ before_filter :fetch_user_contacts, :only => [:new, :create, :edit, :update]
10
+ before_filter :fetch_user_accounts, :only => [:new, :create, :edit, :update]
11
+
12
+ def show
13
+ @invoice_template = current_user.invoice_templates.find(params[:id])
14
+ @address = @invoice_template.address
15
+ @account = current_user.accounts.find(@invoice_template.account_id) unless @invoice_template.account_id or current_user.accounts
16
+
17
+ respond_to do |format|
18
+ format.html
19
+ format.pdf
20
+ format.json { render json: @invoice_template }
21
+ end
22
+ end
23
+
24
+ def new
25
+ @invoice_template = InvoiceTemplate.new
26
+ @invoice_template.items.build
27
+ @invoice_template.build_address
28
+
29
+ new!
30
+ end
31
+
32
+ def create
33
+ flash[:notice], flash[:alert] = nil, nil
34
+
35
+ @invoice_template = InvoiceTemplate.new(params[:invoice_template])
36
+
37
+ fill_in_contact if params[:fill_in_contact]
38
+
39
+ if params[:ic]
40
+ if (@invoice_template.load_contact_from_ic(@invoice_template.contact_ic))
41
+ flash[:notice] = I18n.t('messages.ic_loaded')
42
+ else
43
+ flash[:alert] = I18n.t('messages.cannot_load_ic')
44
+ end
45
+ end
46
+
47
+ if params[:fill_in_contact] || params[:ic]
48
+ respond_to do |format|
49
+ format.html { render action: 'new' }
50
+ format.json { render json: @invoice_template }
51
+ end
52
+ else
53
+ current_user.invoice_templates << @invoice_template
54
+
55
+ create! {}
56
+ end
57
+ end
58
+
59
+ def edit
60
+ @invoice_template = InvoiceTemplate.find(params[:id])
61
+ @invoice_template.build_address unless @invoice_template.address
62
+
63
+ edit!
64
+ end
65
+
66
+ def update
67
+ flash[:notice], flash[:alert] = nil, nil
68
+
69
+ @invoice_template = current_user.invoice_templates.find(params[:id])
70
+
71
+ fill_in_contact if params[:fill_in_contact]
72
+
73
+ if params[:ic]
74
+ if (@invoice_template.load_contact_from_ic(@invoice_template.contact_ic))
75
+ flash[:notice] = I18n.t('messages.ic_loaded')
76
+ else
77
+ flash[:alert] = I18n.t('messages.cannot_load_ic')
78
+ end
79
+ end
80
+
81
+ if params[:fill_in_contact] || params[:ic]
82
+ respond_to do |format|
83
+ format.html { render action: 'edit' }
84
+ format.json { render json: @invoice_template }
85
+ end
86
+ else
87
+ update! {}
88
+ end
89
+ end
90
+
91
+ def destroy
92
+ destroy! {}
93
+ end
94
+
95
+ protected
96
+
97
+ def collection
98
+ @invoice_templates ||= end_of_association_chain.page(params[:page])
99
+ end
100
+
101
+ def fill_in_contact
102
+ if params[:contact_id] and not params[:contact_id].blank?
103
+ contact = current_user.contacts.find(params[:contact_id])
104
+ @invoice_template.use_contact(contact)
105
+ end
106
+ end
107
+ end
108
+ end