Files
FinanceBuddy/Plugin.php

101 lines
4.5 KiB
PHP
Raw Normal View History

2026-07-07 15:53:33 -03:00
<?php
namespace Kanboard\Plugin\FinanceBuddy;
2026-07-07 15:53:33 -03:00
use Kanboard\Core\Plugin\Base;
class Plugin extends Base
{
public function initialize()
{
// Plugin stylesheet. Empty for now; the money badge and per-column total styling
// are added as those features land in later versions.
2026-07-07 15:53:33 -03:00
$this->hook->on('template:layout:css', array(
'template' => 'plugins/FinanceBuddy/Asset/css/finance.css',
2026-07-07 15:53:33 -03:00
));
// Per-board opt-in: a checkbox on the project's Settings -> Integrations page. Nothing
// else in the plugin renders or saves until a project manager enables it for that board.
$this->template->hook->attach('template:project:integrations', 'financeBuddy:project/integration');
// Finance fields in the task create/edit form (middle column). The template gates itself
// on the board being enabled. These are not task columns, so core cannot persist them:
// FinancePersistence strips them from the task write and stores them in task metadata,
// all synchronously via the model hooks below.
$this->template->hook->attach('template:task:form:second-column', 'financeBuddy:task/form_fields');
$persistence = new \Kanboard\Plugin\FinanceBuddy\Model\FinancePersistence($this->container);
$this->hook->on('model:task:creation:prepare', array($persistence, 'onCreationPrepare'));
$this->hook->on('model:task:creation:aftersave', array($persistence, 'onCreationAfterSave'));
$this->hook->on('model:task:modification:prepare', array($persistence, 'onModificationPrepare'));
// Carry the finance metadata onto copies (which Kanboard does not copy): native recurrence
// advances the installment for the next occurrence (creation:aftersave via recurrence_parent),
// and a manual Duplicate copies it verbatim.
$this->hook->on('model:task:duplication:aftersave', array($persistence, 'onDuplication'));
// RecoReco (calendar recurrence) spawns a copy and emits this signal. The clone already got
// the finance verbatim (via onDuplication above); here we advance the SOURCE template's
// installment, since RecoReco's ongoing card is the template that stays.
$this->hook->on('recoreco:task:spawned', array($persistence, 'onRecoRecoSpawn'));
// The line-3 money badge on each board card, rendered directly under the title. Two hooks:
// "private" is the normal board, "public" is the read-only board shared by token.
$this->template->hook->attach('template:board:private:task:after-title', 'financeBuddy:board/task_money');
$this->template->hook->attach('template:board:public:task:after-title', 'financeBuddy:board/task_money');
// Per-column net total (credits - debits) in the column header.
$this->template->hook->attach('template:board:column:header', 'financeBuddy:board/column_total');
2026-07-12 08:05:14 -03:00
// "Hide/Show column total" toggle in the column dropdown menu. The only column-menu hook
// renders after the native <ul>, so column_dropdown.php emits the item hidden and relocate.js
// moves it into the menu (same technique as BulkMoveTasks, with the stable-parent observer).
$this->template->hook->attach('template:board:column:dropdown', 'financeBuddy:board/column_dropdown');
$this->hook->on('template:layout:js', array(
'template' => 'plugins/FinanceBuddy/Asset/js/relocate.js',
));
// The same money badge at the top of the opened card (task view), under the title, so a
// card shows its money whether you are on the board or reading the card. Reuses the board
// badge template (both hooks pass $task).
$this->template->hook->attach('template:task:details:top', 'financeBuddy:board/task_money');
}
public function getHelpers()
{
return array(
'Plugin\FinanceBuddy\Helper' => array('FinanceHelper'),
);
2026-07-07 15:53:33 -03:00
}
public function getPluginName()
{
return 'FinanceBuddy';
2026-07-07 15:53:33 -03:00
}
public function getPluginDescription()
{
return t('Attach a money value (debit/credit and installments) to board cards, shown on the card and totalled per column. Opt-in per board.');
2026-07-07 15:53:33 -03:00
}
public function getPluginAuthor()
{
return 'Ruben (drbeco)';
}
public function getPluginVersion()
{
return '1.3.0';
2026-07-07 15:53:33 -03:00
}
public function getPluginHomepage()
{
return 'https://code.beco.cc/beco/FinanceBuddy';
2026-07-07 15:53:33 -03:00
}
public function getCompatibleVersion()
{
return '>=1.2.0';
}
}