1# frozen_string_literal: true
 2
 3require_relative "cdr"
 4
 5class CDRRepo
 6	def initialize(db: DB)
 7		@db = db
 8	end
 9
10	def put(cdr)
11		data = cdr.to_h
12		data.delete(:rate)
13		data.delete(:charge)
14		columns, values = data.to_a.transpose
15		@db.query_defer(<<~SQL, values)
16			INSERT INTO cdr (#{columns.join(',')})
17			VALUES ($1, $2, $3, $4, $5, $6, $7)
18		SQL
19	end
20
21	def find_range(customer, range)
22		customer_id = customer.customer_id
23		cdrs = @db.query_defer(CDR_SQL, [customer_id, range.first, range.last])
24
25		cdrs.then do |rows|
26			rows.map { |row|
27				CDR.new(**row.transform_keys(&:to_sym))
28			}
29		end
30	end
31
32	CDR_SQL = <<~SQL
33		SELECT
34			cdr_id,
35			customer_id,
36			start,
37			billsec,
38			disposition,
39			tel,
40			direction,
41			rate,
42			charge
43		FROM cdr_with_charge
44		WHERE customer_id = $1 AND start >= $2 AND DATE_TRUNC('day', start) <= $3
45		ORDER BY start DESC
46	SQL
47end