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