bookyt 0.0.1

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.
Files changed (357) hide show
  1. data/app/assets/images/16x16/add.png +0 -0
  2. data/app/assets/images/16x16/alert.png +0 -0
  3. data/app/assets/images/16x16/combolink.png +0 -0
  4. data/app/assets/images/16x16/copy.png +0 -0
  5. data/app/assets/images/16x16/delete.png +0 -0
  6. data/app/assets/images/16x16/edit.png +0 -0
  7. data/app/assets/images/16x16/filter.png +0 -0
  8. data/app/assets/images/16x16/index.png +0 -0
  9. data/app/assets/images/16x16/notice.png +0 -0
  10. data/app/assets/images/16x16/pdf.png +0 -0
  11. data/app/assets/images/16x16/print.png +0 -0
  12. data/app/assets/images/16x16/show.png +0 -0
  13. data/app/assets/images/22x22/arrow-right.png +0 -0
  14. data/app/assets/images/22x22/edit.png +0 -0
  15. data/app/assets/images/22x22/insert_booking.png +0 -0
  16. data/app/assets/images/22x22/remove.png +0 -0
  17. data/app/assets/images/32x32/edit.png +0 -0
  18. data/app/assets/images/32x32/remove.png +0 -0
  19. data/app/assets/images/48x48/accounting.png +0 -0
  20. data/app/assets/images/48x48/basic_claims_data.png +0 -0
  21. data/app/assets/images/48x48/contacts.png +0 -0
  22. data/app/assets/images/48x48/invoicing.png +0 -0
  23. data/app/assets/images/48x48/nav_users.png +0 -0
  24. data/app/assets/images/48x48/settings.png +0 -0
  25. data/app/assets/images/48x48/store.png +0 -0
  26. data/app/assets/images/button_bg.png +0 -0
  27. data/app/assets/images/crystal-icons/16x16/filter.png +0 -0
  28. data/app/assets/images/down.png +0 -0
  29. data/app/assets/images/favicon.ico +0 -0
  30. data/app/assets/images/flavour-extended/48x48/invoice.png +0 -0
  31. data/app/assets/images/free-business-desktop-icons/48x48/business.png +0 -0
  32. data/app/assets/images/gnome-web-icons/48x48/Gnome-X-Office-Address-Book-48.png +0 -0
  33. data/app/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  34. data/app/assets/images/jquery-ui/ui-bg_flat_55_fbec88_40x100.png +0 -0
  35. data/app/assets/images/jquery-ui/ui-bg_glass_75_759fcf_1x400.png +0 -0
  36. data/app/assets/images/jquery-ui/ui-bg_glass_85_aeb9cf_1x400.png +0 -0
  37. data/app/assets/images/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  38. data/app/assets/images/jquery-ui/ui-bg_gloss-wave_55_aeb9cf_500x100.png +0 -0
  39. data/app/assets/images/jquery-ui/ui-bg_inset-hard_100_759fcf_1x100.png +0 -0
  40. data/app/assets/images/jquery-ui/ui-bg_inset-hard_100_f6f6f6_1x100.png +0 -0
  41. data/app/assets/images/jquery-ui/ui-icons_217bc0_256x240.png +0 -0
  42. data/app/assets/images/jquery-ui/ui-icons_2e83ff_256x240.png +0 -0
  43. data/app/assets/images/jquery-ui/ui-icons_469bdd_256x240.png +0 -0
  44. data/app/assets/images/jquery-ui/ui-icons_6da8d5_256x240.png +0 -0
  45. data/app/assets/images/jquery-ui/ui-icons_cd0a0a_256x240.png +0 -0
  46. data/app/assets/images/jquery-ui/ui-icons_d8e7f3_256x240.png +0 -0
  47. data/app/assets/images/jquery-ui/ui-icons_f9bd01_256x240.png +0 -0
  48. data/app/assets/images/jquery/tooltip/black_arrow.png +0 -0
  49. data/app/assets/images/letter-logo.alpha.png +0 -0
  50. data/app/assets/images/letter-logo.big.png +0 -0
  51. data/app/assets/images/letter-logo.orig.png +0 -0
  52. data/app/assets/images/letter-logo.png +0 -0
  53. data/app/assets/images/loading.gif +0 -0
  54. data/app/assets/images/logo.png +0 -0
  55. data/app/assets/images/oxygen-icons/16x16/application-pdf.png +0 -0
  56. data/app/assets/images/oxygen-icons/16x16/document-preview.png +0 -0
  57. data/app/assets/images/oxygen-icons/16x16/document-print.png +0 -0
  58. data/app/assets/images/oxygen-icons/16x16/edit-copy.png +0 -0
  59. data/app/assets/images/oxygen-icons/16x16/go-next.png +0 -0
  60. data/app/assets/images/oxygen-icons/16x16/mail-mark-notjunk.png +0 -0
  61. data/app/assets/images/oxygen-icons/16x16/status_unknown.png +0 -0
  62. data/app/assets/images/oxygen-icons/48x48/system-users.png +0 -0
  63. data/app/assets/images/rails.png +0 -0
  64. data/app/assets/images/up.png +0 -0
  65. data/app/assets/javascripts/application.js +49 -0
  66. data/app/assets/javascripts/cyt.js +86 -0
  67. data/app/assets/javascripts/jquery-ui.js +11437 -0
  68. data/app/assets/javascripts/jquery.dirtyform.js +242 -0
  69. data/app/assets/javascripts/jquery.form.js +785 -0
  70. data/app/assets/javascripts/jquery.js +8936 -0
  71. data/app/assets/javascripts/jquery.meio.mask.js +683 -0
  72. data/app/assets/javascripts/jquery.remotipart.js +46 -0
  73. data/app/assets/javascripts/jquery.ui.combobox.js +77 -0
  74. data/app/assets/javascripts/jquery_ujs.js +316 -0
  75. data/app/assets/javascripts/nested_form.js +51 -0
  76. data/app/assets/javascripts/tooltip.js +343 -0
  77. data/app/assets/stylesheets/.gitkeep +0 -0
  78. data/app/assets/stylesheets/ie.scss +16 -0
  79. data/app/assets/stylesheets/ie6.scss +4 -0
  80. data/app/assets/stylesheets/partials/_base.sass +39 -0
  81. data/app/assets/stylesheets/partials/_content.sass +60 -0
  82. data/app/assets/stylesheets/partials/_jquery.sass +2 -0
  83. data/app/assets/stylesheets/partials/_layout.sass +21 -0
  84. data/app/assets/stylesheets/partials/_sidebar.sass +5 -0
  85. data/app/assets/stylesheets/partials/content/_accounting.sass +41 -0
  86. data/app/assets/stylesheets/partials/content/_ajax_indicator.sass +28 -0
  87. data/app/assets/stylesheets/partials/content/_app.sass +43 -0
  88. data/app/assets/stylesheets/partials/content/_combobox.sass +8 -0
  89. data/app/assets/stylesheets/partials/content/_cyt.sass +200 -0
  90. data/app/assets/stylesheets/partials/content/_fancy_buttons.sass +10 -0
  91. data/app/assets/stylesheets/partials/content/_flash_errors.sass +46 -0
  92. data/app/assets/stylesheets/partials/content/_form_view.sass +20 -0
  93. data/app/assets/stylesheets/partials/content/_icons.sass +35 -0
  94. data/app/assets/stylesheets/partials/content/_invoice.sass +6 -0
  95. data/app/assets/stylesheets/partials/content/_overview.sass +40 -0
  96. data/app/assets/stylesheets/partials/content/_pagination.sass +61 -0
  97. data/app/assets/stylesheets/partials/content/_person.sass +5 -0
  98. data/app/assets/stylesheets/partials/content/_scaffold.sass +67 -0
  99. data/app/assets/stylesheets/partials/content/_table_list.sass +26 -0
  100. data/app/assets/stylesheets/partials/content/formtastic/_formtastic.sass +201 -0
  101. data/app/assets/stylesheets/partials/content/formtastic/_formtastic_cyt.sass +90 -0
  102. data/app/assets/stylesheets/partials/formtastic/_custom_fields.sass +2 -0
  103. data/app/assets/stylesheets/partials/formtastic/_formtastic_base.sass +652 -0
  104. data/app/assets/stylesheets/partials/jquery/_jquery_ui.sass +1461 -0
  105. data/app/assets/stylesheets/partials/jquery/_tooltip.sass +21 -0
  106. data/app/assets/stylesheets/partials/layout/_header.sass +29 -0
  107. data/app/assets/stylesheets/partials/layout/_navigation.sass +2 -0
  108. data/app/assets/stylesheets/partials/layout/navigation/_main.sass +34 -0
  109. data/app/assets/stylesheets/partials/layout/navigation/_sidebar.sass +18 -0
  110. data/app/assets/stylesheets/partials/print/_app.sass +21 -0
  111. data/app/assets/stylesheets/partials/print/_layout.sass +24 -0
  112. data/app/assets/stylesheets/print.scss +5 -0
  113. data/app/assets/stylesheets/screen.scss +12 -0
  114. data/app/controllers/account_types_controller.rb +2 -0
  115. data/app/controllers/accounts_controller.rb +30 -0
  116. data/app/controllers/application_controller.rb +12 -0
  117. data/app/controllers/attachments_controller.rb +15 -0
  118. data/app/controllers/authorized_controller.rb +24 -0
  119. data/app/controllers/bank_accounts_controller.rb +2 -0
  120. data/app/controllers/booking_imports_controller.rb +2 -0
  121. data/app/controllers/booking_templates_controller.rb +8 -0
  122. data/app/controllers/bookings_controller.rb +64 -0
  123. data/app/controllers/charge_booking_templates_controller.rb +2 -0
  124. data/app/controllers/charge_rates_controller.rb +2 -0
  125. data/app/controllers/companies_controller.rb +8 -0
  126. data/app/controllers/credit_invoices_controller.rb +29 -0
  127. data/app/controllers/customers_controller.rb +12 -0
  128. data/app/controllers/debit_invoices_controller.rb +43 -0
  129. data/app/controllers/direct_bookings_controller.rb +17 -0
  130. data/app/controllers/employees_controller.rb +3 -0
  131. data/app/controllers/employments_controller.rb +2 -0
  132. data/app/controllers/invoices_controller.rb +21 -0
  133. data/app/controllers/notes_controller.rb +34 -0
  134. data/app/controllers/overview_controller.rb +6 -0
  135. data/app/controllers/people_controller.rb +13 -0
  136. data/app/controllers/salaries_controller.rb +46 -0
  137. data/app/controllers/tenants_controller.rb +39 -0
  138. data/app/controllers/users_controller.rb +26 -0
  139. data/app/helpers/application_helper.rb +52 -0
  140. data/app/helpers/booking_helper.rb +10 -0
  141. data/app/helpers/booking_template_helper.rb +17 -0
  142. data/app/helpers/charge_rate_helper.rb +5 -0
  143. data/app/helpers/invoice_helper.rb +9 -0
  144. data/app/helpers/vat_rate_helper.rb +10 -0
  145. data/app/inputs/combobox_input.rb +23 -0
  146. data/app/inputs/date_field_input.rb +5 -0
  147. data/app/inputs/hour_field_input.rb +5 -0
  148. data/app/models/ability.rb +34 -0
  149. data/app/models/attachment.rb +13 -0
  150. data/app/models/booking_import.rb +8 -0
  151. data/app/models/booking_import_observer.rb +7 -0
  152. data/app/models/booking_reference.rb +4 -0
  153. data/app/models/booking_template.rb +92 -0
  154. data/app/models/charge_booking_template.rb +57 -0
  155. data/app/models/charge_rate.rb +30 -0
  156. data/app/models/civil_status.rb +5 -0
  157. data/app/models/company.rb +5 -0
  158. data/app/models/credit_invoice.rb +32 -0
  159. data/app/models/customer.rb +4 -0
  160. data/app/models/debit_invoice.rb +24 -0
  161. data/app/models/employee.rb +6 -0
  162. data/app/models/employment.rb +28 -0
  163. data/app/models/invoice.rb +145 -0
  164. data/app/models/line_item.rb +22 -0
  165. data/app/models/note.rb +8 -0
  166. data/app/models/person.rb +65 -0
  167. data/app/models/product.rb +2 -0
  168. data/app/models/profit.rb +9 -0
  169. data/app/models/religion.rb +5 -0
  170. data/app/models/role.rb +9 -0
  171. data/app/models/salary.rb +93 -0
  172. data/app/models/tenant.rb +43 -0
  173. data/app/models/user.rb +44 -0
  174. data/app/models/vat_rate.rb +11 -0
  175. data/app/uploaders/attachment_uploader.rb +12 -0
  176. data/app/views/account_types/_account_type.html.haml +6 -0
  177. data/app/views/account_types/_form.html.haml +7 -0
  178. data/app/views/account_types/_list.html.haml +7 -0
  179. data/app/views/account_types/index.html.haml +6 -0
  180. data/app/views/account_types/show.html.haml +6 -0
  181. data/app/views/accounts/_account.html.haml +12 -0
  182. data/app/views/accounts/_booking_item.html.haml +15 -0
  183. data/app/views/accounts/_booking_list.html.haml +19 -0
  184. data/app/views/accounts/_booking_list_footer.html.haml +2 -0
  185. data/app/views/accounts/_booking_list_header.html.haml +8 -0
  186. data/app/views/accounts/_booking_list_paginate.html.haml +5 -0
  187. data/app/views/accounts/_booking_list_saldo.html.haml +8 -0
  188. data/app/views/accounts/_booking_list_turnover.html.haml +9 -0
  189. data/app/views/accounts/_carry_booking.html.haml +9 -0
  190. data/app/views/accounts/_form.html.haml +10 -0
  191. data/app/views/accounts/_list_footer.html.haml +2 -0
  192. data/app/views/accounts/_list_header.html.haml +5 -0
  193. data/app/views/accounts/index.html.haml +8 -0
  194. data/app/views/accounts/show.html.haml +10 -0
  195. data/app/views/application/_form.html.haml +7 -0
  196. data/app/views/application/_list.html.haml +15 -0
  197. data/app/views/application/_search_form.html.haml +5 -0
  198. data/app/views/application/_show.html.haml +2 -0
  199. data/app/views/application/create.js.erb +3 -0
  200. data/app/views/application/destroy.js.erb +2 -0
  201. data/app/views/application/edit.html.haml +5 -0
  202. data/app/views/application/edit.js.erb +3 -0
  203. data/app/views/application/index.html.haml +7 -0
  204. data/app/views/application/new.html.haml +5 -0
  205. data/app/views/application/new.js.erb +3 -0
  206. data/app/views/application/show.html.haml +5 -0
  207. data/app/views/application/update.js.erb +3 -0
  208. data/app/views/attachments/_attachment.html.haml +5 -0
  209. data/app/views/attachments/_form.html.haml +15 -0
  210. data/app/views/attachments/_list.html.haml +6 -0
  211. data/app/views/bank_accounts/_bank_account.html.haml +1 -0
  212. data/app/views/booking_imports/_booking_import.html.haml +5 -0
  213. data/app/views/booking_imports/_form.html.haml +6 -0
  214. data/app/views/booking_imports/_list.html.haml +7 -0
  215. data/app/views/booking_imports/create.js.erb +4 -0
  216. data/app/views/booking_imports/index.html.haml +6 -0
  217. data/app/views/booking_imports/show.html.haml +6 -0
  218. data/app/views/booking_templates/_booking_template.html.haml +16 -0
  219. data/app/views/booking_templates/_form.html.haml +12 -0
  220. data/app/views/booking_templates/_list.html.haml +10 -0
  221. data/app/views/booking_templates/index.html.haml +6 -0
  222. data/app/views/bookings/_booking.html.haml +17 -0
  223. data/app/views/bookings/_form.html.haml +14 -0
  224. data/app/views/bookings/_list.html.haml +11 -0
  225. data/app/views/bookings/_new_form.html.haml +8 -0
  226. data/app/views/bookings/_sidebar.html.haml +7 -0
  227. data/app/views/bookings/_simple_form.html.haml +12 -0
  228. data/app/views/bookings/index.html.haml +9 -0
  229. data/app/views/bookings/new.html.haml +8 -0
  230. data/app/views/bookings/select.html.haml +11 -0
  231. data/app/views/bookings/show.html.haml +27 -0
  232. data/app/views/bookings/simple_edit.html.haml +4 -0
  233. data/app/views/charge_booking_templates/_charge_booking_template.html.haml +15 -0
  234. data/app/views/charge_booking_templates/_form.html.haml +12 -0
  235. data/app/views/charge_booking_templates/_list.html.haml +10 -0
  236. data/app/views/charge_rates/_form.html.haml +14 -0
  237. data/app/views/companies/_company.html.haml +5 -0
  238. data/app/views/companies/_form.html.haml +8 -0
  239. data/app/views/companies/_list.html.haml +6 -0
  240. data/app/views/companies/index.html.haml +6 -0
  241. data/app/views/companies/show.html.haml +27 -0
  242. data/app/views/credit_invoices/_credit_invoice.html.haml +9 -0
  243. data/app/views/credit_invoices/_form.html.haml +41 -0
  244. data/app/views/credit_invoices/_list.html.haml +20 -0
  245. data/app/views/credit_invoices/index.html.haml +7 -0
  246. data/app/views/credit_invoices/show.html.haml +56 -0
  247. data/app/views/customers/_customer.html.haml +5 -0
  248. data/app/views/customers/_form.html.haml +8 -0
  249. data/app/views/customers/_list.html.haml +6 -0
  250. data/app/views/customers/index.html.haml +6 -0
  251. data/app/views/customers/show.html.haml +22 -0
  252. data/app/views/debit_invoices/_debit_invoice.html.haml +9 -0
  253. data/app/views/debit_invoices/_form.html.haml +38 -0
  254. data/app/views/debit_invoices/_invoice_body.html.haml +8 -0
  255. data/app/views/debit_invoices/_invoice_info.html.haml +10 -0
  256. data/app/views/debit_invoices/_invoice_parties.html.haml +9 -0
  257. data/app/views/debit_invoices/_list.html.haml +21 -0
  258. data/app/views/debit_invoices/index.html.haml +7 -0
  259. data/app/views/debit_invoices/letter.html.haml +9 -0
  260. data/app/views/debit_invoices/letter.pdf.prawn +57 -0
  261. data/app/views/debit_invoices/show.html.haml +56 -0
  262. data/app/views/devise/confirmations/new.html.haml +10 -0
  263. data/app/views/devise/mailer/confirmation_instructions.html.haml +6 -0
  264. data/app/views/devise/mailer/reset_password_instructions.html.haml +10 -0
  265. data/app/views/devise/mailer/unlock_instructions.html.haml +8 -0
  266. data/app/views/devise/passwords/edit.html.haml +15 -0
  267. data/app/views/devise/passwords/new.html.haml +11 -0
  268. data/app/views/devise/sessions/new.html.haml +13 -0
  269. data/app/views/devise/shared/_links.haml +15 -0
  270. data/app/views/devise/unlocks/new.html.haml +11 -0
  271. data/app/views/direct_bookings/_form.html.haml +12 -0
  272. data/app/views/direct_bookings/_item.html.haml +17 -0
  273. data/app/views/direct_bookings/_list.html.haml +10 -0
  274. data/app/views/direct_bookings/_list_footer.html.haml +6 -0
  275. data/app/views/direct_bookings/_show.html.haml +3 -0
  276. data/app/views/direct_bookings/_show_all.html.haml +8 -0
  277. data/app/views/direct_bookings/list.js.erb +2 -0
  278. data/app/views/direct_bookings/new.js.erb +2 -0
  279. data/app/views/employees/_employee.html.haml +5 -0
  280. data/app/views/employees/_form.html.haml +19 -0
  281. data/app/views/employees/_list.html.haml +6 -0
  282. data/app/views/employees/index.html.haml +6 -0
  283. data/app/views/employees/show.html.haml +31 -0
  284. data/app/views/employments/_employment.html.haml +10 -0
  285. data/app/views/employments/_form.html.haml +24 -0
  286. data/app/views/employments/_list.html.haml +11 -0
  287. data/app/views/employments/_show.html.haml +9 -0
  288. data/app/views/employments/index.html.haml +5 -0
  289. data/app/views/invoices/_form.html.haml +13 -0
  290. data/app/views/invoices/_invoice.html.haml +7 -0
  291. data/app/views/invoices/_list.html.haml +20 -0
  292. data/app/views/invoices/_sidebar.html.haml +11 -0
  293. data/app/views/invoices/index.html.haml +17 -0
  294. data/app/views/invoices/show.html.haml +56 -0
  295. data/app/views/layouts/_flash_new.html.haml +1 -0
  296. data/app/views/layouts/_list_item_actions_for.html.haml +3 -0
  297. data/app/views/layouts/application.html.haml +46 -0
  298. data/app/views/line_items/_form.html.haml +6 -0
  299. data/app/views/line_items/_line_item.html.haml +7 -0
  300. data/app/views/line_items/_list_footer.html.haml +7 -0
  301. data/app/views/notes/_form.html.haml +10 -0
  302. data/app/views/notes/_list.html.haml +15 -0
  303. data/app/views/notes/index.html.haml +9 -0
  304. data/app/views/notes/show.html.haml +12 -0
  305. data/app/views/overview/index.html.haml +14 -0
  306. data/app/views/people/_form.html.haml +8 -0
  307. data/app/views/people/_list.html.haml +7 -0
  308. data/app/views/people/_person.html.haml +6 -0
  309. data/app/views/people/_show.html.haml +6 -0
  310. data/app/views/people/show.html.haml +21 -0
  311. data/app/views/persons/_civil.html.haml +5 -0
  312. data/app/views/persons/_show.html.haml +6 -0
  313. data/app/views/salaries/_form.html.haml +14 -0
  314. data/app/views/salaries/_list.html.haml +12 -0
  315. data/app/views/salaries/_salary.html.haml +10 -0
  316. data/app/views/salaries/_salary_certificate.html.haml +25 -0
  317. data/app/views/salaries/payslip.html.haml +40 -0
  318. data/app/views/salaries/show.html.haml +30 -0
  319. data/app/views/salaries/statistics.html.haml +6 -0
  320. data/app/views/tenants/_account.html.haml +7 -0
  321. data/app/views/tenants/_account_group_sheet.html.haml +8 -0
  322. data/app/views/tenants/_form.html.haml +17 -0
  323. data/app/views/tenants/_list.html.haml +7 -0
  324. data/app/views/tenants/_tenant.html.haml +7 -0
  325. data/app/views/tenants/balance_sheet.html.haml +43 -0
  326. data/app/views/tenants/index.html.haml +6 -0
  327. data/app/views/tenants/new.js.erb +1 -0
  328. data/app/views/tenants/profit_sheet.html.haml +26 -0
  329. data/app/views/tenants/show.html.haml +18 -0
  330. data/app/views/users/_demo.de-CH.html.haml +7 -0
  331. data/app/views/users/_demo.de.html.haml +7 -0
  332. data/app/views/users/_demo.html.haml +7 -0
  333. data/app/views/users/_form.html.haml +17 -0
  334. data/app/views/users/_list.html.haml +9 -0
  335. data/app/views/users/_show.html.haml +13 -0
  336. data/app/views/users/_user.html.haml +7 -0
  337. data/app/views/users/index.html.haml +6 -0
  338. data/app/views/users/new.js.erb +1 -0
  339. data/app/views/users/show.html.haml +14 -0
  340. data/lib/acts_as_csv.rb +113 -0
  341. data/lib/bookyt/engine.rb +18 -0
  342. data/lib/bookyt/version.rb +3 -0
  343. data/lib/float.rb +17 -0
  344. data/lib/pagination_list_link_renderer.rb +63 -0
  345. data/lib/parse_date.rb +27 -0
  346. data/lib/prawn/letter_document.rb +136 -0
  347. data/lib/raiffeisen_importer.rb +15 -0
  348. data/lib/recipes/bookyt.rb +15 -0
  349. data/lib/simple_navigation/renderer/list.rb +20 -0
  350. data/lib/simple_navigation/renderer/overview.rb +46 -0
  351. data/lib/sqlite3_extensions.rb +45 -0
  352. data/lib/tasks/.gitkeep +0 -0
  353. data/lib/tasks/bookyt.rake +15 -0
  354. data/lib/tasks/cucumber.rake +53 -0
  355. data/lib/tasks/environment_seeds.rake +7 -0
  356. data/lib/tasks/users.rake +46 -0
  357. metadata +423 -0
