hitobito / hitobito_die_mitte

A hitobito wagon defining the organization hierarchy and additional features for Die Mitte Schweiz.
Other
2 stars 1 forks source link

EXPORT: Einmaliger Export für in puncto Versand #167

Closed olibrian closed 3 years ago

olibrian commented 3 years ago

Für den Versand des Magazins "in puncto" braucht die Mitte einen einmaligen Export für die Druckerei. Die Mitte erfasst ein Abo und erstellt eine Rechnung. Daten von dieser Sammelrechnungen sollen exportiert werden.

Ein Export, kombiniert aus den Tabellen Personen und Rechnungen mit folgenden Attribute

Rechnung

Person

Von der Person im Haushalt:

Ergänzung:

Mockup

hier folgt ein Mockup ...

Tech-Spec

carlobeltrame commented 3 years ago

Zur späteren Referenz, hier das Skript das ich für diesen Export verwendet habe:

m = Message::LetterWithInvoice.find(...)

def group_households(list)
  list.each_with_object(Hash.new { |h, k| h[k] = [] }) do |person, memo|
    memo[person.household_key.presence || SecureRandom.uuid] << person
  end.values
end

l = InvoiceList.find(m.invoice_list_id)

def household_cols(household, l, m)
  household.drop(1).map {|p| i=l.invoices.find_or_initialize_by(recipient_id: p.id); [p.first_name, p.last_name, Salutation.new(p, m.salutation).value, p.gender, p.correspondence_language, i.reference]}.flatten
end

File.open("in-puncto.csv", "w") {|f| f.write(group_households(m.recipients.unscope(:select)).map {|people| p=people.first; i=l.invoices.find_or_initialize_by(recipient_id: p.id); [i.esr_number, i.recipient_email, i.recipient_address, i.reference, 0, p.first_name, p.last_name, p.company_name, p.company, p.email, p.address, p.zip_code, p.town, p.country, p.gender, p.birthday, Salutation.new(p, m.salutation).value, p.title, p.correspondence_language, p.household_key?].concat(household_cols(people, l, m)) }.inject([]) { |csv, row|  csv << CSV.generate_line(row) }.join(""))}
carlobeltrame commented 3 years ago

Partiell durchgelaufenen BatchCreate Job fortsetzen:

m = Message.find(...)

l = InvoiceList.find(m.invoice_list_id);
l.invoices.count

l.invoice = m.invoice;
batch_create = Invoice::BatchCreate.new(l, m.mailing_list.people.where.not(l.invoices.where('invoices.recipient_id = people.id').arel.exists));
batch_create.call;
total_invoices = InvoiceList.find(l.id).invoices.count;
m.update(success_count: total_invoices, failed_count: m.failed_count + batch_create.results.count(false));
l.update(recipients_processed: total_invoices);
carlobeltrame commented 2 years ago

Der Export wurde inzwischen in https://github.com/hitobito/hitobito_die_mitte/commit/bc63b0eed46b30f0d2faf6a57cbe039c43c5e52d implementiert.