Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 87
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
CashActivityRepository
0.00% covered (danger)
0.00%
0 / 87
0.00% covered (danger)
0.00%
0 / 10
272
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 save
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 findByDateRange
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 findByDate
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
 findById
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 findAll
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 update
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 delete
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 hydrate
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
2
 getLatestSafeBalance
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace BuyerKiosk\Cash;
4
5use PDO;
6use PDOException;
7
8class CashActivityRepository {
9    private $db;
10    private $store;
11
12    public function __construct(\Store $store) {
13        $this->store = $store;
14        $this->db = dbConnectByName($this->store->getDbName());
15    }
16
17    public function save(CashActivity $activity): bool {
18        $sql = "INSERT INTO cashActivity (
19                timeStamp, userId, transType, register, destination,
20                pennies, pennyRolls, nickels, nickelRolls,
21                dimes, dimeRolls, quarters, quarterRolls,
22                ones, oneRolls, fives, fiveRolls,
23                tens, tenRolls, twenties, twentyRolls,
24                fifties, fiftyRolls, hundreds, hundredRolls,
25                total
26            ) VALUES (
27                :timeStamp, :userId, :transType, :register, :destination,
28                :pennies, :pennyRolls, :nickels, :nickelRolls,
29                :dimes, :dimeRolls, :quarters, :quarterRolls,
30                :ones, :oneRolls, :fives, :fiveRolls,
31                :tens, :tenRolls, :twenties, :twentyRolls,
32                :fifties, :fiftyRolls, :hundreds, :hundredRolls,
33                :total
34            )";
35
36        $stmt = $this->db->prepare($sql);
37        $params = $activity->toArray();
38        //error_log('SQL Parameters: ' . print_r($params, true));
39        // Remove id from parameters since it's not in the INSERT query
40        unset($params['id'], $params['userName']);
41
42        // Debug
43        error_log('SQL Parameters after id removal: ' . print_r($params, true));
44
45        try {
46            return $stmt->execute($params);
47        } catch (PDOException $e) {
48            error_log('SQL Error: ' . $e->getMessage());
49            error_log('SQL Query: ' . $sql);
50            throw $e;
51        }
52    }
53    public function findByDateRange(string $startDate, string $endDate): array {
54        $sql = "SELECT * FROM cashActivity 
55            WHERE DATE(timeStamp) BETWEEN :startDate AND :endDate 
56            ORDER BY timeStamp DESC";
57
58        $stmt = $this->db->prepare($sql);
59        $stmt->execute([
60            ':startDate' => $startDate,
61            ':endDate' => $endDate
62        ]);
63
64        $activities = [];
65        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
66            $activities[] = $this->hydrate($row);
67        }
68        return $activities;
69    }
70
71    public function findByDate(string $date): array {
72        $sql = "SELECT * FROM cashActivity 
73            WHERE DATE(timeStamp) = :date 
74            ORDER BY timeStamp DESC";
75
76        $stmt = $this->db->prepare($sql);
77        $stmt->execute([':date' => $date]);
78
79        $activities = [];
80        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
81            $activities[] = $this->hydrate($row);
82        }
83        return $activities;
84    }
85
86
87
88    public function findById(int $id): ?CashActivity {
89        $sql = "SELECT * FROM cashActivity WHERE id = :id";
90        $stmt = $this->db->prepare($sql);
91        $stmt->execute(['id' => $id]);
92
93        $data = $stmt->fetch(PDO::FETCH_ASSOC);
94        if (!$data) return null;
95
96        return $this->hydrate($data);
97    }
98
99    public function findAll(): array {
100        $sql = "SELECT * FROM cashActivity ORDER BY timeStamp DESC";
101        $stmt = $this->db->prepare($sql);
102        $stmt->execute();
103
104        $activities = [];
105        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
106            $activities[] = $this->hydrate($row);
107        }
108        return $activities;
109    }
110
111    public function update(CashActivity $activity): bool {
112        $sql = "UPDATE cashActivity SET 
113                    timeStamp = :timeStamp,
114                    userId = :userId,
115                    transType = :transType,
116                    register = :register,
117                    destination = :destination,
118                    pennies = :pennies,
119                    pennyRolls = :pennyRolls,
120                    nickels = :nickels,
121                    nickelRolls = :nickelRolls,
122                    dimes = :dimes,
123                    dimeRolls = :dimeRolls,
124                    quarters = :quarters,
125                    quarterRolls = :quarterRolls,
126                    ones = :ones,
127                    oneRolls = :oneRolls,
128                    fives = :fives,
129                    fiveRolls = :fiveRolls,
130                    tens = :tens,
131                    tenRolls = :tenRolls,
132                    twenties = :twenties,
133                    twentyRolls = :twentyRolls,
134                    fifties = :fifties,
135                    fiftyRolls = :fiftyRolls,
136                    hundreds = :hundreds,
137                    hundredRolls = :hundredRolls,
138                    total = :total
139                    WHERE id = :id";
140
141        $stmt = $this->db->prepare($sql);
142        return $stmt->execute($activity->toArray());
143    }
144
145    public function delete(int $id): bool {
146        $sql = "DELETE FROM cashActivity WHERE id = :id";
147        $stmt = $this->db->prepare($sql);
148        return $stmt->execute(['id' => $id]);
149    }
150
151    private function hydrate(array $data): CashActivity {
152        $activity = new CashActivity();
153        $activity->setId($data['id'])
154            ->setTimeStamp($data['timeStamp'])
155            ->setUserId($data['userId'])
156            ->setTransType($data['transType'])
157            ->setRegister($data['register'])
158            ->setDestination($data['destination'])
159            ->setPennies($data['pennies'])
160            ->setPennyRolls($data['pennyRolls'])
161            ->setNickels($data['nickels'])
162            ->setNickelRolls($data['nickelRolls'])
163            ->setDimes($data['dimes'])
164            ->setDimeRolls($data['dimeRolls'])
165            ->setQuarters($data['quarters'])
166            ->setQuarterRolls($data['quarterRolls'])
167            ->setOnes($data['ones'])
168            ->setOneRolls($data['oneRolls'])
169            ->setFives($data['fives'])
170            ->setFiveRolls($data['fiveRolls'])
171            ->setTens($data['tens'])
172            ->setTenRolls($data['tenRolls'])
173            ->setTwenties($data['twenties'])
174            ->setTwentyRolls($data['twentyRolls'])
175            ->setFifties($data['fifties'])
176            ->setFiftyRolls($data['fiftyRolls'])
177            ->setHundreds($data['hundreds'])
178            ->setHundredRolls($data['hundredRolls'])
179            ->setTotal($data['total']);
180        return $activity;
181    }
182    public function getLatestSafeBalance(): ?CashActivity {
183        $sql = "SELECT * FROM cashActivity WHERE transType = 'Safe' ORDER BY timeStamp DESC LIMIT 1";
184        $stmt = $this->db->prepare($sql);
185        $stmt->execute();
186
187        $data = $stmt->fetch(PDO::FETCH_ASSOC);
188        if (!$data) return null;
189
190        return $this->hydrate($data);
191    }
192
193}