From: quidame Date: Sat, 14 Dec 2013 14:26:09 +0000 (+0100) Subject: Correction ('reçu' ou 'récépissé' se dit 'receipt' en anglais, et non X-Git-Url: https://nos-oignons.net/gitweb/gestion-adh.git/commitdiff_plain/9cb7fa95bef77a6d1e0888f741c76adc865f1b17?hp=40d3fea530f06817fe90df0a0f7bb3ccd38686e1 Correction ('reçu' ou 'récépissé' se dit 'receipt' en anglais, et non 'reciept'): modification des noms de fichiers et de leur contenu. --- diff --git a/README b/README index 6d03e99..f0eb47e 100644 --- a/README +++ b/README @@ -119,7 +119,7 @@ Ce script a vocation a être executé tous les mois afin que le comité puisse convoquer une assemblée générale extraordinaire, même en cas de défaillance du conseil d'administration. -`create-membership-fee-reciept` +`create-membership-fee-receipt` ------------------------------- Permet de créer un reçu de cotisation pour les membres en faisant @@ -127,12 +127,12 @@ la demande. Exemple d'utilisation : - bin/create-membership-fee-reciept 000042 10,00 + bin/create-membership-fee-receipt 000042 10,00 Cela crééra un reçu pour le membre 000042 pour une cotisation d'un montant de 10,00€. Le reçu est généré sous forme d'un fichier PDF dans -le répertoire spécifié par la variable d'environnement NOS_OIGNONS_RECIEPTS_DIR -(ou le répertoire `reciepts` dans le répertoire courant). +le répertoire spécifié par la variable d'environnement NOS_OIGNONS_RECEIPTS_DIR +(ou le répertoire `receipts` dans le répertoire courant). Il faut créer le répertoire avant utilisation s'il n'existe pas déjà. diff --git a/bin/create-membership-fee-receipt b/bin/create-membership-fee-receipt new file mode 100755 index 0000000..2fa9340 --- /dev/null +++ b/bin/create-membership-fee-receipt @@ -0,0 +1,21 @@ +#!/usr/bin/ruby1.9.1 +#-*- coding: utf-8 -*- + +require 'rubygems' +require 'bundler' +Bundler.setup + +require 'nos_oignons' + +begin + member_id = ARGV[0] + amount = ARGV[1] + unless member_id && amount + $stderr.puts "Usage: #{$PROGRAM_NAME} 000042 10,00" + exit 1 + end + NosOignons.create_membership_fee_receipt!(member_id, amount) +rescue ArgumentError => ex + $stderr.puts "E: #{ex}" + exit 1 +end diff --git a/bin/create-membership-fee-reciept b/bin/create-membership-fee-reciept deleted file mode 100755 index fae26aa..0000000 --- a/bin/create-membership-fee-reciept +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/ruby1.9.1 -#-*- coding: utf-8 -*- - -require 'rubygems' -require 'bundler' -Bundler.setup - -require 'nos_oignons' - -begin - member_id = ARGV[0] - amount = ARGV[1] - unless member_id && amount - $stderr.puts "Usage: #{$PROGRAM_NAME} 000042 10,00" - exit 1 - end - NosOignons.create_membership_fee_reciept!(member_id, amount) -rescue ArgumentError => ex - $stderr.puts "E: #{ex}" - exit 1 -end diff --git a/features/create-membership-fee-receipt.feature b/features/create-membership-fee-receipt.feature new file mode 100644 index 0000000..c3c5736 --- /dev/null +++ b/features/create-membership-fee-receipt.feature @@ -0,0 +1,29 @@ +# language: fr + +Fonctionnalité: générer des reçus pour les cotisations des membres + En tant que membre du C.A. de Nos oignons, j'aimerais pouvoir générer + un reçu de cotisation lorsqu'un·e adhérent·e me le demande. + + Scénario: Création du reçu + Soit une base avec Jane, membre 000001, ayant cotisé le 2013-06-03 + Lorsque j'exécute `create-membership-fee-receipt 000001 10,00` + Alors le fichier "receipt-000001-2013-06-03.pdf" doit avoir été créé avec les reçus + Et il doit contenir le nom et l'adresse de Jane, la date et le montant de la cotisation + + Scénario: Mauvais numéro de membre + Soit une base avec uniquement Jane, membre 000001 + Lorsque j'exécute `create-membership-fee-receipt 000002 10,00` + Alors je dois voir comme erreur "unknown member" + + Scénario: Aucune cotisation + Soit une base avec Jane, membre 000001, n'ayant jamais cotisé + Lorsque j'exécute `create-membership-fee-receipt 000001 10,00` + Alors je dois voir comme erreur "membership fee has not been paid for this year" + + Scénario: Manque le numéro de l'adhésion + Lorsque j'exécute `create-membership-fee-receipt` + Alors je dois voir comme erreur "Usage:" + + Scénario: Manque le montant de l'adhésion + Lorsque j'exécute `create-membership-fee-receipt 000001` + Alors je dois voir comme erreur "Usage:" diff --git a/features/create-membership-fee-reciept.feature b/features/create-membership-fee-reciept.feature deleted file mode 100644 index d21fb71..0000000 --- a/features/create-membership-fee-reciept.feature +++ /dev/null @@ -1,29 +0,0 @@ -# language: fr - -Fonctionnalité: générer des reçus pour les cotisations des membres - En tant que membre du C.A. de Nos oignons, j'aimerais pouvoir générer - un reçu de cotisation lorsqu'un·e adhérent·e me le demande. - - Scénario: Création du reçu - Soit une base avec Jane, membre 000001, ayant cotisé le 2013-06-03 - Lorsque j'exécute `create-membership-fee-reciept 000001 10,00` - Alors le fichier "reciept-000001-2013-06-03.pdf" doit avoir été créé avec les reçus - Et il doit contenir le nom et l'adresse de Jane, la date et le montant de la cotisation - - Scénario: Mauvais numéro de membre - Soit une base avec uniquement Jane, membre 000001 - Lorsque j'exécute `create-membership-fee-reciept 000002 10,00` - Alors je dois voir comme erreur "unknown member" - - Scénario: Aucune cotisation - Soit une base avec Jane, membre 000001, n'ayant jamais cotisé - Lorsque j'exécute `create-membership-fee-reciept 000001 10,00` - Alors je dois voir comme erreur "membership fee has not been paid for this year" - - Scénario: Manque le numéro de l'adhésion - Lorsque j'exécute `create-membership-fee-reciept` - Alors je dois voir comme erreur "Usage:" - - Scénario: Manque le montant de l'adhésion - Lorsque j'exécute `create-membership-fee-reciept 000001` - Alors je dois voir comme erreur "Usage:" diff --git a/features/step_definitions/commands.rb b/features/step_definitions/commands.rb index c9b6f8d..cde2215 100644 --- a/features/step_definitions/commands.rb +++ b/features/step_definitions/commands.rb @@ -29,7 +29,7 @@ When /^j'exécute send\-member\-emails\-to\-advisors$/ do NosOignons.send_member_emails_to_advisors! end -When /^j'exécute `(create\-membership\-fee\-reciept.*)`$/ do |cmd| +When /^j'exécute `(create\-membership\-fee\-receipt.*)`$/ do |cmd| run_simple cmd, false end diff --git a/features/step_definitions/receipts.rb b/features/step_definitions/receipts.rb new file mode 100644 index 0000000..7caa60b --- /dev/null +++ b/features/step_definitions/receipts.rb @@ -0,0 +1,19 @@ +#-*- coding: utf-8 -*- + +Then /^le fichier "(.*)" doit avoir été créé avec les reçus$/ do |filename| + @receipt_path = "#{ENV['NOS_OIGNONS_RECEIPTS_DIR']}/#{filename}" + expect(File.exists?(@receipt_path)).to be_true +end + +Then /^il doit contenir le nom et l'adresse de (\w+), la date et le montant de la cotisation$/ do |name| + # XXX: not nice to hard code that 10,00 + amount = "10,00" + # XXX: not nice to relay that it's the last member either + expect(@last_member['name']).to eql(name) + + content = `pdftotext #{@receipt_path} -`.gsub(/\n/, ' ') + expect(content).to include(@last_member['name']) + expect(content).to include(@last_member['address']) + expect(content).to include(DateTime.strptime(@last_member['membership_fee_paid_on'], "%Y-%m-%d").strftime("%d/%m/%Y")) + expect(content).to include(amount) +end diff --git a/features/step_definitions/reciepts.rb b/features/step_definitions/reciepts.rb deleted file mode 100644 index a3cb48d..0000000 --- a/features/step_definitions/reciepts.rb +++ /dev/null @@ -1,19 +0,0 @@ -#-*- coding: utf-8 -*- - -Then /^le fichier "(.*)" doit avoir été créé avec les reçus$/ do |filename| - @reciept_path = "#{ENV['NOS_OIGNONS_RECIEPTS_DIR']}/#{filename}" - expect(File.exists?(@reciept_path)).to be_true -end - -Then /^il doit contenir le nom et l'adresse de (\w+), la date et le montant de la cotisation$/ do |name| - # XXX: not nice to hard code that 10,00 - amount = "10,00" - # XXX: not nice to relay that it's the last member either - expect(@last_member['name']).to eql(name) - - content = `pdftotext #{@reciept_path} -`.gsub(/\n/, ' ') - expect(content).to include(@last_member['name']) - expect(content).to include(@last_member['address']) - expect(content).to include(DateTime.strptime(@last_member['membership_fee_paid_on'], "%Y-%m-%d").strftime("%d/%m/%Y")) - expect(content).to include(amount) -end diff --git a/features/support/env.rb b/features/support/env.rb index de7fbc5..1d19df7 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -21,11 +21,11 @@ Before do @aruba_timeout_seconds = 20 @orig_wiki_path = ENV['NOS_OIGNONS_BOARD_WIKI_PATH'] @orig_reminder_db_path = ENV['NOS_OIGNONS_REMINDER_DB'] - @orig_reciepts_dir = ENV['NOS_OIGNONS_RECIEPTS_DIR'] + @orig_receipts_dir = ENV['NOS_OIGNONS_RECEIPTS_DIR'] ENV['NOS_OIGNONS_REMINDER_DB'] = File.join(current_dir, 'reminders.yaml') NosOignons::ReminderDb.instance.reload! - ENV['NOS_OIGNONS_RECIEPTS_DIR'] = File.join(current_dir, 'reciepts') - FileUtils.mkdir(ENV['NOS_OIGNONS_RECIEPTS_DIR']) + ENV['NOS_OIGNONS_RECEIPTS_DIR'] = File.join(current_dir, 'receipts') + FileUtils.mkdir(ENV['NOS_OIGNONS_RECEIPTS_DIR']) Mail.defaults do delivery_method :test end @@ -35,6 +35,6 @@ end After do ENV['NOS_OIGNONS_REMINDER_DB'] = @orig_reminder_db_path ENV['NOS_OIGNONS_BOARD_WIKI_PATH'] = @orig_wiki_path - ENV['NOS_OIGNONS_RECIEPTS_DIR'] = @orig_reciepts_dir + ENV['NOS_OIGNONS_RECEIPTS_DIR'] = @orig_receipts_dir FileUtils.remove_entry_secure @tmpdir end diff --git a/lib/nos_oignons.rb b/lib/nos_oignons.rb index 0f68c7c..66116bf 100644 --- a/lib/nos_oignons.rb +++ b/lib/nos_oignons.rb @@ -26,9 +26,9 @@ module NosOignons # The following class methods are all meant to be called as command-line scripts class << self - def create_membership_fee_reciept!(member_id, amount) + def create_membership_fee_receipt!(member_id, amount) member = NosOignons::Member.new(member_id) - member.create_reciept!(amount) + member.create_receipt!(amount) end def list_emails! diff --git a/lib/nos_oignons/member.rb b/lib/nos_oignons/member.rb index 4073cc4..4bf23ca 100644 --- a/lib/nos_oignons/member.rb +++ b/lib/nos_oignons/member.rb @@ -104,11 +104,11 @@ module NosOignons ReminderDb.instance.last_reminder(self) end - def create_reciept!(amount) - require 'nos_oignons/reciept' + def create_receipt!(amount) + require 'nos_oignons/receipt' - reciept = Reciept.new(self, amount) - reciept.create! + receipt = Receipt.new(self, amount) + receipt.create! end end end diff --git a/lib/nos_oignons/receipt.rb b/lib/nos_oignons/receipt.rb new file mode 100644 index 0000000..87869f7 --- /dev/null +++ b/lib/nos_oignons/receipt.rb @@ -0,0 +1,109 @@ +#-*- coding: utf-8 -*- + +require 'prawn' +require 'prawn/measurement_extensions' + +module NosOignons + class Receipt + attr_reader :member, :amount + + def initialize(member, amount) + @member = member + unless member.up_to_date? + raise ArgumentError.new("membership fee has not been paid for this year") + end + @amount = amount + @now = Time.now + end + + def filename + dir = ENV['NOS_OIGNONS_RECEIPTS_DIR'] || 'receipts' + "#{dir}/receipt-#{@member.member_id}-#{@member.membership_fee_paid_on.strftime("%Y-%m-%d")}.pdf" + end + + WINDOW_LEFT = 110.mm + WINDOW_TOP = 50.mm + WINDOW_RIGHT = 25.mm + WINDOW_BOTTOM = 80.mm + WINDOW_WIDTH = 85.mm + BODY_LEFT = 25.mm + BODY_WIDTH = 210.mm - (BODY_LEFT * 2) + FOOTER_HEIGHT = 25.mm + DARK_LOGO_COLOR = '57075f' + FONT_PATH = File.expand_path("../../../share/fonts/OpenSans/OpenSans.ttf", __FILE__) + LOGO_PATH = File.expand_path("../../../share/images/nos-oignons.png", __FILE__) + + def generate_header(pdf) + header_height = pdf.bounds.height / 6 + pdf.bounding_box([0, pdf.cursor], :width => pdf.bounds.width, :height => header_height) do + logo_width = 2 * pdf.bounds.width / 3 + pdf.bounding_box([0, pdf.bounds.top], :width => logo_width, :height => pdf.bounds.height) do + pdf.image LOGO_PATH, :width => pdf.bounds.width, :align => :center, :vposition => :center + end + pdf.bounding_box([logo_width, pdf.bounds.top], :width => pdf.bounds.width / 3, :height => pdf.bounds.height) do + pdf.text 'Nœuds de sortie Tor financés par la communauté', :align => :center, :valign => :center + end + end + pdf.bounding_box([WINDOW_LEFT - pdf.bounds.absolute_left, pdf.bounds.absolute_top - WINDOW_TOP], :width => WINDOW_WIDTH, :height => WINDOW_BOTTOM - WINDOW_TOP) do + pdf.text member.name + "\n" + member.address, :valign => :bottom + end + end + + def generate_body(pdf) + body_height = pdf.cursor - (pdf.bounds.height / 6) + pdf.move_down 30 + pdf.bounding_box([BODY_LEFT, pdf.cursor], :width => BODY_WIDTH, :height => body_height) do + pdf.font_size(16) do + pdf.pad(25) do + pdf.text "Objet : reçu de cotisation" + end + margin = pdf.bounds.width / 6 + pdf.pad_bottom(30) do + pdf.bounding_box([WINDOW_LEFT - pdf.bounds.absolute_left, pdf.cursor], :width => WINDOW_WIDTH) do + pdf.text "Le #{@now.strftime("%d/%m/%Y")}" + end + end + pdf.text <<-EOT.gsub(/^ /, '').gsub(/\n/, ' ') + Nous avons bien enregistré la cotisation annuelle de #{member.name} + à l'association Nos oignons reçue à la date du + #{member.membership_fee_paid_on.strftime("%d/%m/%Y")} pour un montant + de #{amount}€. + EOT + pdf.pad_top(30) do + pdf.bounding_box([margin, pdf.cursor], :width => 5 * margin) do + pdf.text "Le Conseil d'Administration" + end + end + end + end + end + + def generate_footer(pdf) + pdf.bounding_box([0, FOOTER_HEIGHT + pdf.bounds.bottom], :width => pdf.bounds.width, :height => FOOTER_HEIGHT) do + pdf.pad_bottom(5) do + pdf.stroke_color DARK_LOGO_COLOR + pdf.dash 5 + pdf.stroke_horizontal_rule + end + pdf.font_size(10) do + pdf.column_box([0, pdf.cursor], :width => pdf.bounds.width, :columns => 2) do + pdf.text NosOignons::CONTACT_INFO, :align => :center, :valign => :center + pdf.bounds.move_past_bottom + pdf.text NosOignons::POSTAL_ADDRESS, :align => :center, :valign => :center + end + end + end + end + + def create! + raise "File exists!" if File.exists?(filename) + Prawn::Document.generate(filename) do |pdf| + pdf.font(FONT_PATH) do + generate_header(pdf) + generate_body(pdf) + generate_footer(pdf) + end + end + end + end +end diff --git a/lib/nos_oignons/reciept.rb b/lib/nos_oignons/reciept.rb deleted file mode 100644 index 24948b5..0000000 --- a/lib/nos_oignons/reciept.rb +++ /dev/null @@ -1,109 +0,0 @@ -#-*- coding: utf-8 -*- - -require 'prawn' -require 'prawn/measurement_extensions' - -module NosOignons - class Reciept - attr_reader :member, :amount - - def initialize(member, amount) - @member = member - unless member.up_to_date? - raise ArgumentError.new("membership fee has not been paid for this year") - end - @amount = amount - @now = Time.now - end - - def filename - dir = ENV['NOS_OIGNONS_RECIEPTS_DIR'] || 'reciepts' - "#{dir}/reciept-#{@member.member_id}-#{@member.membership_fee_paid_on.strftime("%Y-%m-%d")}.pdf" - end - - WINDOW_LEFT = 110.mm - WINDOW_TOP = 50.mm - WINDOW_RIGHT = 25.mm - WINDOW_BOTTOM = 80.mm - WINDOW_WIDTH = 85.mm - BODY_LEFT = 25.mm - BODY_WIDTH = 210.mm - (BODY_LEFT * 2) - FOOTER_HEIGHT = 25.mm - DARK_LOGO_COLOR = '57075f' - FONT_PATH = File.expand_path("../../../share/fonts/OpenSans/OpenSans.ttf", __FILE__) - LOGO_PATH = File.expand_path("../../../share/images/nos-oignons.png", __FILE__) - - def generate_header(pdf) - header_height = pdf.bounds.height / 6 - pdf.bounding_box([0, pdf.cursor], :width => pdf.bounds.width, :height => header_height) do - logo_width = 2 * pdf.bounds.width / 3 - pdf.bounding_box([0, pdf.bounds.top], :width => logo_width, :height => pdf.bounds.height) do - pdf.image LOGO_PATH, :width => pdf.bounds.width, :align => :center, :vposition => :center - end - pdf.bounding_box([logo_width, pdf.bounds.top], :width => pdf.bounds.width / 3, :height => pdf.bounds.height) do - pdf.text 'Nœuds de sortie Tor financés par la communauté', :align => :center, :valign => :center - end - end - pdf.bounding_box([WINDOW_LEFT - pdf.bounds.absolute_left, pdf.bounds.absolute_top - WINDOW_TOP], :width => WINDOW_WIDTH, :height => WINDOW_BOTTOM - WINDOW_TOP) do - pdf.text member.name + "\n" + member.address, :valign => :bottom - end - end - - def generate_body(pdf) - body_height = pdf.cursor - (pdf.bounds.height / 6) - pdf.move_down 30 - pdf.bounding_box([BODY_LEFT, pdf.cursor], :width => BODY_WIDTH, :height => body_height) do - pdf.font_size(16) do - pdf.pad(25) do - pdf.text "Objet : reçu de cotisation" - end - margin = pdf.bounds.width / 6 - pdf.pad_bottom(30) do - pdf.bounding_box([WINDOW_LEFT - pdf.bounds.absolute_left, pdf.cursor], :width => WINDOW_WIDTH) do - pdf.text "Le #{@now.strftime("%d/%m/%Y")}" - end - end - pdf.text <<-EOT.gsub(/^ /, '').gsub(/\n/, ' ') - Nous avons bien enregistré la cotisation annuelle de #{member.name} - à l'association Nos oignons reçue à la date du - #{member.membership_fee_paid_on.strftime("%d/%m/%Y")} pour un montant - de #{amount}€. - EOT - pdf.pad_top(30) do - pdf.bounding_box([margin, pdf.cursor], :width => 5 * margin) do - pdf.text "Le Conseil d'Administration" - end - end - end - end - end - - def generate_footer(pdf) - pdf.bounding_box([0, FOOTER_HEIGHT + pdf.bounds.bottom], :width => pdf.bounds.width, :height => FOOTER_HEIGHT) do - pdf.pad_bottom(5) do - pdf.stroke_color DARK_LOGO_COLOR - pdf.dash 5 - pdf.stroke_horizontal_rule - end - pdf.font_size(10) do - pdf.column_box([0, pdf.cursor], :width => pdf.bounds.width, :columns => 2) do - pdf.text NosOignons::CONTACT_INFO, :align => :center, :valign => :center - pdf.bounds.move_past_bottom - pdf.text NosOignons::POSTAL_ADDRESS, :align => :center, :valign => :center - end - end - end - end - - def create! - raise "File exists!" if File.exists?(filename) - Prawn::Document.generate(filename) do |pdf| - pdf.font(FONT_PATH) do - generate_header(pdf) - generate_body(pdf) - generate_footer(pdf) - end - end - end - end -end