rename columns in bill table

Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
This commit is contained in:
Julien Veyssier
2024-09-11 23:58:26 +02:00
parent af881d34ef
commit 27bfbea0da
10 changed files with 346 additions and 155 deletions

View File

@@ -3,7 +3,7 @@
<id>cospend</id>
<name>Cospend</name>
<summary> </summary><description> </description>
<version>3.0.0</version>
<version>3.0.1</version>
<licence>agpl</licence>
<author mail="julien-nc@posteo.net">Julien Veyssier</author>
<namespace>Cospend</namespace>

View File

@@ -68,7 +68,7 @@ class DeleteBills extends Base {
foreach ($billsToDelete as $bill) {
$ts = $bill->getTimestamp();
$date = (new DateTime())->setTimestamp($ts)->format('c');
$output->writeln('DELETE [' . $bill->getId() . '] ' . $bill->getWhat() . ' ; ' . $bill->getAmount() . ' ; ' . $date . ' ; ' . $bill->getPayerid());
$output->writeln('DELETE [' . $bill->getId() . '] ' . $bill->getWhat() . ' ; ' . $bill->getAmount() . ' ; ' . $date . ' ; ' . $bill->getPayerId());
}
if ($input->getOption('simulate')) {

View File

@@ -20,66 +20,66 @@ use OCP\AppFramework\Db\Entity;
* @method void setWhat(string $what)
* @method string|null getComment()
* @method void setComment(string|null $comment)
* @method int getPayerid()
* @method void setPayerid(int $payerid)
* @method int getPayerId()
* @method void setPayerId(int $payerId)
* @method float getAmount()
* @method void setAmount(float $amount)
* @method int getTimestamp()
* @method void setTimestamp(int $timestamp)
* @method string getRepeat()
* @method void setRepeat(string $repeat)
* @method int getRepeatallactive()
* @method void setRepeatallactive(int $repeatallactive)
* @method string getRepeatuntil()
* @method void setRepeatuntil(string $repeatuntil)
* @method int getRepeatfreq()
* @method void setRepeatfreq(int $repeatfreq)
* @method string getProjectid()
* @method void setProjectid(string $projectid)
* @method int getCategoryid()
* @method void setCategoryid(int $categoryid)
* @method string getPaymentmode()
* @method void setPaymentmode(string $paymentmode)
* @method int getPaymentmodeid()
* @method void setPaymentmodeid(int $paymentmodeid)
* @method int getLastchanged()
* @method void setLastchanged(int $lastchanged)
* @method int getRepeatAllActive()
* @method void setRepeatAllActive(int $repeatAllActive)
* @method string|null getRepeatUntil()
* @method void setRepeatUntil(string|null $repeatUntil)
* @method int getRepeatFrequency()
* @method void setRepeatFrequency(int $repeatFrequency)
* @method string getProjectId()
* @method void setProjectId(string $projectId)
* @method int|null getCategoryId()
* @method void setCategoryId(int|null $categoryId)
* @method string|null getPaymentMode()
* @method void setPaymentMode(string|null $paymentMode)
* @method int|null getPaymentModeId()
* @method void setPaymentModeId(int|null $paymentModeId)
* @method int getLastChanged()
* @method void setLastChanged(int $lastChanged)
* @method int getDeleted()
* @method void setDeleted(int $deleted) */
class Bill extends Entity implements \JsonSerializable {
protected $what;
protected $comment;
protected $payerid;
protected $amount;
protected $timestamp;
protected $repeat;
protected $repeatallactive;
protected $repeatuntil;
protected $repeatfreq;
protected $projectid;
protected $categoryid;
protected $paymentmode;
protected $paymentmodeid;
protected $lastchanged;
protected $deleted;
protected string $what = '';
protected ?string $comment = null;
protected int $payerId = 0;
protected float $amount = 0;
protected int $timestamp = 0;
protected string $repeat = 'n';
protected int $repeatAllActive = 0;
protected ?string $repeatUntil = null;
protected int $repeatFrequency = 1;
protected string $projectId = '';
protected ?int $categoryId = null;
protected ?string $paymentMode = null;
protected ?int $paymentModeId = 0;
protected int $lastChanged = 0;
protected int $deleted = 0;
public function __construct() {
$this->addType('id', 'integer');
$this->addType('what', 'string');
$this->addType('comment', 'string');
$this->addType('payerid', 'integer');
$this->addType('payer_id', 'integer');
$this->addType('timestamp', 'integer');
$this->addType('amount', 'float');
$this->addType('repeat', 'string');
$this->addType('repeatallactive', 'integer');
$this->addType('repeatuntil', 'string');
$this->addType('repeatfreq', 'integer');
$this->addType('projectid', 'string');
$this->addType('categoryid', 'integer');
$this->addType('paymentmode', 'string');
$this->addType('paymentmodeid', 'integer');
$this->addType('lastchanged', 'integer');
$this->addType('repeat_all_active', 'integer');
$this->addType('repeat_until', 'string');
$this->addType('repeat_frequency', 'integer');
$this->addType('project_id', 'string');
$this->addType('category_id', 'integer');
$this->addType('payment_mode', 'string');
$this->addType('payment_mode_id', 'integer');
$this->addType('last_changed', 'integer');
$this->addType('deleted', 'integer');
}
@@ -87,21 +87,22 @@ class Bill extends Entity implements \JsonSerializable {
public function jsonSerialize() {
return [
'id' => $this->getId(),
'projectid' => $this->getProjectid(),
'projectid' => $this->getProjectId(),
'what' => $this->getWhat(),
'comment' => $this->getComment() ?? '',
'payer_id' => $this->getPayerid(),
'payer_id' => $this->getPayerId(),
'timestamp' => $this->getTimestamp(),
'date' => DateTime::createFromFormat('U', (string)$this->getTimestamp())->format('Y-m-d'),
'amount' => $this->getAmount(),
'repeat' => $this->getRepeat(),
'repeatallactive' => $this->getRepeatallactive(),
'repeatuntil' => $this->getRepeatuntil(),
'repeatfreq' => $this->getRepeatfreq(),
'categoryid' => $this->getCategoryid(),
'paymentmode' => $this->getPaymentmode(),
'paymentmodeid' => $this->getPaymentmodeid(),
'repeatallactive' => $this->getRepeatAllActive(),
'repeatuntil' => $this->getRepeatUntil(),
'repeatfreq' => $this->getRepeatFrequency(),
'categoryid' => $this->getCategoryId(),
'paymentmode' => $this->getPaymentMode(),
'paymentmodeid' => $this->getPaymentModeId(),
'deleted' => $this->getDeleted(),
'lastchanged' => $this->getLastChanged(),
];
}
}

View File

@@ -25,10 +25,9 @@ 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);
parent::__construct($db, 'cospend_bills', Bill::class);
}
/**
@@ -52,22 +51,6 @@ class BillMapper extends QBMapper {
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
*
@@ -93,7 +76,7 @@ class BillMapper extends QBMapper {
$qb2->select('id')
->from($this->getTableName())
->where(
$qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb2->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT))
@@ -109,7 +92,7 @@ class BillMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->delete($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT))
@@ -132,7 +115,7 @@ class BillMapper extends QBMapper {
$qb2->select('id')
->from($this->getTableName())
->where(
$qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb2->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($what !== null) {
$qb2->andWhere(
@@ -156,7 +139,7 @@ class BillMapper extends QBMapper {
// delete the bills
$qb->delete($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($what !== null) {
$qb->andWhere(
@@ -187,7 +170,7 @@ class BillMapper extends QBMapper {
$qb->update($this->getTableName())
->set('deleted', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT))
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($what !== null) {
$qb->andWhere(
@@ -218,7 +201,7 @@ class BillMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($what !== null) {
$qb->andWhere(
@@ -247,7 +230,7 @@ class BillMapper extends QBMapper {
$qb->expr()->eq('id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
)
->andWhere(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
try {
@@ -357,24 +340,24 @@ class BillMapper extends QBMapper {
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',
$qb->select('bi.id', 'what', 'comment', 'timestamp', 'amount', 'payer_id', 'repeat',
'payment_mode', 'payment_mode_id', 'category_id', 'bi.last_changed', 'repeat_all_active', 'repeat_until', 'repeat_frequency',
'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))
$qb->expr()->eq('bi.project_id', $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))
$qb->expr()->gt('bi.last_changed', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT))
);
}
if ($payerId !== null) {
$qb->andWhere(
$qb->expr()->eq('bi.payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('bi.payer_id', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
);
}
if ($tsMin !== null) {
@@ -394,22 +377,22 @@ class BillMapper extends QBMapper {
}
if ($paymentMode !== null && $paymentMode !== '' && $paymentMode !== 'n') {
$qb->andWhere(
$qb->expr()->eq('paymentmode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('payment_mode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR))
);
} elseif (!is_null($paymentModeId)) {
$qb->andWhere(
$qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payment_mode_id', $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)));
$or->add($qb->expr()->isNull('category_id'));
$or->add($qb->expr()->neq('category_id', $qb->createNamedParameter(Application::CATEGORY_REIMBURSEMENT, IQueryBuilder::PARAM_INT)));
$qb->andWhere($or);
} else {
$qb->andWhere(
$qb->expr()->eq('categoryid', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('category_id', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT))
);
}
}
@@ -502,17 +485,17 @@ class BillMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName(), 'bi')
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $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))
$qb->expr()->gt('last_changed', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT))
);
}
if ($payerId !== null) {
$qb->andWhere(
$qb->expr()->eq('payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payer_id', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
);
}
if ($tsMin !== null) {
@@ -532,22 +515,22 @@ class BillMapper extends QBMapper {
}
if ($paymentMode !== null && $paymentMode !== '' && $paymentMode !== 'n') {
$qb->andWhere(
$qb->expr()->eq('paymentmode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('payment_mode', $qb->createNamedParameter($paymentMode, IQueryBuilder::PARAM_STR))
);
} elseif (!is_null($paymentModeId)) {
$qb->andWhere(
$qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payment_mode_id', $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)));
$or->add($qb->expr()->isNull('category_id'));
$or->add($qb->expr()->neq('category_id', $qb->createNamedParameter(Application::CATEGORY_REIMBURSEMENT, IQueryBuilder::PARAM_INT)));
$qb->andWhere($or);
} else {
$qb->andWhere(
$qb->expr()->eq('categoryid', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('category_id', $qb->createNamedParameter($category, IQueryBuilder::PARAM_INT))
);
}
}
@@ -657,14 +640,14 @@ class BillMapper extends QBMapper {
$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'];
$dbPayerId = (int) $row['payer_id'];
$dbPaymentMode = $row['payment_mode'];
$dbPaymentModeId = (int) $row['payment_mode_id'];
$dbCategoryId = (int) $row['category_id'];
$dbLastchanged = (int) $row['last_changed'];
$dbRepeatAllActive = (int) $row['repeat_all_active'];
$dbRepeatUntil = $row['repeat_until'];
$dbRepeatFreq = (int) $row['repeat_frequency'];
$dbDeleted = (int) $row['deleted'];
return [
'id' => $dbBillId,
@@ -727,14 +710,14 @@ class BillMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->select(
'b.id', 'what', 'comment', 'amount', 'timestamp',
'paymentmode', 'paymentmodeid', 'categoryid',
'payment_mode', 'payment_mode_id', 'category_id',
'pr.currency_name', 'me.name', 'me.userid'
)
->from($this->getTableName(), '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))
$qb->expr()->eq('b.project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($deleted !== null) {
$qb->andWhere(
@@ -753,9 +736,9 @@ class BillMapper extends QBMapper {
$dbWhat = $row['what'];
$dbTimestamp = (int) $row['timestamp'];
$dbComment = $row['comment'];
$dbPaymentMode = $row['paymentmode'];
$dbPaymentModeId = (int) $row['paymentmodeid'];
$dbCategoryId = (int) $row['categoryid'];
$dbPaymentMode = $row['payment_mode'];
$dbPaymentModeId = (int) $row['payment_mode_id'];
$dbCategoryId = (int) $row['category_id'];
$dbProjectCurrencyName = $row['currency_name'];
$dbPayerName = $row['name'];
$dbPayerUserId = $row['userid'];
@@ -795,7 +778,7 @@ class BillMapper extends QBMapper {
$qb->selectAlias($qb->createFunction('COUNT(*)'), 'count_bills')
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($deleted !== null) {
$qb->andWhere(
@@ -804,17 +787,17 @@ class BillMapper extends QBMapper {
}
if ($payerId !== null) {
$qb->andWhere(
$qb->expr()->eq('payerid', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payer_id', $qb->createNamedParameter($payerId, IQueryBuilder::PARAM_INT))
);
}
if ($categoryId !== null) {
$qb->andWhere(
$qb->expr()->eq('categoryid', $qb->createNamedParameter($categoryId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('category_id', $qb->createNamedParameter($categoryId, IQueryBuilder::PARAM_INT))
);
}
if ($paymentModeId !== null) {
$qb->andWhere(
$qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payment_mode_id', $qb->createNamedParameter($paymentModeId, IQueryBuilder::PARAM_INT))
);
}
$req = $qb->executeQuery();
@@ -836,9 +819,9 @@ class BillMapper extends QBMapper {
$billIds = [];
$qb = $this->db->getQueryBuilder();
$qb->select('id')
->from(self::TABLE_NAME, 'b')
->from($this->getTableName(), 'b')
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($deleted !== null) {
$qb->andWhere(
@@ -864,12 +847,12 @@ class BillMapper extends QBMapper {
public function removePaymentModeInProject(string $projectId, int $pmId): int {
$qb = $this->db->getQueryBuilder();
$qb->update($this->getTableName());
$qb->set('paymentmodeid', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
$qb->set('payment_mode_id', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
->where(
$qb->expr()->eq('paymentmodeid', $qb->createNamedParameter($pmId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('payment_mode_id', $qb->createNamedParameter($pmId, IQueryBuilder::PARAM_INT))
)
->andWhere(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
return $qb->executeStatement();
}
@@ -883,12 +866,12 @@ class BillMapper extends QBMapper {
public function removeCategoryInProject(string $projectId, int $categoryId): int {
$qb = $this->db->getQueryBuilder();
$qb->update($this->getTableName());
$qb->set('categoryid', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
$qb->set('category_id', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
->where(
$qb->expr()->eq('categoryid', $qb->createNamedParameter($categoryId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('category_id', $qb->createNamedParameter($categoryId, IQueryBuilder::PARAM_INT))
)
->andWhere(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
return $qb->executeStatement();
}

View File

@@ -22,8 +22,8 @@ use OCP\AppFramework\Db\Entity;
**/
class BillOwer extends Entity implements \JsonSerializable {
protected int $billid;
protected int $memberid;
protected int $billid = 0;
protected int $memberid = 0;
public function __construct() {
$this->addType('id', 'integer');

View File

@@ -152,7 +152,7 @@ class MemberMapper extends QBMapper {
->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.billid', 'bi.id'))
->innerJoin('bo', self::TABLE_NAME, 'm', $qb->expr()->eq('bo.memberid', 'm.id'));
$or = $qb->expr()->orx();
$or->add($qb->expr()->eq('bi.payerid', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$or->add($qb->expr()->eq('bi.payer_id', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$or->add($qb->expr()->eq('bo.memberid', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$qb->where($or);
if ($deleted !== null) {

View File

@@ -70,7 +70,7 @@ class ProjectMapper extends QBMapper {
try {
return $this->findEntity($qb);
} catch (DoesNotExistException | MultipleObjectsReturnedException |\OCP\DB\Exception $e) {
} catch (DoesNotExistException | MultipleObjectsReturnedException |Exception $e) {
return null;
}
}
@@ -135,7 +135,7 @@ class ProjectMapper extends QBMapper {
/**
* @param string $userId
* @return Project[]
* @throws \OCP\DB\Exception
* @throws Exception
*/
public function getProjects(string $userId): array {
$qb = $this->db->getQueryBuilder();
@@ -152,14 +152,14 @@ class ProjectMapper extends QBMapper {
/**
* @param string $projectId
* @return void
* @throws \OCP\DB\Exception
* @throws Exception
*/
public function deleteBillOwersOfProject(string $projectId): void {
// old style
/*
$query = 'DELETE FROM `*PREFIX*cospend_bill_owers`
WHERE `billid` IN (
SELECT `id` FROM `*PREFIX*cospend_bills` WHERE `projectid` = ?
SELECT `id` FROM `*PREFIX*cospend_bills` WHERE `project_id` = ?
)';
$this->db->executeQuery($query, [$projectId]);
*/
@@ -171,7 +171,7 @@ class ProjectMapper extends QBMapper {
$qb2->select('id')
->from('cospend_bills')
->where(
$qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb2->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->delete('cospend_bill_owers')
@@ -187,12 +187,12 @@ class ProjectMapper extends QBMapper {
* @param string $projectId
* @param int $timestamp
* @return void
* @throws \OCP\DB\Exception
* @throws Exception
*/
public function updateProjectLastChanged(string $projectId, int $timestamp): void {
$qb = $this->db->getQueryBuilder();
$qb->update($this->getTableName());
$qb->set('lastchanged', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT));
$qb->set('last_changed', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT));
$qb->where(
$qb->expr()->eq('id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);

View File

@@ -0,0 +1,128 @@
<?php
declare(strict_types=1);
namespace OCA\Cospend\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version030000Date20240911230019 extends SimpleMigrationStep {
public function __construct(
private IDBConnection $connection,
) {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$schemaChanged = false;
if ($schema->hasTable('cospend_bills')) {
$table = $schema->getTable('cospend_bills');
// rename columns
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('payer_id')) {
$table->addColumn('payer_id', Types::BIGINT, [
'notnull' => true,
'unsigned' => true,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('category_id')) {
$table->addColumn('category_id', Types::BIGINT, [
'notnull' => false,
'default' => null,
'unsigned' => true,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('payment_mode_id')) {
$table->addColumn('payment_mode_id', Types::BIGINT, [
'notnull' => false,
'default' => 0,
'unsigned' => true,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('payment_mode')) {
$table->addColumn('payment_mode', Types::STRING, [
'notnull' => false,
'length' => 1,
'default' => null,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('last_changed')) {
$table->addColumn('last_changed', Types::BIGINT, [
'notnull' => true,
'unsigned' => true,
'default' => 0,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('repeat_all_active')) {
$table->addColumn('repeat_all_active', Types::INTEGER, [
'notnull' => true,
'default' => 0,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('repeat_until')) {
$table->addColumn('repeat_until', Types::INTEGER, [
'notnull' => false,
'default' => null,
'length' => 20,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('repeat_frequency')) {
$table->addColumn('repeat_frequency', Types::INTEGER, [
'notnull' => true,
'default' => 1,
]);
$schemaChanged = true;
}
}
return $schemaChanged ? $schema : null;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_bills');
$qb->set('project_id', 'projectid');
$qb->set('payer_id', 'payerid');
$qb->set('category_id', 'categoryid');
$qb->set('payment_mode_id', 'paymentmodeid');
$qb->set('payment_mode', 'paymentmode');
$qb->set('last_changed', 'lastchanged');
$qb->set('repeat_all_active', 'repeatallactive');
$qb->set('repeat_until', 'repeatuntil');
$qb->set('repeat_frequency', 'repeatfreq');
$qb->executeStatement();
}
}

View File

@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
namespace OCA\Cospend\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version030000Date20240911230034 extends SimpleMigrationStep {
public function __construct() {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$schemaChanged = false;
if ($schema->hasTable('cospend_bills')) {
$table = $schema->getTable('cospend_bills');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
if ($table->hasColumn('payer_id') && $table->hasColumn('payerid')) {
$table->dropColumn('payerid');
$schemaChanged = true;
}
if ($table->hasColumn('category_id') && $table->hasColumn('categoryid')) {
$table->dropColumn('categoryid');
$schemaChanged = true;
}
if ($table->hasColumn('payment_mode_id') && $table->hasColumn('paymentmodeid')) {
$table->dropColumn('paymentmodeid');
$schemaChanged = true;
}
if ($table->hasColumn('payment_mode') && $table->hasColumn('paymentmode')) {
$table->dropColumn('paymentmode');
$schemaChanged = true;
}
if ($table->hasColumn('repeat_all_active') && $table->hasColumn('repeatallactive')) {
$table->dropColumn('repeatallactive');
$schemaChanged = true;
}
if ($table->hasColumn('repeat_until') && $table->hasColumn('repeatuntil')) {
$table->dropColumn('repeatuntil');
$schemaChanged = true;
}
if ($table->hasColumn('repeat_frequency') && $table->hasColumn('repeatfreq')) {
$table->dropColumn('repeatfreq');
$schemaChanged = true;
}
if ($table->hasColumn('last_changed') && $table->hasColumn('lastchanged')) {
$table->dropColumn('lastchanged');
$schemaChanged = true;
}
}
return $schemaChanged ? $schema : null;
}
}

View File

@@ -293,7 +293,7 @@ class LocalProjectService implements IProjectService {
$this->projectMapper->deleteBillOwersOfProject($projectId);
$associatedTableNames = [
'cospend_bills',
// 'cospend_bills',
'cospend_members',
'cospend_shares',
'cospend_currencies',
@@ -310,6 +310,11 @@ class LocalProjectService implements IProjectService {
$qb->executeStatement();
$qb = $this->db->getQueryBuilder();
}
$qb->delete('cospend_bills')
->where(
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->executeStatement();
$this->projectMapper->delete($dbProjectToDelete);
}
@@ -396,7 +401,7 @@ class LocalProjectService implements IProjectService {
$qb->selectAlias($qb->createFunction('SUM(amount)'), 'sum_amount')
->from('cospend_bills')
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('deleted', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
@@ -975,22 +980,22 @@ class LocalProjectService implements IProjectService {
$ts = (new DateTime())->getTimestamp();
$newBill = new Bill();
$newBill->setProjectid($projectId);
$newBill->setProjectId($projectId);
$newBill->setWhat($what);
if ($comment !== null) {
$newBill->setComment($comment);
}
$newBill->setTimestamp($dateTs);
$newBill->setAmount($amount);
$newBill->setPayerid($payer);
$newBill->setPayerId($payer);
$newBill->setRepeat($repeat);
$newBill->setRepeatallactive($repeatAllActive);
$newBill->setRepeatuntil($repeatUntil);
$newBill->setRepeatfreq($repeatFreq ?? 1);
$newBill->setCategoryid($categoryId ?? 0);
$newBill->setPaymentmode($paymentMode ?? 'n');
$newBill->setPaymentmodeid($paymentModeId ?? 0);
$newBill->setLastchanged($ts);
$newBill->setRepeatAllActive($repeatAllActive);
$newBill->setRepeatUntil($repeatUntil);
$newBill->setRepeatFrequency($repeatFreq ?? 1);
$newBill->setCategoryId($categoryId ?? 0);
$newBill->setPaymentMode($paymentMode ?? 'n');
$newBill->setPaymentModeId($paymentModeId ?? 0);
$newBill->setLastChanged($ts);
$newBill->setDeleted($deleted);
$createdBill = $this->billMapper->insert($newBill);
@@ -1796,11 +1801,11 @@ class LocalProjectService implements IProjectService {
$jsonElementsById = [];
if ($getCategories) {
$billTableField = 'categoryid';
$billTableField = 'category_id';
$dbTable = 'cospend_categories';
$alias = 'cat';
} else {
$billTableField = 'paymentmodeid';
$billTableField = 'payment_mode_id';
$dbTable = 'cospend_paymentmodes';
$alias = 'pm';
}
@@ -2178,7 +2183,7 @@ class LocalProjectService implements IProjectService {
// UPDATE
// set last modification timestamp
$ts = (new DateTime())->getTimestamp();
$dbBill->setLastchanged($ts);
$dbBill->setLastChanged($ts);
if ($what !== null) {
$dbBill->setWhat($what);
}
@@ -2194,13 +2199,13 @@ class LocalProjectService implements IProjectService {
}
}
if ($repeatFreq !== null) {
$dbBill->setRepeatfreq($repeatFreq);
$dbBill->setRepeatFrequency($repeatFreq);
}
if ($repeatUntil !== null) {
$dbBill->setRepeatuntil($repeatUntil === '' ? null : $repeatUntil);
$dbBill->setRepeatUntil($repeatUntil === '' ? null : $repeatUntil);
}
if ($repeatAllActive !== null) {
$dbBill->setRepeatallactive($repeatAllActive);
$dbBill->setRepeatAllActive($repeatAllActive);
}
// payment mode
if ($paymentModeId !== null) {
@@ -2212,8 +2217,8 @@ class LocalProjectService implements IProjectService {
) {
$paymentMode = $this->paymentModes[$paymentModeId]['old_id'];
}
$dbBill->setPaymentmodeid($paymentModeId);
$dbBill->setPaymentmode($paymentMode);
$dbBill->setPaymentModeId($paymentModeId);
$dbBill->setPaymentMode($paymentMode);
} elseif ($paymentMode !== null) {
// is there a pm with this old id? if yes, use it for new id
$paymentModeId = 0;
@@ -2223,11 +2228,11 @@ class LocalProjectService implements IProjectService {
break;
}
}
$dbBill->setPaymentmodeid($paymentModeId);
$dbBill->setPaymentmode($paymentMode);
$dbBill->setPaymentModeId($paymentModeId);
$dbBill->setPaymentMode($paymentMode);
}
if ($categoryId !== null) {
$dbBill->setCategoryid($categoryId);
$dbBill->setCategoryId($categoryId);
}
// priority to timestamp (moneybuster might send both for a moment)
if ($timestamp !== null) {
@@ -2243,7 +2248,7 @@ class LocalProjectService implements IProjectService {
$dbBill->setAmount($amount);
}
if ($payer !== null) {
$dbBill->setPayerid($payer);
$dbBill->setPayerId($payer);
}
$this->billMapper->update($dbBill);
@@ -2357,8 +2362,8 @@ class LocalProjectService implements IProjectService {
// get bills with repetition flag
$bills = $this->billMapper->getBillsToRepeat($billId);
foreach ($bills as $bill) {
if (!isset($timezoneByProjectId[$bill->getProjectid()])) {
$timezoneByProjectId[$bill->getProjectid()] = $this->getProjectTimeZone($bill->getProjectid());
if (!isset($timezoneByProjectId[$bill->getProjectId()])) {
$timezoneByProjectId[$bill->getProjectId()] = $this->getProjectTimeZone($bill->getProjectId());
}
}
$jsonBills = array_map(function (Bill $bill) {