bookyt 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/images/16x16/add.png +0 -0
- data/app/assets/images/16x16/alert.png +0 -0
- data/app/assets/images/16x16/combolink.png +0 -0
- data/app/assets/images/16x16/copy.png +0 -0
- data/app/assets/images/16x16/delete.png +0 -0
- data/app/assets/images/16x16/edit.png +0 -0
- data/app/assets/images/16x16/filter.png +0 -0
- data/app/assets/images/16x16/index.png +0 -0
- data/app/assets/images/16x16/notice.png +0 -0
- data/app/assets/images/16x16/pdf.png +0 -0
- data/app/assets/images/16x16/print.png +0 -0
- data/app/assets/images/16x16/show.png +0 -0
- data/app/assets/images/22x22/arrow-right.png +0 -0
- data/app/assets/images/22x22/edit.png +0 -0
- data/app/assets/images/22x22/insert_booking.png +0 -0
- data/app/assets/images/22x22/remove.png +0 -0
- data/app/assets/images/32x32/edit.png +0 -0
- data/app/assets/images/32x32/remove.png +0 -0
- data/app/assets/images/48x48/accounting.png +0 -0
- data/app/assets/images/48x48/basic_claims_data.png +0 -0
- data/app/assets/images/48x48/contacts.png +0 -0
- data/app/assets/images/48x48/invoicing.png +0 -0
- data/app/assets/images/48x48/nav_users.png +0 -0
- data/app/assets/images/48x48/settings.png +0 -0
- data/app/assets/images/48x48/store.png +0 -0
- data/app/assets/images/button_bg.png +0 -0
- data/app/assets/images/crystal-icons/16x16/filter.png +0 -0
- data/app/assets/images/down.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/flavour-extended/48x48/invoice.png +0 -0
- data/app/assets/images/free-business-desktop-icons/48x48/business.png +0 -0
- data/app/assets/images/gnome-web-icons/48x48/Gnome-X-Office-Address-Book-48.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_glass_75_759fcf_1x400.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_glass_85_aeb9cf_1x400.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_gloss-wave_55_aeb9cf_500x100.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_inset-hard_100_759fcf_1x100.png +0 -0
- data/app/assets/images/jquery-ui/ui-bg_inset-hard_100_f6f6f6_1x100.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_217bc0_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_469bdd_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_6da8d5_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_d8e7f3_256x240.png +0 -0
- data/app/assets/images/jquery-ui/ui-icons_f9bd01_256x240.png +0 -0
- data/app/assets/images/jquery/tooltip/black_arrow.png +0 -0
- data/app/assets/images/letter-logo.alpha.png +0 -0
- data/app/assets/images/letter-logo.big.png +0 -0
- data/app/assets/images/letter-logo.orig.png +0 -0
- data/app/assets/images/letter-logo.png +0 -0
- data/app/assets/images/loading.gif +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/application-pdf.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/document-preview.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/document-print.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/edit-copy.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/go-next.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/mail-mark-notjunk.png +0 -0
- data/app/assets/images/oxygen-icons/16x16/status_unknown.png +0 -0
- data/app/assets/images/oxygen-icons/48x48/system-users.png +0 -0
- data/app/assets/images/rails.png +0 -0
- data/app/assets/images/up.png +0 -0
- data/app/assets/javascripts/application.js +49 -0
- data/app/assets/javascripts/cyt.js +86 -0
- data/app/assets/javascripts/jquery-ui.js +11437 -0
- data/app/assets/javascripts/jquery.dirtyform.js +242 -0
- data/app/assets/javascripts/jquery.form.js +785 -0
- data/app/assets/javascripts/jquery.js +8936 -0
- data/app/assets/javascripts/jquery.meio.mask.js +683 -0
- data/app/assets/javascripts/jquery.remotipart.js +46 -0
- data/app/assets/javascripts/jquery.ui.combobox.js +77 -0
- data/app/assets/javascripts/jquery_ujs.js +316 -0
- data/app/assets/javascripts/nested_form.js +51 -0
- data/app/assets/javascripts/tooltip.js +343 -0
- data/app/assets/stylesheets/.gitkeep +0 -0
- data/app/assets/stylesheets/ie.scss +16 -0
- data/app/assets/stylesheets/ie6.scss +4 -0
- data/app/assets/stylesheets/partials/_base.sass +39 -0
- data/app/assets/stylesheets/partials/_content.sass +60 -0
- data/app/assets/stylesheets/partials/_jquery.sass +2 -0
- data/app/assets/stylesheets/partials/_layout.sass +21 -0
- data/app/assets/stylesheets/partials/_sidebar.sass +5 -0
- data/app/assets/stylesheets/partials/content/_accounting.sass +41 -0
- data/app/assets/stylesheets/partials/content/_ajax_indicator.sass +28 -0
- data/app/assets/stylesheets/partials/content/_app.sass +43 -0
- data/app/assets/stylesheets/partials/content/_combobox.sass +8 -0
- data/app/assets/stylesheets/partials/content/_cyt.sass +200 -0
- data/app/assets/stylesheets/partials/content/_fancy_buttons.sass +10 -0
- data/app/assets/stylesheets/partials/content/_flash_errors.sass +46 -0
- data/app/assets/stylesheets/partials/content/_form_view.sass +20 -0
- data/app/assets/stylesheets/partials/content/_icons.sass +35 -0
- data/app/assets/stylesheets/partials/content/_invoice.sass +6 -0
- data/app/assets/stylesheets/partials/content/_overview.sass +40 -0
- data/app/assets/stylesheets/partials/content/_pagination.sass +61 -0
- data/app/assets/stylesheets/partials/content/_person.sass +5 -0
- data/app/assets/stylesheets/partials/content/_scaffold.sass +67 -0
- data/app/assets/stylesheets/partials/content/_table_list.sass +26 -0
- data/app/assets/stylesheets/partials/content/formtastic/_formtastic.sass +201 -0
- data/app/assets/stylesheets/partials/content/formtastic/_formtastic_cyt.sass +90 -0
- data/app/assets/stylesheets/partials/formtastic/_custom_fields.sass +2 -0
- data/app/assets/stylesheets/partials/formtastic/_formtastic_base.sass +652 -0
- data/app/assets/stylesheets/partials/jquery/_jquery_ui.sass +1461 -0
- data/app/assets/stylesheets/partials/jquery/_tooltip.sass +21 -0
- data/app/assets/stylesheets/partials/layout/_header.sass +29 -0
- data/app/assets/stylesheets/partials/layout/_navigation.sass +2 -0
- data/app/assets/stylesheets/partials/layout/navigation/_main.sass +34 -0
- data/app/assets/stylesheets/partials/layout/navigation/_sidebar.sass +18 -0
- data/app/assets/stylesheets/partials/print/_app.sass +21 -0
- data/app/assets/stylesheets/partials/print/_layout.sass +24 -0
- data/app/assets/stylesheets/print.scss +5 -0
- data/app/assets/stylesheets/screen.scss +12 -0
- data/app/controllers/account_types_controller.rb +2 -0
- data/app/controllers/accounts_controller.rb +30 -0
- data/app/controllers/application_controller.rb +12 -0
- data/app/controllers/attachments_controller.rb +15 -0
- data/app/controllers/authorized_controller.rb +24 -0
- data/app/controllers/bank_accounts_controller.rb +2 -0
- data/app/controllers/booking_imports_controller.rb +2 -0
- data/app/controllers/booking_templates_controller.rb +8 -0
- data/app/controllers/bookings_controller.rb +64 -0
- data/app/controllers/charge_booking_templates_controller.rb +2 -0
- data/app/controllers/charge_rates_controller.rb +2 -0
- data/app/controllers/companies_controller.rb +8 -0
- data/app/controllers/credit_invoices_controller.rb +29 -0
- data/app/controllers/customers_controller.rb +12 -0
- data/app/controllers/debit_invoices_controller.rb +43 -0
- data/app/controllers/direct_bookings_controller.rb +17 -0
- data/app/controllers/employees_controller.rb +3 -0
- data/app/controllers/employments_controller.rb +2 -0
- data/app/controllers/invoices_controller.rb +21 -0
- data/app/controllers/notes_controller.rb +34 -0
- data/app/controllers/overview_controller.rb +6 -0
- data/app/controllers/people_controller.rb +13 -0
- data/app/controllers/salaries_controller.rb +46 -0
- data/app/controllers/tenants_controller.rb +39 -0
- data/app/controllers/users_controller.rb +26 -0
- data/app/helpers/application_helper.rb +52 -0
- data/app/helpers/booking_helper.rb +10 -0
- data/app/helpers/booking_template_helper.rb +17 -0
- data/app/helpers/charge_rate_helper.rb +5 -0
- data/app/helpers/invoice_helper.rb +9 -0
- data/app/helpers/vat_rate_helper.rb +10 -0
- data/app/inputs/combobox_input.rb +23 -0
- data/app/inputs/date_field_input.rb +5 -0
- data/app/inputs/hour_field_input.rb +5 -0
- data/app/models/ability.rb +34 -0
- data/app/models/attachment.rb +13 -0
- data/app/models/booking_import.rb +8 -0
- data/app/models/booking_import_observer.rb +7 -0
- data/app/models/booking_reference.rb +4 -0
- data/app/models/booking_template.rb +92 -0
- data/app/models/charge_booking_template.rb +57 -0
- data/app/models/charge_rate.rb +30 -0
- data/app/models/civil_status.rb +5 -0
- data/app/models/company.rb +5 -0
- data/app/models/credit_invoice.rb +32 -0
- data/app/models/customer.rb +4 -0
- data/app/models/debit_invoice.rb +24 -0
- data/app/models/employee.rb +6 -0
- data/app/models/employment.rb +28 -0
- data/app/models/invoice.rb +145 -0
- data/app/models/line_item.rb +22 -0
- data/app/models/note.rb +8 -0
- data/app/models/person.rb +65 -0
- data/app/models/product.rb +2 -0
- data/app/models/profit.rb +9 -0
- data/app/models/religion.rb +5 -0
- data/app/models/role.rb +9 -0
- data/app/models/salary.rb +93 -0
- data/app/models/tenant.rb +43 -0
- data/app/models/user.rb +44 -0
- data/app/models/vat_rate.rb +11 -0
- data/app/uploaders/attachment_uploader.rb +12 -0
- data/app/views/account_types/_account_type.html.haml +6 -0
- data/app/views/account_types/_form.html.haml +7 -0
- data/app/views/account_types/_list.html.haml +7 -0
- data/app/views/account_types/index.html.haml +6 -0
- data/app/views/account_types/show.html.haml +6 -0
- data/app/views/accounts/_account.html.haml +12 -0
- data/app/views/accounts/_booking_item.html.haml +15 -0
- data/app/views/accounts/_booking_list.html.haml +19 -0
- data/app/views/accounts/_booking_list_footer.html.haml +2 -0
- data/app/views/accounts/_booking_list_header.html.haml +8 -0
- data/app/views/accounts/_booking_list_paginate.html.haml +5 -0
- data/app/views/accounts/_booking_list_saldo.html.haml +8 -0
- data/app/views/accounts/_booking_list_turnover.html.haml +9 -0
- data/app/views/accounts/_carry_booking.html.haml +9 -0
- data/app/views/accounts/_form.html.haml +10 -0
- data/app/views/accounts/_list_footer.html.haml +2 -0
- data/app/views/accounts/_list_header.html.haml +5 -0
- data/app/views/accounts/index.html.haml +8 -0
- data/app/views/accounts/show.html.haml +10 -0
- data/app/views/application/_form.html.haml +7 -0
- data/app/views/application/_list.html.haml +15 -0
- data/app/views/application/_search_form.html.haml +5 -0
- data/app/views/application/_show.html.haml +2 -0
- data/app/views/application/create.js.erb +3 -0
- data/app/views/application/destroy.js.erb +2 -0
- data/app/views/application/edit.html.haml +5 -0
- data/app/views/application/edit.js.erb +3 -0
- data/app/views/application/index.html.haml +7 -0
- data/app/views/application/new.html.haml +5 -0
- data/app/views/application/new.js.erb +3 -0
- data/app/views/application/show.html.haml +5 -0
- data/app/views/application/update.js.erb +3 -0
- data/app/views/attachments/_attachment.html.haml +5 -0
- data/app/views/attachments/_form.html.haml +15 -0
- data/app/views/attachments/_list.html.haml +6 -0
- data/app/views/bank_accounts/_bank_account.html.haml +1 -0
- data/app/views/booking_imports/_booking_import.html.haml +5 -0
- data/app/views/booking_imports/_form.html.haml +6 -0
- data/app/views/booking_imports/_list.html.haml +7 -0
- data/app/views/booking_imports/create.js.erb +4 -0
- data/app/views/booking_imports/index.html.haml +6 -0
- data/app/views/booking_imports/show.html.haml +6 -0
- data/app/views/booking_templates/_booking_template.html.haml +16 -0
- data/app/views/booking_templates/_form.html.haml +12 -0
- data/app/views/booking_templates/_list.html.haml +10 -0
- data/app/views/booking_templates/index.html.haml +6 -0
- data/app/views/bookings/_booking.html.haml +17 -0
- data/app/views/bookings/_form.html.haml +14 -0
- data/app/views/bookings/_list.html.haml +11 -0
- data/app/views/bookings/_new_form.html.haml +8 -0
- data/app/views/bookings/_sidebar.html.haml +7 -0
- data/app/views/bookings/_simple_form.html.haml +12 -0
- data/app/views/bookings/index.html.haml +9 -0
- data/app/views/bookings/new.html.haml +8 -0
- data/app/views/bookings/select.html.haml +11 -0
- data/app/views/bookings/show.html.haml +27 -0
- data/app/views/bookings/simple_edit.html.haml +4 -0
- data/app/views/charge_booking_templates/_charge_booking_template.html.haml +15 -0
- data/app/views/charge_booking_templates/_form.html.haml +12 -0
- data/app/views/charge_booking_templates/_list.html.haml +10 -0
- data/app/views/charge_rates/_form.html.haml +14 -0
- data/app/views/companies/_company.html.haml +5 -0
- data/app/views/companies/_form.html.haml +8 -0
- data/app/views/companies/_list.html.haml +6 -0
- data/app/views/companies/index.html.haml +6 -0
- data/app/views/companies/show.html.haml +27 -0
- data/app/views/credit_invoices/_credit_invoice.html.haml +9 -0
- data/app/views/credit_invoices/_form.html.haml +41 -0
- data/app/views/credit_invoices/_list.html.haml +20 -0
- data/app/views/credit_invoices/index.html.haml +7 -0
- data/app/views/credit_invoices/show.html.haml +56 -0
- data/app/views/customers/_customer.html.haml +5 -0
- data/app/views/customers/_form.html.haml +8 -0
- data/app/views/customers/_list.html.haml +6 -0
- data/app/views/customers/index.html.haml +6 -0
- data/app/views/customers/show.html.haml +22 -0
- data/app/views/debit_invoices/_debit_invoice.html.haml +9 -0
- data/app/views/debit_invoices/_form.html.haml +38 -0
- data/app/views/debit_invoices/_invoice_body.html.haml +8 -0
- data/app/views/debit_invoices/_invoice_info.html.haml +10 -0
- data/app/views/debit_invoices/_invoice_parties.html.haml +9 -0
- data/app/views/debit_invoices/_list.html.haml +21 -0
- data/app/views/debit_invoices/index.html.haml +7 -0
- data/app/views/debit_invoices/letter.html.haml +9 -0
- data/app/views/debit_invoices/letter.pdf.prawn +57 -0
- data/app/views/debit_invoices/show.html.haml +56 -0
- data/app/views/devise/confirmations/new.html.haml +10 -0
- data/app/views/devise/mailer/confirmation_instructions.html.haml +6 -0
- data/app/views/devise/mailer/reset_password_instructions.html.haml +10 -0
- data/app/views/devise/mailer/unlock_instructions.html.haml +8 -0
- data/app/views/devise/passwords/edit.html.haml +15 -0
- data/app/views/devise/passwords/new.html.haml +11 -0
- data/app/views/devise/sessions/new.html.haml +13 -0
- data/app/views/devise/shared/_links.haml +15 -0
- data/app/views/devise/unlocks/new.html.haml +11 -0
- data/app/views/direct_bookings/_form.html.haml +12 -0
- data/app/views/direct_bookings/_item.html.haml +17 -0
- data/app/views/direct_bookings/_list.html.haml +10 -0
- data/app/views/direct_bookings/_list_footer.html.haml +6 -0
- data/app/views/direct_bookings/_show.html.haml +3 -0
- data/app/views/direct_bookings/_show_all.html.haml +8 -0
- data/app/views/direct_bookings/list.js.erb +2 -0
- data/app/views/direct_bookings/new.js.erb +2 -0
- data/app/views/employees/_employee.html.haml +5 -0
- data/app/views/employees/_form.html.haml +19 -0
- data/app/views/employees/_list.html.haml +6 -0
- data/app/views/employees/index.html.haml +6 -0
- data/app/views/employees/show.html.haml +31 -0
- data/app/views/employments/_employment.html.haml +10 -0
- data/app/views/employments/_form.html.haml +24 -0
- data/app/views/employments/_list.html.haml +11 -0
- data/app/views/employments/_show.html.haml +9 -0
- data/app/views/employments/index.html.haml +5 -0
- data/app/views/invoices/_form.html.haml +13 -0
- data/app/views/invoices/_invoice.html.haml +7 -0
- data/app/views/invoices/_list.html.haml +20 -0
- data/app/views/invoices/_sidebar.html.haml +11 -0
- data/app/views/invoices/index.html.haml +17 -0
- data/app/views/invoices/show.html.haml +56 -0
- data/app/views/layouts/_flash_new.html.haml +1 -0
- data/app/views/layouts/_list_item_actions_for.html.haml +3 -0
- data/app/views/layouts/application.html.haml +46 -0
- data/app/views/line_items/_form.html.haml +6 -0
- data/app/views/line_items/_line_item.html.haml +7 -0
- data/app/views/line_items/_list_footer.html.haml +7 -0
- data/app/views/notes/_form.html.haml +10 -0
- data/app/views/notes/_list.html.haml +15 -0
- data/app/views/notes/index.html.haml +9 -0
- data/app/views/notes/show.html.haml +12 -0
- data/app/views/overview/index.html.haml +14 -0
- data/app/views/people/_form.html.haml +8 -0
- data/app/views/people/_list.html.haml +7 -0
- data/app/views/people/_person.html.haml +6 -0
- data/app/views/people/_show.html.haml +6 -0
- data/app/views/people/show.html.haml +21 -0
- data/app/views/persons/_civil.html.haml +5 -0
- data/app/views/persons/_show.html.haml +6 -0
- data/app/views/salaries/_form.html.haml +14 -0
- data/app/views/salaries/_list.html.haml +12 -0
- data/app/views/salaries/_salary.html.haml +10 -0
- data/app/views/salaries/_salary_certificate.html.haml +25 -0
- data/app/views/salaries/payslip.html.haml +40 -0
- data/app/views/salaries/show.html.haml +30 -0
- data/app/views/salaries/statistics.html.haml +6 -0
- data/app/views/tenants/_account.html.haml +7 -0
- data/app/views/tenants/_account_group_sheet.html.haml +8 -0
- data/app/views/tenants/_form.html.haml +17 -0
- data/app/views/tenants/_list.html.haml +7 -0
- data/app/views/tenants/_tenant.html.haml +7 -0
- data/app/views/tenants/balance_sheet.html.haml +43 -0
- data/app/views/tenants/index.html.haml +6 -0
- data/app/views/tenants/new.js.erb +1 -0
- data/app/views/tenants/profit_sheet.html.haml +26 -0
- data/app/views/tenants/show.html.haml +18 -0
- data/app/views/users/_demo.de-CH.html.haml +7 -0
- data/app/views/users/_demo.de.html.haml +7 -0
- data/app/views/users/_demo.html.haml +7 -0
- data/app/views/users/_form.html.haml +17 -0
- data/app/views/users/_list.html.haml +9 -0
- data/app/views/users/_show.html.haml +13 -0
- data/app/views/users/_user.html.haml +7 -0
- data/app/views/users/index.html.haml +6 -0
- data/app/views/users/new.js.erb +1 -0
- data/app/views/users/show.html.haml +14 -0
- data/lib/acts_as_csv.rb +113 -0
- data/lib/bookyt/engine.rb +18 -0
- data/lib/bookyt/version.rb +3 -0
- data/lib/float.rb +17 -0
- data/lib/pagination_list_link_renderer.rb +63 -0
- data/lib/parse_date.rb +27 -0
- data/lib/prawn/letter_document.rb +136 -0
- data/lib/raiffeisen_importer.rb +15 -0
- data/lib/recipes/bookyt.rb +15 -0
- data/lib/simple_navigation/renderer/list.rb +20 -0
- data/lib/simple_navigation/renderer/overview.rb +46 -0
- data/lib/sqlite3_extensions.rb +45 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/bookyt.rake +15 -0
- data/lib/tasks/cucumber.rake +53 -0
- data/lib/tasks/environment_seeds.rake +7 -0
- data/lib/tasks/users.rake +46 -0
- 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,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,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,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
|