%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/Db/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/Db/BillMapper.php |
<?php /** * Nextcloud - cospend * * This file is licensed under the Affero General Public License version 3 or * later. See the COPYING file. * * @author Julien Veyssier <julien-nc@posteo.net * @copyright Julien Veyssier 2019 */ namespace OCA\Cospend\Db; use DateTime; use Exception; use OCA\Cospend\AppInfo\Application; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; /** * @extends QBMapper<Bill> */ class BillMapper extends QBMapper { public const TABLE_NAME = 'cospend_bills'; public function __construct(IDBConnection $db) { parent::__construct($db, self::TABLE_NAME, Bill::class); } /** * @param int $id * @return Bill * @throws \OCP\DB\Exception */ public function find(int $id): Bill { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); $result = $qb->executeQuery(); $row = $result->fetch(); $result->closeCursor(); if ($row === false) { throw new Exception('Bill ' . $id . ' not found'); } return $this->mapRowToEntity($row); } public function findProjectId(int $id): string { $qb = $this->db->getQueryBuilder(); $qb->select('projectid') ->from($this->getTableName()) ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); $result = $qb->executeQuery(); $row = $result->fetch(); $result->closeCursor(); if ($row === false) { throw new Exception('Bill ' . $id . ' not found'); } return $row['projectid']; } /** * Delete bill owers of given bill * * @param int $billId * @return int * @throws \OCP\DB\Exception */ public function deleteBillOwersOfBill(int $billId): int { $qb = $this->db->getQueryBuilder(); $qb->delete('cospend_bill_owers') ->where( $qb->expr()->eq('billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT)) ); $nbDeleted = $qb->executeStatement(); $qb->resetQueryParts(); return $nbDeleted; } public function deleteDeletedBills(string $projectId): void { // first delete the bill owers $qb = $this->db->getQueryBuilder(); $qb2 = $this->db->getQueryBuilder(); $qb2->select('id') ->from('cospend_bills') ->where( $qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ) ->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT)) ); $qb->delete('cospend_bill_owers') ->where( $qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY) ); $qb->executeStatement(); $qb->resetQueryParts(); // delete the bills $qb = $this->db->getQueryBuilder(); $qb->delete('cospend_bills') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ) ->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT)) ); $qb->executeStatement(); } /** * @param string $projectId * @param string|null $what * @param int|null $minTimestamp * @return array * @throws \OCP\DB\Exception */ public function deleteBills(string $projectId, ?string $what = null, ?int $minTimestamp = null): array { // first delete the bill owers $qb = $this->db->getQueryBuilder(); $qb2 = $this->db->getQueryBuilder(); $qb2->select('id') ->from('cospend_bills') ->where( $qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($what !== null) { $qb2->andWhere( $qb2->expr()->eq('what', $qb->createNamedParameter($what, IQueryBuilder::PARAM_STR)) ); } if ($minTimestamp !== null) { $qb2->andWhere( $qb2->expr()->gt('timestamp', $qb->createNamedParameter($minTimestamp, IQueryBuilder::PARAM_INT)) ); } $qb->delete('cospend_bill_owers') ->where( $qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY) ); $nbBillOwersDeleted = $qb->executeStatement(); $qb->resetQueryParts(); /////////////////// // delete the bills $qb->delete('cospend_bills') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($what !== null) { $qb->andWhere( $qb->expr()->eq('what', $qb->createNamedParameter($what, IQueryBuilder::PARAM_STR)) ); } if ($minTimestamp !== null) { $qb->andWhere( $qb->expr()->gt('timestamp', $qb->createNamedParameter($minTimestamp, IQueryBuilder::PARAM_INT)) ); } $nbBillsDeleted = $qb->executeStatement(); return [ 'bills' => $nbBillsDeleted, 'billOwers' => $nbBillOwersDeleted, ]; } /** * @param string $projectId * @param string|null $what * @param int|null $minTimestamp * @return array * @throws \OCP\DB\Exception */ public function moveBillsToTrash(string $projectId, ?string $what = null, ?int $minTimestamp = null): array { $qb = $this->db->getQueryBuilder(); $qb->update('cospend_bills') ->set('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT)) ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($what !== null) { $qb->andWhere( $qb->expr()->eq('what', $qb->createNamedParameter($what, IQueryBuilder::PARAM_STR)) ); } if ($minTimestamp !== null) { $qb->andWhere( $qb->expr()->gt('timestamp', $qb->createNamedParameter($minTimestamp, IQueryBuilder::PARAM_INT)) ); } $nbBillsDeleted = $qb->executeStatement(); return [ 'bills' => $nbBillsDeleted, ]; } /** * @param string $projectId * @param string|null $what * @param int|null $minTimestamp * @return Bill[] * @throws \OCP\DB\Exception */ public function getBillsToDelete(string $projectId, ?string $what = null, ?int $minTimestamp = null): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from('cospend_bills') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($what !== null) { $qb->andWhere( $qb->expr()->eq('what', $qb->createNamedParameter($what, IQueryBuilder::PARAM_STR)) ); } if ($minTimestamp !== null) { $qb->andWhere( $qb->expr()->gt('timestamp', $qb->createNamedParameter($minTimestamp, IQueryBuilder::PARAM_INT)) ); } return $this->findEntities($qb); } /** * @param string $projectId * @param int $billId * @return Bill|null */ public function getBillEntity(string $projectId, int $billId): ?Bill { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from(self::TABLE_NAME) ->where( $qb->expr()->eq('id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT)) ) ->andWhere( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); try { return $this->findEntity($qb); } catch (DoesNotExistException | MultipleObjectsReturnedException | \OCP\DB\Exception $e) { return null; } } /** * Get bill info * * @param string $projectId * @param int $billId * @return array|null */ public function getBill(string $projectId, int $billId): ?array { $dbBbill = $this->getBillEntity($projectId, $billId); if ($dbBbill === null) { return null; } // get bill owers $billOwers = []; $billOwerIds = []; $qb = $this->db->getQueryBuilder(); $qb->select('memberid', 'm.name', 'm.weight', 'm.activated') ->from('cospend_bill_owers', 'bo') ->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id')) ->where( $qb->expr()->eq('bo.billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT)) ); $req = $qb->executeQuery(); while ($row = $req->fetch()) { $dbWeight = (float) $row['weight']; $dbName = $row['name']; $dbActivated = (((int) $row['activated']) === 1); $dbOwerId = (int) $row['memberid']; $billOwers[] = [ 'id' => $dbOwerId, 'weight' => $dbWeight, 'name' => $dbName, 'activated' => $dbActivated, ]; $billOwerIds[] = $dbOwerId; } $req->closeCursor(); $qb->resetQueryParts(); // get the bill $bill = $dbBbill->jsonSerialize(); $bill['owers'] = $billOwers; $bill['owerIds'] = $billOwerIds; return $bill; } /** * Get filtered list of bills for a project * * @param string $projectId * @param int|null $tsMin * @param int|null $tsMax * @param string|null $paymentMode * @param int|null $paymentModeId * @param int|null $category * @param float|null $amountMin * @param float|null $amountMax * @param int|null $lastchanged * @param int|null $limit * @param bool $reverse * @param int|null $payerId * @param int|null $deleted * @return array * @throws \OCP\DB\Exception */ public function getBills(string $projectId, ?int $tsMin = null, ?int $tsMax = null, ?string $paymentMode = null, ?int $paymentModeId = null, ?int $category = null, ?float $amountMin = null, ?float $amountMax = null, ?int $lastchanged = null, ?int $limit = null, bool $reverse = false, ?int $payerId = null, ?int $deleted = 0): array { $qb = $this->db->getQueryBuilder(); $qb->select('bi.id', 'what', 'comment', 'timestamp', 'amount', 'payerid', 'repeat', 'paymentmode', 'paymentmodeid', 'categoryid', 'bi.lastchanged', 'repeatallactive', 'repeatuntil', 'repeatfreq', 'deleted', 'memberid', 'm.name', 'm.weight', 'm.activated') ->from('cospend_bill_owers', 'bo') ->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.billid', 'bi.id')) ->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id')) ->where( $qb->expr()->eq('bi.projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); // take bills that have changed after $lastchanged if ($lastchanged !== null) { $qb->andWhere( $qb->expr()->gt('bi.lastchanged', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT)) ); } if ($payerId !== null) { $qb->andWhere( $qb->expr()->eq('bi.payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT)) ); } if ($tsMin !== null) { $qb->andWhere( $qb->expr()->gte('timestamp', $qb->createNamedParameter($tsMin, IQueryBuilder::PARAM_INT)) ); } if ($tsMax !== null) { $qb->andWhere( $qb->expr()->lte('timestamp', $qb->createNamedParameter($tsMax, IQueryBuilder::PARAM_INT)) ); } if ($deleted !== null) { $qb->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter($deleted, IQueryBuilder::PARAM_INT)) ); } if ($paymentMode !== null && $paymentMode !== '' && $paymentMode !== 'n') { $qb->andWhere( $qb->expr()->eq('paymentmode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR)) ); } elseif (!is_null($paymentModeId)) { $qb->andWhere( $qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT)) ); } if ($category !== null) { if ($category === -100) { $or = $qb->expr()->orx(); $or->add($qb->expr()->isNull('categoryid')); $or->add($qb->expr()->neq('categoryid', $qb->createNamedParameter(Application::CATEGORY_REIMBURSEMENT, IQueryBuilder::PARAM_INT))); $qb->andWhere($or); } else { $qb->andWhere( $qb->expr()->eq('categoryid', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT)) ); } } if ($amountMin !== null) { $qb->andWhere( $qb->expr()->gte('amount', $qb->createNamedParameter($amountMin, IQueryBuilder::PARAM_STR)) ); } if ($amountMax !== null) { $qb->andWhere( $qb->expr()->lte('amount', $qb->createNamedParameter($amountMax, IQueryBuilder::PARAM_STR)) ); } if ($reverse) { $qb->orderBy('timestamp', 'DESC'); } else { $qb->orderBy('timestamp', 'ASC'); } if ($limit) { $qb->setMaxResults($limit); } $req = $qb->executeQuery(); // bills by id $billDict = []; // ordered list of bill ids $orderedBillIds = []; while ($row = $req->fetch()) { $dbBillId = (int) $row['id']; // if first time we see the bill : add it to bill list if (!isset($billDict[$dbBillId])) { $billDict[$dbBillId] = $this->getBillFromRow($row); // keep order of bills $orderedBillIds[] = $dbBillId; } // anyway add an ower $dbWeight = (float) $row['weight']; $dbName = $row['name']; $dbActivated = ((int) $row['activated']) === 1; $dbOwerId = (int) $row['memberid']; $billDict[$dbBillId]['owers'][] = [ 'id' => $dbOwerId, 'weight' => $dbWeight, 'name' => $dbName, 'activated' => $dbActivated, ]; $billDict[$dbBillId]['owerIds'][] = $dbOwerId; } $req->closeCursor(); $qb->resetQueryParts(); $resultBills = []; foreach ($orderedBillIds as $bid) { $resultBills[] = $billDict[$bid]; } return $resultBills; } /** * Get filtered list of bills for a project * * @param string $projectId * @param int|null $tsMin * @param int|null $tsMax * @param string|null $paymentMode * @param int|null $paymentModeId * @param int|null $category * @param float|null $amountMin * @param float|null $amountMax * @param int|null $lastchanged * @param int|null $limit * @param bool $reverse * @param int|null $offset * @param int|null $payerId * @param int|null $includeBillId * @param string|null $searchTerm * @return array * @throws \OCP\DB\Exception */ public function getBillsWithLimit( string $projectId, ?int $tsMin = null, ?int $tsMax = null, ?string $paymentMode = null, ?int $paymentModeId = null, ?int $category = null, ?float $amountMin = null, ?float $amountMax = null, ?int $lastchanged = null, ?int $limit = null, bool $reverse = false, ?int $offset = 0, ?int $payerId = null, ?int $includeBillId = null, ?string $searchTerm = null, ?int $deleted = 0 ): array { $qb = $this->db->getQueryBuilder(); $qb->select('id', 'what', 'comment', 'timestamp', 'amount', 'payerid', 'repeat', 'paymentmode', 'paymentmodeid', 'categoryid', 'lastchanged', 'repeatallactive', 'repeatuntil', 'repeatfreq', 'deleted') ->from('cospend_bills', 'bi') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); // take bills that have changed after $lastchanged if ($lastchanged !== null) { $qb->andWhere( $qb->expr()->gt('lastchanged', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT)) ); } if ($payerId !== null) { $qb->andWhere( $qb->expr()->eq('payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT)) ); } if ($tsMin !== null) { $qb->andWhere( $qb->expr()->gte('timestamp', $qb->createNamedParameter($tsMin, IQueryBuilder::PARAM_INT)) ); } if ($tsMax !== null) { $qb->andWhere( $qb->expr()->lte('timestamp', $qb->createNamedParameter($tsMax, IQueryBuilder::PARAM_INT)) ); } if ($deleted !== null) { $qb->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter($deleted, IQueryBuilder::PARAM_INT)) ); } if ($paymentMode !== null && $paymentMode !== '' && $paymentMode !== 'n') { $qb->andWhere( $qb->expr()->eq('paymentmode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR)) ); } elseif (!is_null($paymentModeId)) { $qb->andWhere( $qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT)) ); } if ($category !== null) { if ($category === -100) { $or = $qb->expr()->orx(); $or->add($qb->expr()->isNull('categoryid')); $or->add($qb->expr()->neq('categoryid', $qb->createNamedParameter(Application::CATEGORY_REIMBURSEMENT, IQueryBuilder::PARAM_INT))); $qb->andWhere($or); } else { $qb->andWhere( $qb->expr()->eq('categoryid', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT)) ); } } if ($amountMin !== null) { $qb->andWhere( $qb->expr()->gte('amount', $qb->createNamedParameter($amountMin, IQueryBuilder::PARAM_STR)) ); } if ($amountMax !== null) { $qb->andWhere( $qb->expr()->lte('amount', $qb->createNamedParameter($amountMax, IQueryBuilder::PARAM_STR)) ); } // handle the search term (what, comment, amount+-1) if ($searchTerm !== null && $searchTerm !== '') { $qb = $this->applyBillSearchTermCondition($qb, $searchTerm, 'bi'); } if ($reverse) { $qb->orderBy('timestamp', 'DESC'); } else { $qb->orderBy('timestamp', 'ASC'); } if ($limit) { $qb->setMaxResults($limit); } if ($offset) { $qb->setFirstResult($offset); } $billEntities = $this->findEntities($qb); $includeBillFound = false; foreach ($billEntities as $bill) { if ($bill->getId() === $includeBillId) { $includeBillFound = true; break; } } $bills = array_map(static function (Bill $bill) { return $bill->jsonSerialize(); }, $billEntities); // look further if we want to include a specific bill if ($includeBillId !== null && $includeBillFound === false && $limit && $offset === 0) { $lastResultCount = count($bills); while ($lastResultCount > 0 && $includeBillFound === false) { $offset = $offset + $limit; $qb->setFirstResult($offset); $billEntities = $this->findEntities($qb); $lastResultCount = count($billEntities); foreach ($billEntities as $bill) { if ($bill->getId() === $includeBillId) { $includeBillFound = true; break; } } $moreBills = array_map(static function (Bill $bill) { return $bill->jsonSerialize(); }, $billEntities); $bills = array_merge($bills, $moreBills); } } $qb = $qb->resetQueryParts(); // get owers foreach ($bills as $i => $bill) { $billId = $bill['id']; $billOwers = []; $billOwerIds = []; $qb->select('memberid', 'm.name', 'm.weight', 'm.activated') ->from('cospend_bill_owers', 'bo') ->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id')) ->where( $qb->expr()->eq('bo.billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT)) ); $qb->setFirstResult(0); $req = $qb->executeQuery(); while ($row = $req->fetch()) { $dbWeight = (float) $row['weight']; $dbName = $row['name']; $dbActivated = ((int) $row['activated']) === 1; $dbOwerId = (int) $row['memberid']; $billOwers[] = [ 'id' => $dbOwerId, 'weight' => $dbWeight, 'name' => $dbName, 'activated' => $dbActivated, ]; $billOwerIds[] = $dbOwerId; } $req->closeCursor(); $qb = $qb->resetQueryParts(); $bills[$i]['owers'] = $billOwers; $bills[$i]['owerIds'] = $billOwerIds; } return $bills; } private function getBillFromRow(array $row): array { $dbBillId = (int) $row['id']; $dbAmount = (float) $row['amount']; $dbWhat = $row['what']; $dbComment = $row['comment']; $dbTimestamp = (int) $row['timestamp']; $dbDate = DateTime::createFromFormat('U', $row['timestamp']); $dbRepeat = $row['repeat']; $dbPayerId = (int) $row['payerid']; $dbPaymentMode = $row['paymentmode']; $dbPaymentModeId = (int) $row['paymentmodeid']; $dbCategoryId = (int) $row['categoryid']; $dbLastchanged = (int) $row['lastchanged']; $dbRepeatAllActive = (int) $row['repeatallactive']; $dbRepeatUntil = $row['repeatuntil']; $dbRepeatFreq = (int) $row['repeatfreq']; $dbDeleted = (int) $row['deleted']; return [ 'id' => $dbBillId, 'amount' => $dbAmount, 'what' => $dbWhat, 'comment' => $dbComment ?? '', 'timestamp' => $dbTimestamp, 'date' => $dbDate->format('Y-m-d'), 'payer_id' => $dbPayerId, 'owers' => [], 'owerIds' => [], 'repeat' => $dbRepeat, 'paymentmode' => $dbPaymentMode, 'paymentmodeid' => $dbPaymentModeId, 'categoryid' => $dbCategoryId, 'lastchanged' => $dbLastchanged, 'repeatallactive' => $dbRepeatAllActive, 'repeatuntil' => $dbRepeatUntil, 'repeatfreq' => $dbRepeatFreq, 'deleted' => $dbDeleted, ]; } private function applyBillSearchTermCondition(IQueryBuilder $qb, string $term, string $billTableAlias): IQueryBuilder { $term = strtolower($term); $or = $qb->expr()->orx(); $or->add( $qb->expr()->iLike($billTableAlias . '.what', $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($term) . '%', IQueryBuilder::PARAM_STR)) ); $or->add( $qb->expr()->iLike($billTableAlias . '.comment', $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($term) . '%', IQueryBuilder::PARAM_STR)) ); // search amount $noCommaTerm = str_replace(',', '.', $term); if (is_numeric($noCommaTerm)) { $amount = (float) $noCommaTerm; $amountMin = $amount - 1.0; $amountMax = $amount + 1.0; $andExpr = $qb->expr()->andX(); $andExpr->add( $qb->expr()->gte($billTableAlias . '.amount', $qb->createNamedParameter($amountMin, IQueryBuilder::PARAM_STR)) ); $andExpr->add( $qb->expr()->lte($billTableAlias . '.amount', $qb->createNamedParameter($amountMax, IQueryBuilder::PARAM_STR)) ); $or->add($andExpr); } $qb->andWhere($or); return $qb; } /** * Search bills with query string * * @param string $projectId * @param string $term * @return array */ public function searchBills(string $projectId, string $term, ?int $deleted = 0): array { $qb = $this->db->getQueryBuilder(); $qb->select( 'b.id', 'what', 'comment', 'amount', 'timestamp', 'paymentmode', 'paymentmodeid', 'categoryid', 'pr.currencyname', 'me.name', 'me.userid' ) ->from('cospend_bills', 'b') ->innerJoin('b', 'cospend_projects', 'pr', $qb->expr()->eq('b.projectid', 'pr.id')) ->innerJoin('b', 'cospend_members', 'me', $qb->expr()->eq('b.payerid', 'me.id')) ->where( $qb->expr()->eq('b.projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($deleted !== null) { $qb->andWhere( $qb->expr()->eq('b.deleted', $qb->createNamedParameter($deleted, IQueryBuilder::PARAM_INT)) ); } $qb = $this->applyBillSearchTermCondition($qb, $term, 'b'); $qb->orderBy('timestamp', 'ASC'); $req = $qb->executeQuery(); // bills by id $bills = []; while ($row = $req->fetch()) { $dbBillId = (int) $row['id']; $dbAmount = (float) $row['amount']; $dbWhat = $row['what']; $dbTimestamp = (int) $row['timestamp']; $dbComment = $row['comment']; $dbPaymentMode = $row['paymentmode']; $dbPaymentModeId = (int) $row['paymentmodeid']; $dbCategoryId = (int) $row['categoryid']; $dbProjectCurrencyName = $row['currencyname']; $dbPayerName = $row['name']; $dbPayerUserId = $row['userid']; $bills[] = [ 'id' => $dbBillId, 'projectId' => $projectId, 'amount' => $dbAmount, 'what' => $dbWhat, 'timestamp' => $dbTimestamp, 'comment' => $dbComment, 'paymentmode' => $dbPaymentMode, 'paymentmodeid' => $dbPaymentModeId, 'categoryid' => $dbCategoryId, 'currencyname' => $dbProjectCurrencyName, 'payer_name' => $dbPayerName, 'payer_user_id' => $dbPayerUserId, ]; } $req->closeCursor(); $qb->resetQueryParts(); return $bills; } /** * Get number of bills in a project * * @param string $projectId * @param int|null $payerId * @param int|null $categoryId * @param int|null $paymentModeId * @param int|null $deleted * @return int * @throws \OCP\DB\Exception */ public function countBills(string $projectId, ?int $payerId = null, ?int $categoryId = null, ?int $paymentModeId = null, ?int $deleted = 0): int { $qb = $this->db->getQueryBuilder(); $qb->selectAlias($qb->createFunction('COUNT(*)'), 'count_bills') ->from('cospend_bills') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($deleted !== null) { $qb->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter($deleted, IQueryBuilder::PARAM_INT)) ); } if ($payerId !== null) { $qb->andWhere( $qb->expr()->eq('payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT)) ); } if ($categoryId !== null) { $qb->andWhere( $qb->expr()->eq('categoryid', $qb->createNamedParameter($categoryId, IQueryBuilder::PARAM_INT)) ); } if ($paymentModeId !== null) { $qb->andWhere( $qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT)) ); } $req = $qb->executeQuery(); while ($row = $req->fetch()) { return (int) $row['count_bills']; } return 0; } /** * Get all bill IDs of a project * * @param string $projectId * @param int|null $deleted * @return array * @throws \OCP\DB\Exception */ public function getAllBillIds(string $projectId, ?int $deleted = 0): array { $billIds = []; $qb = $this->db->getQueryBuilder(); $qb->select('id') ->from(self::TABLE_NAME, 'b') ->where( $qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)) ); if ($deleted !== null) { $qb->andWhere( $qb->expr()->eq('deleted', $qb->createNamedParameter($deleted, IQueryBuilder::PARAM_INT)) ); } $req = $qb->executeQuery(); while ($row = $req->fetch()) { $billIds[] = (int) $row['id']; } $req->closeCursor(); $qb->resetQueryParts(); return $billIds; } }