@@ -0,0 +1,92 @@
1
+ class BookingTemplate < ActiveRecord::Base
2
+ # Associations
3
+ belongs_to :debit_account, :foreign_key => 'debit_account_id', :class_name => "Account"
4
+ belongs_to :credit_account, :foreign_key => 'credit_account_id', :class_name => "Account"
5
+
6
+ # Scopes
7
+ scope :by_type, lambda{|value| where("code LIKE ?", value + ':%')}
8
+
9
+ # Standard methods
10
+ def to_s(format = :default)
11
+ case format
12
+ when :short
13
+ "%s / %s CHF %s" % [
14
+ credit_account ? credit_account.to_s(:short) : '?',
15
+ debit_account ? debit_account.to_s(:short) : '?',
16
+ amount ? "%0.2f" % amount.to_f : '?',
17
+ ]
18
+ else
19
+ "%s an %s CHF %s, %s (%s)" % [
20
+ credit_account ? credit_account.to_s : '?',
21
+ debit_account ? debit_account.to_s : '?',
22
+ amount ? "%0.2f" % amount.to_f : '?',
23
+ title.present? ? title : '?',
24
+ comments.present? ? comments : '?'
25
+ ]
26
+ end
27
+ end
28
+
29
+ def booking_parameters(params = {})
30
+ # Prepare parameters set by template
31
+ booking_params = attributes.reject!{|key, value| !["title", "comments", "credit_account_id", "debit_account_id"].include?(key)}
32
+
33
+ # Calculate amount
34
+ booking_amount = BigDecimal.new(attributes['amount'] || '0')
35
+
36
+ params.stringify_keys!
37
+
38
+ # Lookup reference
39
+ reference = params['reference']
40
+ unless reference
41
+ ref_type = params['reference_type']
42
+ ref_id = params['reference_id']
43
+ if ref_type.present? and ref_id.present?
44
+ reference = ref_type.constantize.find(ref_id)
45
+ end
46
+ end
47
+
48
+ if reference
49
+ case self.amount_relates_to
50
+ when 'reference_amount'
51
+ booking_amount *= reference.amount unless reference.amount.nil?
52
+ when 'reference_balance'
53
+ booking_amount *= reference.balance unless reference.balance.nil?
54
+ when 'reference_amount_minus_balance'
55
+ booking_amount *= reference.amount - reference.balance unless (reference.amount.nil? or reference.balance.nil?)
56
+ end
57
+ end
58
+
59
+ booking_amount = booking_amount.try(:round, 2)
60
+ booking_params['amount'] = booking_amount
61
+
62
+ # Override by passed in parameters
63
+ booking_params.merge!(params)
64
+ end
65
+
66
+ # Factory methods
67
+ def build_booking(params = {})
68
+ Booking.new(booking_parameters(params))
69
+ end
70
+
71
+ def create_booking(params = {})
72
+ Booking.create(booking_parameters(params))
73
+ end
74
+
75
+ def self.build_booking(code, params = {})
76
+ find_by_code(code).try(:build_booking, params)
77
+ end
78
+
79
+ def self.create_booking(code, params = {})
80
+ find_by_code(code).try(:create_booking, params)
81
+ end
82
+
83
+ # Importer
84
+ def self.import(struct)
85
+ templates = self.all.inject([]) do |found, template|
86
+ puts "matcher: " + template.matcher
87
+ puts 'text: ' + struct.text
88
+ found << template if not Regexp.new(template.matcher).match(struct.text).eql?nil
89
+ end
90
+ puts templates.inspect
91
+ end
92
+ end
@@ -0,0 +1,57 @@
1
+ class ChargeBookingTemplate < BookingTemplate
2
+ # Charge Rates
3
+ def charge_rate(date = nil, params = {})
4
+ ChargeRate.by_person(params[:person_id]).current(charge_rate_code, date)
5
+ end
6
+
7
+ def amount(date = nil, params = {})
8
+ rate = charge_rate(date, params)
9
+ return 0.0 unless rate
10
+
11
+ if self.amount_relates_to.present?
12
+ return rate.rate / 100
13
+ else
14
+ return rate.rate
15
+ end
16
+ end
17
+
18
+ def booking_parameters(params = {})
19
+ person_id = params.delete(:person_id)
20
+
21
+ # Prepare parameters set by template
22
+ booking_params = attributes.reject!{|key, value| !["title", "comments", "credit_account_id", "debit_account_id"].include?(key)}
23
+
24
+ params.stringify_keys!
25
+
26
+ # Lookup reference
27
+ reference = params['reference']
28
+ unless reference
29
+ ref_type = params['reference_type']
30
+ ref_id = params['reference_id']
31
+ if ref_type.present? and ref_id.present?
32
+ reference = ref_type.constantize.find(ref_id)
33
+ end
34
+ end
35
+
36
+ if reference
37
+ # Calculate amount
38
+ booking_params['value_date'] = reference.value_date
39
+ booking_amount = self.amount(reference.value_date, :person_id => person_id)
40
+
41
+ case self.amount_relates_to
42
+ when 'reference_amount'
43
+ booking_amount *= reference.amount
44
+ when 'reference_balance'
45
+ booking_amount *= reference.balance
46
+ when 'reference_amount_minus_balance'
47
+ booking_amount *= reference.amount - reference.balance
48
+ end
49
+ end
50
+
51
+ booking_amount = booking_amount.try(:round, 2)
52
+ booking_params['amount'] = booking_amount
53
+
54
+ # Override by passed in parameters
55
+ booking_params.merge!(params)
56
+ end
57
+ end
@@ -0,0 +1,30 @@
1
+ class ChargeRate < ActiveRecord::Base
2
+ # String
3
+ def to_s(format = :default)
4
+ case format
5
+ when :long
6
+ from = duration_from.nil? ? "" : I18n::localize(duration_from)
7
+ to = duration_to.nil? ? "" : I18n::localize(duration_to)
8
+ "%s: %.2f (%s - %s)" % [title, rate, from, to]
9
+ else
10
+ "%s: %.2f" % [code, rate]
11
+ end
12
+ end
13
+
14
+ # Sorting
15
+ default_scope order('duration_from DESC')
16
+
17
+ # Validity
18
+ scope :valid_at, lambda {|value| where("duration_from <= :date AND (duration_to IS NULL OR duration_to > :date)", :date => value) }
19
+ scope :valid, lambda { valid_at(Date.today) }
20
+ scope :latest, group(:code, :person_id)
21
+
22
+ def self.current(code, date = nil)
23
+ date ||= Date.today
24
+ valid_at(date).find_by_code(code)
25
+ end
26
+
27
+ # Person
28
+ belongs_to :person
29
+ scope :by_person, lambda {|value| value ? where(:person_id => value) : scoped}
30
+ end
@@ -0,0 +1,5 @@
1
+ class CivilStatus < ActiveRecord::Base
2
+ def to_s
3
+ name
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Company < Person
2
+ # Associations
3
+ has_many :employments, :foreign_key => :employer_id
4
+ has_many :employees, :through => :employments
5
+ end
@@ -0,0 +1,32 @@
1
+ class CreditInvoice < Invoice
2
+ # String
3
+ def to_s(format = :default)
4
+ return "" if amount.nil?
5
+
6
+ identifier = title
7
+ identifier += " / #{code}" if code.present?
8
+
9
+ case format
10
+ when :reference
11
+ return identifier + " (#{company.to_s})"
12
+ when :long
13
+ return "%s: %s für %s à %s" % [I18n::localize(value_date), ident, company, currency_fmt(amount)]
14
+ else
15
+ return identifier
16
+ end
17
+ end
18
+
19
+ # Accounts
20
+ # ========
21
+ def self.direct_account
22
+ Account.find_by_code("2000")
23
+ end
24
+
25
+ def balance_account
26
+ bookings.first.try(:debit_account)
27
+ end
28
+
29
+ def profit_account
30
+ bookings.first.try(:credit_account)
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ class Customer < Person
2
+ # Associations
3
+ has_many :invoices, :order => 'value_date DESC'
4
+ end
@@ -0,0 +1,24 @@
1
+ class DebitInvoice < Invoice
2
+ # Accounts
3
+ # ========
4
+ def self.direct_account
5
+ Account.find_by_code("1100")
6
+ end
7
+
8
+ def balance_account
9
+ bookings.first.try(:credit_account)
10
+ end
11
+
12
+ def profit_account
13
+ bookings.first.try(:debit_account)
14
+ end
15
+
16
+ # Callback hook
17
+ def booking_saved(booking)
18
+ if (self.state != 'canceled') and (self.state != 'reactivated') and (self.amount <= 0.0)
19
+ update_attribute(:state, 'paid')
20
+ elsif !self.overdue? and (self.amount > 0.0)
21
+ update_attribute(:state, 'booked')
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ class Employee < Person
2
+ # Associations
3
+ has_many :employments
4
+ has_many :employers, :through => :employments
5
+ has_many :salaries, :foreign_key => :company_id
6
+ end
@@ -0,0 +1,28 @@
1
+ class Employment < ActiveRecord::Base
2
+ # Associations
3
+ belongs_to :employee
4
+ belongs_to :employer, :class_name => 'Company'
5
+
6
+ # Validations
7
+ validates_presence_of :employee, :employer
8
+ validates_date :duration_from, :duration_to, :allow_nil => true, :allow_blank => true
9
+
10
+ # Validity
11
+ scope :valid_at, lambda {|value| where("duration_from <= :date AND (duration_to IS NULL OR duration_to > :date)", :date => value) }
12
+ scope :valid, lambda { valid_at(Date.today) }
13
+
14
+ def self.current(date = nil)
15
+ date ||= Date.today
16
+ valid_at(date).last
17
+ end
18
+
19
+ # String
20
+ def to_s
21
+ "%s bei %s von %s - %s" % [employee, employer, duration_from, duration_to]
22
+ end
23
+
24
+ # Attachments
25
+ # ===========
26
+ has_many :attachments, :as => :object
27
+ accepts_nested_attributes_for :attachments, :reject_if => proc { |attributes| attributes['file'].blank? }
28
+ end
@@ -0,0 +1,145 @@
1
+ class Invoice < ActiveRecord::Base
2
+ # Aspects
3
+ include ApplicationHelper
4
+
5
+ # Scopes
6
+ default_scope order(:due_date)
7
+ scope :overdue, where("due_date < NOW()")
8
+
9
+ # Associations
10
+ belongs_to :customer, :class_name => 'Person'
11
+ belongs_to :company, :class_name => 'Person'
12
+
13
+ # Validations
14
+ validates_date :due_date, :value_date
15
+ validates_presence_of :customer, :company, :title, :amount, :state
16
+
17
+ # String
18
+ def to_s(format = :default)
19
+ return "" if amount.nil?
20
+
21
+ identifier = title
22
+ identifier += " / #{code}" if code.present?
23
+
24
+ case format
25
+ when :reference
26
+ return identifier + " (#{customer.to_s})"
27
+ when :long
28
+ return "%s: %s für %s à %s" % [I18n::localize(value_date), ident, customer, currency_fmt(amount)]
29
+ else
30
+ return identifier
31
+ end
32
+ end
33
+
34
+ before_save :update_code
35
+ def update_code
36
+ code = value_date.strftime("%y%m")
37
+ code += "%04i" % id
38
+
39
+ self.code = code
40
+ end
41
+
42
+ # Search
43
+ # ======
44
+ scope :by_text, lambda {|value|
45
+ text = '%' + value + '%'
46
+
47
+ amount = value.delete("'").to_f
48
+ if amount == 0.0
49
+ amount = nil unless value.match(/^[0.]*$/)
50
+ end
51
+
52
+ date = nil
53
+ begin
54
+ date = Date.parse(value)
55
+ rescue ArgumentError
56
+ end
57
+
58
+ people = Person.by_name(value)
59
+
60
+ where("title LIKE :text OR code LIKE :text OR remarks LIKE :text OR amount = :amount OR date(value_date) = :date OR date(due_date) = :date OR company_id IN (:people) OR customer_id IN (:people)", :text => text, :amount => amount, :date => date, :people => people)
61
+ }
62
+
63
+ # Attachments
64
+ # ===========
65
+ has_many :attachments, :as => :object
66
+ accepts_nested_attributes_for :attachments, :reject_if => proc { |attributes| attributes['file'].blank? }
67
+
68
+ # States
69
+ # ======
70
+ STATES = ['booked', 'canceled', 'paid', 'reactivated', 'reminded', '2xreminded', '3xreminded', 'encashment', 'written_off']
71
+ scope :by_state, lambda {|value|
72
+ where(:state => value) unless value == 'all'
73
+ }
74
+
75
+ scope :prepared, :conditions => "state = 'prepared'"
76
+ scope :canceled, :conditions => "state = 'canceled'"
77
+ scope :reactivated, :conditions => "state = 'reactivated'"
78
+ scope :active, :conditions => "NOT(state IN ('reactivated', 'canceled'))"
79
+ scope :open, :conditions => "NOT(state IN ('reactivated', 'canceled', 'paid'))"
80
+ scope :overdue, :conditions => ["(state = 'booked' AND due_date < :today) OR (state = 'reminded' AND reminder_due_date < :today) OR (state = '2xreminded' AND second_reminder_due_date < :today)", {:today => Date.today}]
81
+ scope :in_encashment, :conditions => ["state = 'encashment'"]
82
+
83
+ def active
84
+ !(state == 'canceled' or state == 'reactivated' or state == 'written_off')
85
+ end
86
+
87
+ def open
88
+ active and !(state == 'paid')
89
+ end
90
+
91
+ def state_adverb
92
+ I18n.t state, :scope => 'invoice.state'
93
+ end
94
+
95
+ def state_noun
96
+ I18n.t state, :scope => 'invoice.state_noun'
97
+ end
98
+
99
+ def overdue?
100
+ return true if state == 'booked' and due_date < Date.today
101
+ return true if state == 'reminded' and (reminder_due_date.nil? or reminder_due_date < Date.today)
102
+ return true if state == '2xreminded' and (second_reminder_due_date.nil? or second_reminder_due_date < Date.today)
103
+ return true if state == '3xreminded' and (third_reminder_due_date.nil? or third_reminder_due_date < Date.today)
104
+
105
+ return false
106
+ end
107
+
108
+ # Period
109
+ # ======
110
+ scope :active_at, lambda {|value| Invoice.where("date(duration_from) < :date AND date(duration_to) > :date", :date => value)}
111
+
112
+ # Bookings
113
+ # ========
114
+ include HasAccounts::Model
115
+
116
+ # Build booking
117
+ #
118
+ # We pass the value_date to the booking
119
+ def build_booking(params = {}, template_code = nil)
120
+ invoice_params = {:value_date => self.value_date}
121
+ template_code ||= self.class.to_s.underscore + ':invoice'
122
+
123
+ invoice_params.merge!(params)
124
+
125
+ super(invoice_params, template_code)
126
+ end
127
+
128
+ # Line Items
129
+ # ==========
130
+ has_many :line_items, :autosave => true
131
+ accepts_nested_attributes_for :line_items, :allow_destroy => true, :reject_if => proc { |attributes| attributes['quantity'].blank? or attributes['quantity'] == '0' }
132
+
133
+ def amount
134
+ self[:amount] || line_items.sum('times * price').to_f
135
+ end
136
+
137
+ def overdue?
138
+ return true if state == 'booked' and due_date < Date.today
139
+ return true if state == 'reminded' and (reminder_due_date.nil? or reminder_due_date < Date.today)
140
+ return true if state == '2xreminded' and (second_reminder_due_date.nil? or second_reminder_due_date < Date.today)
141
+ return true if state == '3xreminded' and (third_reminder_due_date.nil? or third_reminder_due_date < Date.today)
142
+
143
+ false
144
+ end
145
+ end
@@ -0,0 +1,22 @@
1
+ class LineItem < ActiveRecord::Base
2
+ belongs_to :item, :polymorphic => true
3
+ belongs_to :invoice, :touch => true
4
+
5
+ # Validations
6
+ validate :times, :presence => true, :numericality => true
7
+ validate :price, :presence => true, :numericality => true
8
+ validate :title, :presence => true
9
+
10
+ # Attributes
11
+ def assign_item=(value)
12
+ self.item = value
13
+
14
+ self.price = value.price
15
+ self.title = value.title
16
+ self.code = value.code
17
+ end
18
+
19
+ def total_amount
20
+ times * price.to_f
21
+ end
22
+ end