# coding: utf-8 require 'CSV' require 'yaml' require 'mysql2' require 'optparse' load 'config.rb' Options = {} OptionParser.new do |opts| opts.banner = "Usage: invoice.rb [options]" opts.on("-d", "--draft", "Generate invoices with 'DRAFT' watermark") do |d| Options[:draft] = d end opts.on("-v", "--verbose", "Run verbosely") do |v| Options[:verbose] = v end opts.on("-s", "--silent", "Run silently (overrules -v)") do |s| Options[:silent] = true Options[:verbose] = false end end.parse! db = Mysql2::Client.new(:host => DB_HOST, :username => DB_USER, :database => DB_DB) YAML_BASE = {"author": "Christoffer Müller Madsen", "city": "Aarhus", "from": ["Falstersgade 18, 4. th", "8000 Aarhus C"], 'currency': 'DKK', 'commasep': true, 'lang': 'danish', 'seriffont': 'Linux Libertine', 'sansfont': 'Linux Biolinum', 'fontsize': '10pt', 'geometry': 'a4paper, left=43mm, right=43mm, top=51mm, bottom=17mm', 'closingnote': %Q[Overfør venligst det anførte beløb via MobilePay til følgende telefonnummer i løbet af de næste 14 dage: +45 81 73 02 02 Med venlig hilsen ] } Products = Hash.new Names = Hash.new Prices = Hash.new # Initialize product and member hashses db.query("SELECT * FROM products").each do |product| id = product['id'] pretty_name = product['pretty_name'] price = product['price'] if Options[:verbose] puts "Found product: #{id} => #{pretty_name}, #{price}" end Products[id] = pretty_name Prices[id] = price end db.query("SELECT * FROM members").each do |member| Names[member['id']] = member['name'] end class LogItem def initialize(time,person,product,amount: 1) @time = time @person = person @product = product @amount = amount end attr_accessor :time, :person, :product, :amount end def read_file(file) rows = Array.new CSV.foreach(file, col_sep: ';', converters: :float) do |row| rows << LogItem.new(row[0],row[1],row[2],amount: row[3]) end rows end def read_db(db) rows = Array.new db.query("SELECT * FROM transactions").each do |row| if date_of_prev('monday').to_time < row["time"] rows << LogItem.new(row["time"], row["buyer"], row["product"], amount: row["amount"]) end end rows end def partition_rows(rows) skyldnere = Hash.new rows.each do |row| skyldnere[row.person] = Hash.new unless skyldnere[row.person] skyldnere[row.person][row.product] = 0 unless skyldnere[row.person][row.product] skyldnere[row.person][row.product] += row.amount end skyldnere end def generate_receipt(skyldnere,draft) counter = 0 skyldnere.each do |person, products| counter += 1 yaml = YAML_BASE.clone yaml["to"] = Names[person] products.each do |product, amount| yaml["invoice-nr"] = Time.now.strftime('%Y%W') + "-" + counter.to_s yaml["service"] = Array.new unless yaml["service"] hash = {description: Products[product], pieceprice: Prices[product].to_i, price: Prices[product].to_i*amount, amount: amount} yaml["service"] << Hash[hash.map{ |k, v| [k.to_s, v] }] end if draft yaml["draft"] = "true" yaml["drafttext"] = "Udkast" end output = Hash[yaml.map{ |k, v| [k.to_s, v] }].to_yaml output += "---\n" File.open("./pandoc/details.yml","w") do |file| file << output end `cd pandoc/; make -B` `cp pandoc/output.pdf #{OUTPUT_PATH}/#{yaml["invoice-nr"]}.pdf` puts "#{person}: #{yaml["invoice-nr"]}.pdf" unless Options[:silent] end end # Utility def date_of_next(day) date = Date.parse(day) delta = date > Date.today ? 0 : 7 date + delta end def date_of_prev(day) date = Date.parse(day) delta = date < Date.today ? 0 : 7 date - delta end partition = partition_rows(read_db(db)) generate_receipt(partition,Options[:draft])