2017-01-30 13:06:38 +00:00
# coding: utf-8
require 'CSV'
require 'yaml'
2017-01-31 14:38:08 +00:00
require 'mysql2'
2017-01-30 13:06:38 +00:00
2017-01-31 14:38:08 +00:00
load 'config.rb'
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:
2017-01-30 13:06:38 +00:00
2017-01-30 14:23:50 +00:00
+ 45 81 73 02 02
2017-01-30 13:06:38 +00:00
2017-01-30 14:23:50 +00:00
På forhånd tak .
2017-01-30 13:06:38 +00:00
2017-01-30 14:23:50 +00:00
Med venlig hilsen
2017-01-30 13:06:38 +00:00
] }
PATH_BASE = " ./pdf/ "
2017-01-31 14:38:08 +00:00
PRODUCTS = Hash . new
NAMES = Hash . new
PRICES = Hash . new
# Initialize product and member hashses
db . query ( " SELECT * FROM products " ) . each do | product |
PRODUCTS [ product [ 'id' ] ] = product [ 'pretty_name' ]
PRICES [ product [ 'id' ] ] = product [ 'price' ]
end
db . query ( " SELECT * FROM members " ) . each do | member |
NAMES [ member [ 'id' ] ] = member [ 'name' ]
end
2017-01-30 13:06:38 +00:00
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
2017-01-31 14:38:08 +00:00
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
2017-01-30 13:06:38 +00:00
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 )
2017-01-30 14:23:50 +00:00
counter = 0
2017-01-30 13:06:38 +00:00
skyldnere . each do | person , products |
2017-01-30 14:23:50 +00:00
counter += 1
2017-01-30 13:06:38 +00:00
yaml = YAML_BASE . clone
2017-01-31 14:38:08 +00:00
yaml [ " to " ] = NAMES [ person ]
2017-01-30 13:06:38 +00:00
products . each do | product , amount |
2017-01-30 14:23:50 +00:00
yaml [ " invoice-nr " ] = Time . now . strftime ( '%Y%W' ) + " - " + counter . to_s
2017-01-30 13:06:38 +00:00
yaml [ " service " ] = Array . new unless yaml [ " service " ]
2017-01-31 14:38:08 +00:00
hash = { description : PRODUCTS [ product ] , price : PRICES [ product ] . to_i * amount , amount : amount }
2017-01-30 13:06:38 +00:00
yaml [ " service " ] << Hash [ hash . map { | k , v | [ k . to_s , v ] } ]
end
2017-01-31 15:13:26 +00:00
unless Date . today . sunday?
yaml [ " draft " ] = " true "
yaml [ " drafttext " ] = " Udkast "
end
2017-01-30 14:23:50 +00:00
output = Hash [ yaml . map { | k , v | [ k . to_s , v ] } ] . to_yaml
output += " --- \n "
file = File . open ( " ./pandoc/details.yml " , " w " )
file << output
file . close
` cd pandoc/; make -B `
` cp pandoc/output.pdf pdf/ #{ yaml [ " invoice-nr " ] } .pdf `
puts " #{ person } : #{ yaml [ " invoice-nr " ] } .pdf "
2017-01-30 13:06:38 +00:00
end
end
2017-01-31 14:38:08 +00:00
# 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 ) )
2017-01-30 13:06:38 +00:00
generate_receipt ( partition )