Move budget outside of the core

The budget planning feature is now a plugin
See: https://github.com/kanboard/plugin-budget
This commit is contained in:
Frederic Guillot 2015-09-13 16:56:51 -04:00
parent d400f7c5be
commit 4b6672d0b3
47 changed files with 20 additions and 1596 deletions

View File

@ -4,7 +4,7 @@ CSS_APP = $(addprefix assets/css/src/, $(addsuffix .css, base links title table
CSS_PRINT = $(addprefix assets/css/src/, $(addsuffix .css, print links table board task comment subtask markdown))
CSS_VENDOR = $(addprefix assets/css/vendor/, $(addsuffix .css, jquery-ui.min jquery-ui-timepicker-addon.min chosen.min fullcalendar.min font-awesome.min c3.min))
JS_APP = $(addprefix assets/js/src/, $(addsuffix .js, Popover Dropdown Tooltip Markdown Sidebar Search App Screenshot Calendar Board Swimlane Gantt Task TaskRepartitionChart UserRepartitionChart CumulativeFlowDiagram BurndownChart BudgetChart AvgTimeColumnChart TaskTimeColumnChart LeadCycleTimeChart Router))
JS_APP = $(addprefix assets/js/src/, $(addsuffix .js, Popover Dropdown Tooltip Markdown Sidebar Search App Screenshot Calendar Board Swimlane Gantt Task TaskRepartitionChart UserRepartitionChart CumulativeFlowDiagram BurndownChart AvgTimeColumnChart TaskTimeColumnChart LeadCycleTimeChart Router))
JS_VENDOR = $(addprefix assets/js/vendor/, $(addsuffix .js, jquery-1.11.1.min jquery-ui.min jquery-ui-timepicker-addon.min jquery.ui.touch-punch.min chosen.jquery.min moment.min fullcalendar.min mousetrap.min mousetrap-global-bind.min))
JS_LANG = $(addprefix assets/js/vendor/lang/, $(addsuffix .js, da de es fi fr hu it ja nl nb pl pt pt-br ru sv sr th tr zh-cn))

View File

@ -1,135 +0,0 @@
<?php
namespace Controller;
/**
* Budget
*
* @package controller
* @author Frederic Guillot
*/
class Budget extends Base
{
/**
* Budget index page
*
* @access public
*/
public function index()
{
$project = $this->getProject();
$this->response->html($this->projectLayout('budget/index', array(
'daily_budget' => $this->budget->getDailyBudgetBreakdown($project['id']),
'project' => $project,
'title' => t('Budget')
), 'budget/sidebar'));
}
/**
* Cost breakdown by users/subtasks/tasks
*
* @access public
*/
public function breakdown()
{
$project = $this->getProject();
$paginator = $this->paginator
->setUrl('budget', 'breakdown', array('project_id' => $project['id']))
->setMax(30)
->setOrder('start')
->setDirection('DESC')
->setQuery($this->budget->getSubtaskBreakdown($project['id']))
->calculate();
$this->response->html($this->projectLayout('budget/breakdown', array(
'paginator' => $paginator,
'project' => $project,
'title' => t('Budget')
), 'budget/sidebar'));
}
/**
* Create budget lines
*
* @access public
*/
public function create(array $values = array(), array $errors = array())
{
$project = $this->getProject();
if (empty($values)) {
$values['date'] = date('Y-m-d');
}
$this->response->html($this->projectLayout('budget/create', array(
'lines' => $this->budget->getAll($project['id']),
'values' => $values + array('project_id' => $project['id']),
'errors' => $errors,
'project' => $project,
'title' => t('Budget lines')
), 'budget/sidebar'));
}
/**
* Validate and save a new budget
*
* @access public
*/
public function save()
{
$project = $this->getProject();
$values = $this->request->getValues();
list($valid, $errors) = $this->budget->validateCreation($values);
if ($valid) {
if ($this->budget->create($values['project_id'], $values['amount'], $values['comment'], $values['date'])) {
$this->session->flash(t('The budget line have been created successfully.'));
$this->response->redirect($this->helper->url->to('budget', 'create', array('project_id' => $project['id'])));
}
else {
$this->session->flashError(t('Unable to create the budget line.'));
}
}
$this->create($values, $errors);
}
/**
* Confirmation dialog before removing a budget
*
* @access public
*/
public function confirm()
{
$project = $this->getProject();
$this->response->html($this->projectLayout('budget/remove', array(
'project' => $project,
'budget_id' => $this->request->getIntegerParam('budget_id'),
'title' => t('Remove a budget line'),
), 'budget/sidebar'));
}
/**
* Remove a budget
*
* @access public
*/
public function remove()
{
$this->checkCSRFParam();
$project = $this->getProject();
if ($this->budget->remove($this->request->getIntegerParam('budget_id'))) {
$this->session->flash(t('Budget line removed successfully.'));
} else {
$this->session->flashError(t('Unable to remove this budget line.'));
}
$this->response->redirect($this->helper->url->to('budget', 'create', array('project_id' => $project['id'])));
}
}

View File

@ -1,89 +0,0 @@
<?php
namespace Controller;
/**
* Hourly Rate controller
*
* @package controller
* @author Frederic Guillot
*/
class Hourlyrate extends User
{
/**
* Display rate and form
*
* @access public
*/
public function index(array $values = array(), array $errors = array())
{
$user = $this->getUser();
$this->response->html($this->layout('hourlyrate/index', array(
'rates' => $this->hourlyRate->getAllByUser($user['id']),
'currencies_list' => $this->config->getCurrencies(),
'values' => $values + array('user_id' => $user['id']),
'errors' => $errors,
'user' => $user,
)));
}
/**
* Validate and save a new rate
*
* @access public
*/
public function save()
{
$values = $this->request->getValues();
list($valid, $errors) = $this->hourlyRate->validateCreation($values);
if ($valid) {
if ($this->hourlyRate->create($values['user_id'], $values['rate'], $values['currency'], $values['date_effective'])) {
$this->session->flash(t('Hourly rate created successfully.'));
$this->response->redirect($this->helper->url->to('hourlyrate', 'index', array('user_id' => $values['user_id'])));
}
else {
$this->session->flashError(t('Unable to save the hourly rate.'));
}
}
$this->index($values, $errors);
}
/**
* Confirmation dialag box to remove a row
*
* @access public
*/
public function confirm()
{
$user = $this->getUser();
$this->response->html($this->layout('hourlyrate/remove', array(
'rate_id' => $this->request->getIntegerParam('rate_id'),
'user' => $user,
)));
}
/**
* Remove a row
*
* @access public
*/
public function remove()
{
$this->checkCSRFParam();
$user = $this->getUser();
if ($this->hourlyRate->remove($this->request->getIntegerParam('rate_id'))) {
$this->session->flash(t('Rate removed successfully.'));
}
else {
$this->session->flash(t('Unable to remove this rate.'));
}
$this->response->redirect($this->helper->url->to('hourlyrate', 'index', array('user_id' => $user['id'])));
}
}

View File

@ -35,7 +35,6 @@ use Pimple\Container;
* @property \Model\Action $action
* @property \Model\Authentication $authentication
* @property \Model\Board $board
* @property \Model\Budget $budget
* @property \Model\Category $category
* @property \Model\Color $color
* @property \Model\Comment $comment
@ -43,7 +42,6 @@ use Pimple\Container;
* @property \Model\Currency $currency
* @property \Model\DateParser $dateParser
* @property \Model\File $file
* @property \Model\HourlyRate $hourlyRate
* @property \Model\LastLogin $lastLogin
* @property \Model\Link $link
* @property \Model\Notification $notification

View File

@ -28,4 +28,20 @@ abstract class PluginBase extends Base
{
return array();
}
/**
* Listen on internal events
*
* @access public
* @param string $event
* @param callable $callback
*/
public function on($event, $callback)
{
$container = $this->container;
$this->container['dispatcher']->addListener($event, function() use ($container, $callback) {
call_user_func($callback, $container);
});
}
}

View File

@ -20,13 +20,6 @@ class PluginLoader extends Base
*/
const TABLE_SCHEMA = 'plugin_schema_versions';
/**
* Plugin folder
*
* @var string
*/
const PATH = __DIR__.'/../../plugins';
/**
* Scan plugin folder and load plugins
*
@ -34,8 +27,8 @@ class PluginLoader extends Base
*/
public function scan()
{
if (file_exists(self::PATH)) {
$dir = new DirectoryIterator(self::PATH);
if (file_exists(__DIR__.'/../../plugins')) {
$dir = new DirectoryIterator(__DIR__.'/../../plugins');
foreach ($dir as $fileinfo) {
if (! $fileinfo->isDot() && $fileinfo->isDir()) {

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Vzdálený',
'Enabled' => 'Povoleno',
'Disabled' => 'Zakázáno',
'Google account linked' => 'Google účet byl propojen',
'Github account linked' => 'Mit Githubaccount verbunden',
'Username:' => 'Uživatelské jméno:',
'Name:' => 'Jméno:',
'Email:' => 'e-mail',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Horizontální rolování',
'Compact/wide view' => 'Kompaktní/plné zobrazení',
'No results match:' => 'Žádná shoda:',
'Remove hourly rate' => 'Stundensatz entfernen',
'Do you really want to remove this hourly rate?' => 'Opravdu chcete odstranit tuto hodinovou sazbu?',
'Hourly rates' => 'Hodinové sazby',
'Hourly rate' => 'Hodinová sazba',
'Currency' => 'Měna',
'Effective date' => 'Datum účinnosti',
'Add new rate' => 'Přidat novou hodinovou sazbu',
'Rate removed successfully.' => 'Sazba byla úspěšně odstraněna',
'Unable to remove this rate.' => 'Sazbu nelze odstranit.',
'Unable to save the hourly rate.' => 'Hodinovou sazbu nelze uložit',
'Hourly rate created successfully.' => 'Hodinová sazba byla úspěšně vytvořena.',
'Start time' => 'Počáteční datum',
'End time' => 'Konečné datum',
'Comment' => 'Komentář',
@ -703,34 +691,18 @@ return array(
'Files' => 'Soubory',
'Images' => 'Obrázky',
'Private project' => 'Soukromý projekt',
'Amount' => 'Částka',
// 'AUD - Australian Dollar' => '',
'Budget' => 'Rozpočet',
'Budget line' => 'Položka rozpočtu',
'Budget line removed successfully.' => 'Položka rozpočtu byla odstraněna',
'Budget lines' => 'Položky rozpočtu',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
'Cost' => 'Cena',
'Cost breakdown' => 'Rozpis nákladů',
'Custom Stylesheet' => 'Vlastní šablony stylů',
'download' => 'Stáhnout',
'Do you really want to remove this budget line?' => 'Opravdu chcete odstranit tuto rozpočtovou řádku?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Náklady',
'GBP - British Pound' => 'GBP - Britská Libra',
'INR - Indian Rupee' => 'INR - Indische Rupien',
'JPY - Japanese Yen' => 'JPY - Japanischer Yen',
'New budget line' => 'Nová položka rozpočtu',
'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar',
'Remove a budget line' => 'Budgetlinie entfernen',
'Remove budget line' => 'Budgetlinie entfernen',
'RSD - Serbian dinar' => 'RSD - Serbische Dinar',
'The budget line have been created successfully.' => 'Položka rozpočtu byla úspěšně vytvořena.',
'Unable to create the budget line.' => 'Nelze vytvořit rozpočtovou řádku.',
'Unable to remove this budget line.' => 'Nelze vyjmout rozpočtovou řádku.',
'USD - US Dollar' => 'USD - US Dollar',
'Remaining' => 'Zbývající',
'Destination column' => 'Cílový sloupec',
'Move the task to another column when assigned to a user' => 'Přesunout úkol do jiného sloupce, když je úkol přiřazen uživateli.',
'Move the task to another column when assignee is cleared' => 'Přesunout úkol do jiného sloupce, když je pověření uživatele vymazáno.',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Kurz',
'Change reference currency' => 'Změnit referenční měnu',
'Add a new currency rate' => 'Přidat nový směnný kurz',
'Currency rates are used to calculate project budget.' => 'Měnové sazby se používají k výpočtu rozpočtu projektu.',
'Reference currency' => 'Referenční měna',
'The currency rate have been added successfully.' => 'Směnný kurz byl úspěšně přidán.',
'Unable to add this currency rate.' => 'Nelze přidat tento směnný kurz',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s hat die Aufgabe #%d in die erste Swimlane verschoben',
'%s moved the task #%d to the swimlane "%s"' => '%s hat die Aufgabe #%d in die Swimlane "%s" verschoben',
// 'Swimlane' => '',
'Budget overview' => 'Budget Übersicht',
'Type' => 'Typ',
'There is not enough data to show something.' => 'Es gibt nicht genug Daten für die Anzeige',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remote',
'Enabled' => 'Aktiv',
'Disabled' => 'Deaktiveret',
'Google account linked' => 'Google-konto forbundet',
'Github account linked' => 'Github-konto forbundet',
'Username:' => 'Brugernavn',
'Name:' => 'Navn:',
'Email:' => 'Email:',
@ -667,17 +665,7 @@ return array(
// 'Horizontal scrolling' => '',
// 'Compact/wide view' => '',
// 'No results match:' => '',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
// 'Hourly rates' => '',
// 'Hourly rate' => '',
// 'Currency' => '',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
// 'Images' => '',
// 'Private project' => '',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
// 'Budget' => '',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
// 'Move the task to another column when assigned to a user' => '',
// 'Move the task to another column when assignee is cleared' => '',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remote',
'Enabled' => 'angeschaltet',
'Disabled' => 'abgeschaltet',
'Google account linked' => 'Mit Google-Account verbunden',
'Github account linked' => 'Mit Github-Account verbunden',
'Username:' => 'Benutzername',
'Name:' => 'Name',
'Email:' => 'E-Mail',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Horizontales Scrollen',
'Compact/wide view' => 'Kompakt/Breite-Ansicht',
'No results match:' => 'Keine Ergebnisse:',
'Remove hourly rate' => 'Stundensatz entfernen',
'Do you really want to remove this hourly rate?' => 'Diesen Stundensatz wirklich entfernen?',
'Hourly rates' => 'Stundensätze',
'Hourly rate' => 'Stundensatz',
'Currency' => 'Währung',
'Effective date' => 'Inkraftsetzung',
'Add new rate' => 'Neue Rate hinzufügen',
'Rate removed successfully.' => 'Rate erfolgreich entfernt',
'Unable to remove this rate.' => 'Nicht in der Lage, diese Rate zu entfernen.',
'Unable to save the hourly rate.' => 'Nicht in der Lage, diese Rate zu speichern',
'Hourly rate created successfully.' => 'Stundensatz erfolgreich angelegt.',
'Start time' => 'Startzeit',
'End time' => 'Endzeit',
'Comment' => 'Kommentar',
@ -703,34 +691,18 @@ return array(
'Files' => 'Dateien',
'Images' => 'Bilder',
'Private project' => 'privates Projekt',
'Amount' => 'Betrag',
'AUD - Australian Dollar' => 'AUD - Australische Dollar',
'Budget' => 'Budget',
'Budget line' => 'Budgetlinie',
'Budget line removed successfully.' => 'Budgetlinie erfolgreich entfernt',
'Budget lines' => 'Budgetlinien',
'CAD - Canadian Dollar' => 'CAD - Kanadische Dollar',
'CHF - Swiss Francs' => 'CHF - Schweizer Franken',
'Cost' => 'Kosten',
'Cost breakdown' => 'Kostenaufschlüsselung',
'Custom Stylesheet' => 'benutzerdefiniertes Stylesheet',
'download' => 'Download',
'Do you really want to remove this budget line?' => 'Soll diese Budgetlinie wirklich entfernt werden?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Kosten',
'GBP - British Pound' => 'GBP - Britische Pfund',
'INR - Indian Rupee' => 'INR - Indische Rupien',
'JPY - Japanese Yen' => 'JPY - Japanische Yen',
'New budget line' => 'Neue Budgetlinie',
'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar',
'Remove a budget line' => 'Budgetlinie entfernen',
'Remove budget line' => 'Budgetlinie entfernen',
'RSD - Serbian dinar' => 'RSD - Serbische Dinar',
'The budget line have been created successfully.' => 'Die Budgetlinie wurde erfolgreich angelegt.',
'Unable to create the budget line.' => 'Budgetlinie konnte nicht erstellt werden.',
'Unable to remove this budget line.' => 'Budgetlinie konnte nicht gelöscht werden.',
'USD - US Dollar' => 'USD - US-Dollar',
'Remaining' => 'Verbleibend',
'Destination column' => 'Zielspalte',
'Move the task to another column when assigned to a user' => 'Aufgabe in eine andere Spalte verschieben, wenn ein User zugeordnet wurde.',
'Move the task to another column when assignee is cleared' => 'Aufgabe in eine andere Spalte verschieben, wenn die Zuordnung gelöscht wurde.',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Kurse',
'Change reference currency' => 'Referenzwährung ändern',
'Add a new currency rate' => 'Neuen Währungskurs hinzufügen',
'Currency rates are used to calculate project budget.' => 'Währungskurse werden verwendet, um das Projektbudget zu berechnen.',
'Reference currency' => 'Referenzwährung',
'The currency rate have been added successfully.' => 'Der Währungskurs wurde erfolgreich hinzugefügt.',
'Unable to add this currency rate.' => 'Währungskurs konnte nicht hinzugefügt werden',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s hat die Aufgabe #%d in die erste Swimlane verschoben',
'%s moved the task #%d to the swimlane "%s"' => '%s hat die Aufgabe #%d in die Swimlane "%s" verschoben',
// 'Swimlane' => '',
'Budget overview' => 'Budget-Übersicht',
'Type' => 'Typ',
'There is not enough data to show something.' => 'Es gibt nicht genügend Daten für diese Anzeige',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remota',
'Enabled' => 'Activada',
'Disabled' => 'Desactivada',
'Google account linked' => 'Vinculada con Cuenta de Google',
'Github account linked' => 'Vinculada con Cuenta de Gitgub',
'Username:' => 'Nombre de Usuario:',
'Name:' => 'Nombre:',
'Email:' => 'Correo electrónico:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Desplazamiento horizontal',
'Compact/wide view' => 'Vista compacta/amplia',
'No results match:' => 'No hay resultados coincidentes:',
'Remove hourly rate' => 'Quitar cobro horario',
'Do you really want to remove this hourly rate?' => '¿Realmente quire quitar el cobro horario?',
'Hourly rates' => 'Cobros horarios',
'Hourly rate' => 'Cobro horario',
'Currency' => 'Moneda',
'Effective date' => 'Fecha efectiva',
'Add new rate' => 'Añadir nuevo cobro',
'Rate removed successfully.' => 'Cobro quitado con éxito.',
'Unable to remove this rate.' => 'No pude quitar este cobro.',
'Unable to save the hourly rate.' => 'No pude grabar el cobro horario.',
'Hourly rate created successfully.' => 'Cobro horario creado con éxito',
'Start time' => 'Tiempo de inicio',
'End time' => 'Tiempo de fin',
'Comment' => 'Comentario',
@ -703,34 +691,18 @@ return array(
'Files' => 'Ficheros',
'Images' => 'Imágenes',
'Private project' => 'Proyecto privado',
'Amount' => 'Cantidad',
'AUD - Australian Dollar' => 'AUD - Dólar australiano',
'Budget' => 'Presupuesto',
'Budget line' => 'Línea de presupuesto',
'Budget line removed successfully.' => 'Línea de presupuesto quitada con éxito',
'Budget lines' => 'Líneas de presupuesto',
'CAD - Canadian Dollar' => 'CAD - Dólar canadiense',
'CHF - Swiss Francs' => 'CHF - Francos suizos',
'Cost' => 'Costo',
'Cost breakdown' => 'Desglose de costes',
'Custom Stylesheet' => 'Hoja de estilo Personalizada',
'download' => 'descargar',
'Do you really want to remove this budget line?' => '¿Realmente quiere quitar esta línea de presupuesto?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Gastos',
'GBP - British Pound' => 'GBP - Libra británica',
'INR - Indian Rupee' => 'INR - Rupias indúes',
'JPY - Japanese Yen' => 'JPY - Yen japonés',
'New budget line' => 'Nueva línea de presupuesto',
'NZD - New Zealand Dollar' => 'NZD - Dóloar neocelandés',
'Remove a budget line' => 'Quitar una línea de presupuesto',
'Remove budget line' => 'Quitar línea de presupuesto',
'RSD - Serbian dinar' => 'RSD - Dinar serbio',
'The budget line have been created successfully.' => 'Se ha creado la línea de presupuesto con éxito.',
'Unable to create the budget line.' => 'No pude crear la línea de presupuesto.',
'Unable to remove this budget line.' => 'No pude quitar esta línea de presupuesto.',
'USD - US Dollar' => 'USD - Dólar Estadounidense',
'Remaining' => 'Restante',
'Destination column' => 'Columna destino',
'Move the task to another column when assigned to a user' => 'Mover la tarea a otra columna al asignarse al usuario',
'Move the task to another column when assignee is cleared' => 'Mover la tarea a otra columna al quitar el concesionario',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Cambio',
'Change reference currency' => 'Cambiar moneda de referencia',
'Add a new currency rate' => 'Añadir nuevo cambio de moneda',
'Currency rates are used to calculate project budget.' => 'Se usan los cambios de moneda para calcular el presupuesto del proyecto.',
'Reference currency' => 'Moneda de referencia',
'The currency rate have been added successfully.' => 'Se ha añadido el cambio de moneda con éxito',
'Unable to add this currency rate.' => 'No pude añadir este cambio de moneda.',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s movió la tarea #%d a la primera calle',
'%s moved the task #%d to the swimlane "%s"' => '%s movió la tarea #%d a la calle "%s"',
'Swimlane' => 'Calle',
'Budget overview' => 'Resumen del Presupuesto',
'Type' => 'Tipo',
'There is not enough data to show something.' => 'No hay datos suficientes como para mostrar algo.',
'Gravatar' => 'Gravatar',
'Hipchat' => 'Hipchat',
'Slack' => 'Desatendida',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Etä',
'Enabled' => 'Käytössä',
'Disabled' => 'Pois käytöstä',
'Google account linked' => 'Google-tili liitetty',
'Github account linked' => 'Github-tili liitetty',
'Username:' => 'Käyttäjänimi:',
'Name:' => 'Nimi:',
'Email:' => 'Sähköpostiosoite:',
@ -667,17 +665,7 @@ return array(
// 'Horizontal scrolling' => '',
// 'Compact/wide view' => '',
// 'No results match:' => '',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
// 'Hourly rates' => '',
// 'Hourly rate' => '',
// 'Currency' => '',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
// 'Images' => '',
// 'Private project' => '',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
// 'Budget' => '',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
// 'Move the task to another column when assigned to a user' => '',
// 'Move the task to another column when assignee is cleared' => '',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -397,8 +397,6 @@ return array(
'Remote' => 'Distant',
'Enabled' => 'Activé',
'Disabled' => 'Désactivé',
'Google account linked' => 'Compte Google attaché',
'Github account linked' => 'Compte Github attaché',
'Username:' => 'Nom d\'utilisateur :',
'Name:' => 'Nom :',
'Email:' => 'Email :',
@ -669,17 +667,7 @@ return array(
'Horizontal scrolling' => 'Défilement horizontal',
'Compact/wide view' => 'Basculer entre la vue compacte et étendue',
'No results match:' => 'Aucun résultat :',
'Remove hourly rate' => 'Supprimer un taux horaire',
'Do you really want to remove this hourly rate?' => 'Voulez-vous vraiment supprimer ce taux horaire ?',
'Hourly rates' => 'Taux horaires',
'Hourly rate' => 'Taux horaire',
'Currency' => 'Devise',
'Effective date' => 'Date d\'effet',
'Add new rate' => 'Ajouter un nouveau taux horaire',
'Rate removed successfully.' => 'Taux horaire supprimé avec succès.',
'Unable to remove this rate.' => 'Impossible de supprimer ce taux horaire.',
'Unable to save the hourly rate.' => 'Impossible de sauvegarder ce taux horaire.',
'Hourly rate created successfully.' => 'Taux horaire créé avec succès.',
'Start time' => 'Date de début',
'End time' => 'Date de fin',
'Comment' => 'Commentaire',
@ -705,34 +693,18 @@ return array(
'Files' => 'Fichiers',
'Images' => 'Images',
'Private project' => 'Projet privé',
'Amount' => 'Montant',
'AUD - Australian Dollar' => 'AUD - Dollar australien',
'Budget' => 'Budget',
'Budget line' => 'Ligne budgétaire',
'Budget line removed successfully.' => 'Ligne budgétaire supprimée avec succès.',
'Budget lines' => 'Lignes budgétaire',
'CAD - Canadian Dollar' => 'CAD - Dollar canadien',
'CHF - Swiss Francs' => 'CHF - Franc suisse',
'Cost' => 'Coût',
'Cost breakdown' => 'Détail des coûts',
'Custom Stylesheet' => 'Feuille de style personalisée',
'download' => 'télécharger',
'Do you really want to remove this budget line?' => 'Voulez-vous vraiment supprimer cette ligne budgétaire ?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Dépenses',
'GBP - British Pound' => 'GBP - Livre sterling',
'INR - Indian Rupee' => 'INR - Roupie indienne',
'JPY - Japanese Yen' => 'JPY - Yen',
'New budget line' => 'Nouvelle ligne budgétaire',
'NZD - New Zealand Dollar' => 'NZD - Dollar néo-zélandais',
'Remove a budget line' => 'Supprimer une ligne budgétaire',
'Remove budget line' => 'Supprimer une ligne budgétaire',
'RSD - Serbian dinar' => 'RSD - Dinar serbe',
'The budget line have been created successfully.' => 'La ligne de budgétaire a été créée avec succès.',
'Unable to create the budget line.' => 'Impossible de créer cette ligne budgétaire.',
'Unable to remove this budget line.' => 'Impossible de supprimer cette ligne budgétaire.',
'USD - US Dollar' => 'USD - Dollar américain',
'Remaining' => 'Restant',
'Destination column' => 'Colonne de destination',
'Move the task to another column when assigned to a user' => 'Déplacer la tâche dans une autre colonne lorsque celle-ci est assignée à quelqu\'un',
'Move the task to another column when assignee is cleared' => 'Déplacer la tâche dans une autre colonne lorsque celle-ci n\'est plus assignée',
@ -748,7 +720,6 @@ return array(
'Rate' => 'Taux',
'Change reference currency' => 'Changer la monnaie de référence',
'Add a new currency rate' => 'Ajouter un nouveau taux pour une devise',
'Currency rates are used to calculate project budget.' => 'Le cours des devises est utilisé pour calculer le budget des projets.',
'Reference currency' => 'Devise de référence',
'The currency rate have been added successfully.' => 'Le taux de change a été ajouté avec succès.',
'Unable to add this currency rate.' => 'Impossible d\'ajouter ce taux de change',
@ -880,9 +851,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s a déplacé la tâche n°%d dans la première swimlane',
'%s moved the task #%d to the swimlane "%s"' => '%s a déplacé la tâche n°%d dans la swimlane « %s »',
'Swimlane' => 'Swimlane',
'Budget overview' => 'Vue d\'ensemble du budget',
'Type' => 'Type',
'There is not enough data to show something.' => 'Il n\'y a pas assez de données pour montrer quelque chose.',
'Gravatar' => 'Gravatar',
'Hipchat' => 'Hipchat',
'Slack' => 'Slack',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Távoli',
'Enabled' => 'Engedélyezve',
'Disabled' => 'Letiltva',
'Google account linked' => 'Google fiók összekapcsolva',
'Github account linked' => 'Github fiók összekapcsolva',
'Username:' => 'Felhasználónév:',
'Name:' => 'Név:',
'Email:' => 'E-mail:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Vízszintes görgetés',
'Compact/wide view' => 'Kompakt/széles nézet',
'No results match:' => 'Nincs találat:',
'Remove hourly rate' => 'Órabér törlése',
'Do you really want to remove this hourly rate?' => 'Valóban törölni kívánja az órabért?',
'Hourly rates' => 'Órabérek',
'Hourly rate' => 'Órabér',
'Currency' => 'Pénznem',
'Effective date' => 'Hatálybalépés ideje',
'Add new rate' => 'Új bér',
'Rate removed successfully.' => 'Bér sikeresen törölve.',
'Unable to remove this rate.' => 'Bér törlése sikertelen.',
'Unable to save the hourly rate.' => 'Órabér mentése sikertelen.',
'Hourly rate created successfully.' => 'Órabér sikeresen mentve.',
'Start time' => 'Kezdés ideje',
'End time' => 'Végzés ideje',
'Comment' => 'Megjegyzés',
@ -703,34 +691,18 @@ return array(
'Files' => 'Fájlok',
'Images' => 'Képek',
'Private project' => 'Privát projekt',
'Amount' => 'Összeg',
'AUD - Australian Dollar' => 'AUD - Ausztrál dollár',
'Budget' => 'Költségvetés',
'Budget line' => 'Költségvetési tétel',
'Budget line removed successfully.' => 'Költségvetési tétel sikeresen törölve.',
'Budget lines' => 'Költségvetési tételek',
'CAD - Canadian Dollar' => 'CAD - Kanadai dollár',
'CHF - Swiss Francs' => 'CHF - Svájci frank',
'Cost' => 'Költség',
'Cost breakdown' => 'Költség visszaszámlálás',
'Custom Stylesheet' => 'Egyéni sítluslap',
'download' => 'letöltés',
'Do you really want to remove this budget line?' => 'Biztos törölni akarja ezt a költségvetési tételt?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Kiadások',
'GBP - British Pound' => 'GBP - Angol font',
'INR - Indian Rupee' => 'INR - Indiai rúpia',
'JPY - Japanese Yen' => 'JPY - Japán Yen',
'New budget line' => 'Új költségvetési tétel',
'NZD - New Zealand Dollar' => 'NZD - Új-Zélandi dollár',
'Remove a budget line' => 'Költségvetési tétel törlése',
'Remove budget line' => 'Költségvetési tétel törlése',
'RSD - Serbian dinar' => 'RSD - Szerb dínár',
'The budget line have been created successfully.' => 'Költségvetési tétel sikeresen létrehozva.',
'Unable to create the budget line.' => 'Költségvetési tétel létrehozása sikertelen.',
'Unable to remove this budget line.' => 'Költségvetési tétel törlése sikertelen.',
'USD - US Dollar' => 'USD - Amerikai ollár',
'Remaining' => 'Maradék',
'Destination column' => 'Cél oszlop',
'Move the task to another column when assigned to a user' => 'Feladat másik oszlopba helyezése felhasználóhoz rendélés után',
'Move the task to another column when assignee is cleared' => 'Feladat másik oszlopba helyezése felhasználóhoz rendélés törlésekor',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remoto',
'Enabled' => 'Abilitato',
'Disabled' => 'Disabilitato',
'Google account linked' => 'Account Google collegato',
'Github account linked' => 'Account Github collegato',
// 'Username:' => '',
'Name:' => 'Nome:',
// 'Email:' => '',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Scrolling orizzontale',
'Compact/wide view' => 'Vista compatta/estesa',
'No results match:' => 'Nessun risultato trovato:',
'Remove hourly rate' => 'Rimuovi tariffa oraria',
'Do you really want to remove this hourly rate?' => 'Vuoi davvero rimuovere questa tariffa oraria?',
'Hourly rates' => 'Tariffe orarie',
'Hourly rate' => 'Tariffa oraria',
'Currency' => 'Valuta',
'Effective date' => 'Data effettiva',
'Add new rate' => 'Aggiungi una nuova tariffa',
'Rate removed successfully.' => 'Tariffa rimossa con successo.',
'Unable to remove this rate.' => 'Impossibile rimuovere questa tariffa.',
'Unable to save the hourly rate.' => 'Impossibile salvare la tariffa oraria.',
'Hourly rate created successfully.' => 'Tariffa oraria creata con successo.',
'Start time' => 'Data di inizio',
'End time' => 'Data di completamento',
'Comment' => 'Commento',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
'Images' => 'Immagini',
'Private project' => 'Progetto privato',
'Amount' => 'Totale',
'AUD - Australian Dollar' => 'AUD - Dollari Australiani',
'Budget' => 'Bilancio',
'Budget line' => 'Limite di bilancio',
'Budget line removed successfully.' => 'Limite al bilancio rimosso con successo.',
'Budget lines' => 'Limiti al bilancio',
'CAD - Canadian Dollar' => 'CAD - Dollari Canadesi',
'CHF - Swiss Francs' => 'CHF - Franchi Svizzeri',
'Cost' => 'Costi',
'Cost breakdown' => 'Abbattimento dei costi',
'Custom Stylesheet' => 'CSS personalizzato',
// 'download' => '',
'Do you really want to remove this budget line?' => 'Vuoi davvero rimuovere questo limite al bilancio?',
// 'EUR - Euro' => '',
'Expenses' => 'Spese',
'GBP - British Pound' => 'GBP - Pound Inglesi',
'INR - Indian Rupee' => 'INR - Rupie Indiani',
'JPY - Japanese Yen' => 'JPY - Yen Giapponesi',
'New budget line' => 'Nuovo limite al bilancio',
'NZD - New Zealand Dollar' => 'NZD - Dollari della Nuova Zelanda',
'Remove a budget line' => 'Rimuovi un limite al bilancio',
'Remove budget line' => 'Rimuovi limite di bilancio',
'RSD - Serbian dinar' => 'RSD - Dinar Serbi',
'The budget line have been created successfully.' => 'Il limite al bilancio è stato creato correttamente',
'Unable to create the budget line.' => 'Impossibile creare il limite al bilancio',
'Unable to remove this budget line.' => 'Impossibile rimuovere questo limite al bilancio.',
'USD - US Dollar' => 'USD - Dollari Americani',
'Remaining' => 'Restanti',
'Destination column' => 'Colonna destinazione',
'Move the task to another column when assigned to a user' => 'Sposta il compito in un\'altra colonna quando viene assegnato ad un utente',
'Move the task to another column when assignee is cleared' => 'Sposta il compito in un\'altra colonna quando l\'assegnatario cancellato',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Cambio',
'Change reference currency' => 'Cambia la valuta di riferimento',
'Add a new currency rate' => 'Aggiungi un nuovo tasso di cambio',
'Currency rates are used to calculate project budget.' => 'I tassi di cambio sono utilizzati per calcolare i bilanci dei progetti',
'Reference currency' => 'Valuta di riferimento',
'The currency rate have been added successfully.' => 'Il tasso di cambio è stato aggiunto con successo.',
'Unable to add this currency rate.' => 'Impossibile aggiungere questo tasso di cambio.',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'リモート',
'Enabled' => '有効',
'Disabled' => '無効',
'Google account linked' => 'Google アカウントがリンク',
'Github account linked' => 'Github のアカウントがリンク',
'Username:' => 'ユーザ名:',
'Name:' => '名前:',
'Email:' => 'Email:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => '縦スクロール',
'Compact/wide view' => 'コンパクト/ワイドビュー',
'No results match:' => '結果が一致しませんでした',
'Remove hourly rate' => '毎時レートを削除',
'Do you really want to remove this hourly rate?' => '毎時レートを削除しますか?',
'Hourly rates' => '毎時レート',
'Hourly rate' => '毎時レート',
'Currency' => '通貨',
'Effective date' => '有効期限',
'Add new rate' => '新しいレート',
'Rate removed successfully.' => 'レートの削除に成功しました。',
'Unable to remove this rate.' => 'レートを削除できませんでした。',
'Unable to save the hourly rate.' => '時間毎のレートを保存できませんでした。',
'Hourly rate created successfully.' => '時間毎のレートを作成しました。',
'Start time' => '開始時間',
'End time' => '終了時間',
'Comment' => 'コメント',
@ -703,34 +691,18 @@ return array(
'Files' => 'ファイル',
'Images' => '画像',
'Private project' => 'プライベートプロジェクト',
'Amount' => '数量',
'AUD - Australian Dollar' => 'AUD - 豪ドル',
'Budget' => '予算',
'Budget line' => '予算ライン',
'Budget line removed successfully.' => '予算ラインを削除しました.',
'Budget lines' => '予算ライン',
'CAD - Canadian Dollar' => 'CAD - 加ドル',
'CHF - Swiss Francs' => 'CHF - スイスフラン',
'Cost' => 'コスト',
'Cost breakdown' => 'コストブレークダウン',
'Custom Stylesheet' => 'カスタムスタイルシート',
'download' => 'ダウンロード',
'Do you really want to remove this budget line?' => 'この予算ラインを本当に削除しますか?',
'EUR - Euro' => 'EUR - ユーロ',
'Expenses' => '支出',
'GBP - British Pound' => 'GBP - 独ポンド',
'INR - Indian Rupee' => 'INR - 伊ルピー',
'JPY - Japanese Yen' => 'JPY - 日本円',
'New budget line' => '新しい予算ライン',
'NZD - New Zealand Dollar' => 'NZD - NZ ドル',
'Remove a budget line' => '予算ラインの削除',
'Remove budget line' => '予算ラインの削除',
'RSD - Serbian dinar' => 'RSD - セルビアデナール',
'The budget line have been created successfully.' => '予算ラインを作成しました',
'Unable to create the budget line.' => '予算ラインを作成できませんでした。',
'Unable to remove this budget line.' => '予算ラインを削除できませんでした。',
'USD - US Dollar' => 'USD - 米ドル',
'Remaining' => '残り',
'Destination column' => '移動先のカラム',
'Move the task to another column when assigned to a user' => 'ユーザの割り当てをしたらタスクを他のカラムに移動',
'Move the task to another column when assignee is cleared' => 'ユーザの割り当てがなくなったらタスクを他のカラムに移動',
@ -746,7 +718,6 @@ return array(
'Rate' => 'レート',
'Change reference currency' => '現在の基軸通貨',
'Add a new currency rate' => '新しい通貨レートを追加',
'Currency rates are used to calculate project budget.' => '通貨レートはプロジェクト予算の算出に利用されます。',
'Reference currency' => '基軸通貨',
// 'The currency rate have been added successfully.' => '',
'Unable to add this currency rate.' => 'この通貨レートを追加できません。',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Fjernstyrt',
'Enabled' => 'Aktiv',
'Disabled' => 'Deaktivert',
'Google account linked' => 'Google-konto knyttet',
'Github account linked' => 'GitHub-konto knyttet',
'Username:' => 'Brukernavn',
'Name:' => 'Navn:',
'Email:' => 'Epost:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Bla horisontalt',
'Compact/wide view' => 'Kompakt/bred visning',
'No results match:' => 'Ingen resultater',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
'Hourly rates' => 'Timepriser',
'Hourly rate' => 'Timepris',
'Currency' => 'Valuta',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
'Files' => 'Filer',
'Images' => 'Bilder',
'Private project' => 'Privat prosjekt',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
'Budget' => 'Budsjett',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
'Move the task to another column when assigned to a user' => 'Flytt oppgaven til en annen kolonne når den er tildelt en bruker',
'Move the task to another column when assignee is cleared' => 'Flytt oppgaven til en annen kolonne når ppgavetildeling fjernes ',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remote',
'Enabled' => 'Actief',
'Disabled' => 'Inactief',
'Google account linked' => 'Gelinkt Google Account',
'Github account linked' => 'Gelinkt Github Account',
'Username:' => 'Gebruikersnaam :',
'Name:' => 'Naam :',
'Email:' => 'Email :',
@ -667,17 +665,7 @@ return array(
// 'Horizontal scrolling' => '',
// 'Compact/wide view' => '',
// 'No results match:' => '',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
// 'Hourly rates' => '',
// 'Hourly rate' => '',
// 'Currency' => '',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
// 'Images' => '',
// 'Private project' => '',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
// 'Budget' => '',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
// 'Move the task to another column when assigned to a user' => '',
// 'Move the task to another column when assignee is cleared' => '',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Zdalne',
'Enabled' => 'Odblokowane',
'Disabled' => 'Zablokowane',
'Google account linked' => 'Połączone konto Google',
'Github account linked' => 'Połączone konto Github',
'Username:' => 'Nazwa Użytkownika:',
'Name:' => 'Imię i Nazwisko',
'Email:' => 'Email: ',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Przewijanie poziome',
'Compact/wide view' => 'Pełny/Kompaktowy widok',
'No results match:' => 'Brak wyników:',
'Remove hourly rate' => 'Usuń stawkę godzinową',
'Do you really want to remove this hourly rate?' => 'Czy na pewno chcesz usunąć stawkę godzinową?',
'Hourly rates' => 'Stawki godzinowe',
'Hourly rate' => 'Stawka godzinowa',
'Currency' => 'Waluta',
'Effective date' => 'Data efektywna',
'Add new rate' => 'Dodaj nową stawkę',
'Rate removed successfully.' => 'Stawka usunięta.',
'Unable to remove this rate.' => 'Nie można usunąć tej stawki.',
'Unable to save the hourly rate.' => 'Nie można zapisać tej stawki godzinowej.',
'Hourly rate created successfully.' => 'Stawka godzinowa utworzona pomyślnie.',
'Start time' => 'Rozpoczęto',
'End time' => 'Zakończono',
'Comment' => 'Komentarz',
@ -703,34 +691,18 @@ return array(
'Files' => 'Pliki',
'Images' => 'Obrazy',
'Private project' => 'Projekt prywatny',
'Amount' => 'Ilość',
'AUD - Australian Dollar' => 'AUD - Dolar australijski',
'Budget' => 'Budżet',
'Budget line' => 'Linia budżetowa',
'Budget line removed successfully.' => 'Linia budżetowa usunięta.',
'Budget lines' => 'Linie budżetowe',
'CAD - Canadian Dollar' => 'CAD - Dolar kanadyjski',
'CHF - Swiss Francs' => 'CHF - Frank szwajcarski',
'Cost' => 'Koszt',
'Cost breakdown' => 'Analiza kosztów',
'Custom Stylesheet' => 'Niestandardowy arkusz stylów',
'download' => 'pobierz',
'Do you really want to remove this budget line?' => 'Czy chcesz usunąć tą linię budżetową?',
// 'EUR - Euro' => '',
'Expenses' => 'Wydatki',
'GBP - British Pound' => 'GBP - Funt brytyjski',
'INR - Indian Rupee' => 'INR - Rupia indyjska',
'JPY - Japanese Yen' => 'JPY - Jen japoński',
'New budget line' => 'Nowa linia budżetowa',
'NZD - New Zealand Dollar' => 'NZD - Dolar nowozelandzki',
'Remove a budget line' => 'Usuń linię budżetową',
'Remove budget line' => 'Usuń linię budżetową',
'RSD - Serbian dinar' => 'RSD - Dinar serbski',
// 'The budget line have been created successfully.' => '',
'Unable to create the budget line.' => 'Nie można utworzyć linii budżetowej',
'Unable to remove this budget line.' => 'Nie można usunąć tej linii budżetowej',
'USD - US Dollar' => 'USD - Dolar amerykański',
'Remaining' => 'Pozostało',
'Destination column' => 'Kolumna docelowa',
'Move the task to another column when assigned to a user' => 'Przenieś zadanie do innej kolumny gdy zostanie przypisane do osoby',
'Move the task to another column when assignee is cleared' => 'Przenieś zadanie do innej kolumny gdy osoba odpowiedzialna zostanie usunięta',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Kurs',
'Change reference currency' => 'Zmień walutę referencyjną',
'Add a new currency rate' => 'Dodaj nowy kurs waluty',
'Currency rates are used to calculate project budget.' => 'Kursy walut są używane do obliczeń budżetu projektu.',
'Reference currency' => 'Waluta referencyjna',
'The currency rate have been added successfully.' => 'Dodano kurs waluty',
'Unable to add this currency rate.' => 'Nie można dodać kursu waluty',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remoto',
'Enabled' => 'Habilitado',
'Disabled' => 'Desabilitado',
'Google account linked' => 'Conta do Google associada',
'Github account linked' => 'Conta do Github associada',
'Username:' => 'Usuário:',
'Name:' => 'Nome:',
'Email:' => 'E-mail:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Rolagem horizontal',
'Compact/wide view' => 'Alternar entre a vista compacta e ampliada',
'No results match:' => 'Nenhum resultado:',
'Remove hourly rate' => 'Retirar taxa horária',
'Do you really want to remove this hourly rate?' => 'Você deseja realmente remover esta taxa horária?',
'Hourly rates' => 'Taxas horárias',
'Hourly rate' => 'Taxa horária',
'Currency' => 'Moeda',
'Effective date' => 'Data efetiva',
'Add new rate' => 'Adicionar nova taxa',
'Rate removed successfully.' => 'Taxa removido com sucesso.',
'Unable to remove this rate.' => 'Impossível de remover esta taxa.',
'Unable to save the hourly rate.' => 'Impossível salvar a taxa horária.',
'Hourly rate created successfully.' => 'Taxa horária criada com sucesso.',
'Start time' => 'Horário de início',
'End time' => 'Horário de término',
'Comment' => 'comentário',
@ -703,34 +691,18 @@ return array(
'Files' => 'Arquivos',
'Images' => 'Imagens',
'Private project' => 'Projeto privado',
'Amount' => 'Quantia',
'AUD - Australian Dollar' => 'AUD - Dólar australiano',
'Budget' => 'Orçamento',
'Budget line' => 'Rubrica orçamental',
'Budget line removed successfully.' => 'Rubrica orçamental removida com sucesso',
'Budget lines' => 'Rubricas orçamentais',
'CAD - Canadian Dollar' => 'CAD - Dólar canadense',
'CHF - Swiss Francs' => 'CHF - Francos Suíços',
'Cost' => 'Custo',
'Cost breakdown' => 'Repartição dos custos',
'Custom Stylesheet' => 'Folha de estilo personalizado',
'download' => 'baixar',
'Do you really want to remove this budget line?' => 'Você deseja realmente remover esta rubrica orçamental?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Despesas',
'GBP - British Pound' => 'GBP - Libra Esterlina',
'INR - Indian Rupee' => 'INR - Rúpia indiana',
'JPY - Japanese Yen' => 'JPY - Iene japonês',
'New budget line' => 'Nova rubrica orçamental',
'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês',
'Remove a budget line' => 'Remover uma rubrica orçamental',
'Remove budget line' => 'Remover uma rubrica orçamental',
'RSD - Serbian dinar' => 'RSD - Dinar sérvio',
'The budget line have been created successfully.' => 'A rubrica orçamental foi criada com sucesso.',
'Unable to create the budget line.' => 'Impossível de adicionar esta rubrica orçamental.',
'Unable to remove this budget line.' => 'Impossível de remover esta rubrica orçamental.',
'USD - US Dollar' => 'USD - Dólar norte-americano',
'Remaining' => 'Restante',
'Destination column' => 'Coluna de destino',
'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um usuário',
'Move the task to another column when assignee is cleared' => 'Mover a tarefa para uma outra coluna quando esta não está atribuída',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Taxa',
'Change reference currency' => 'Mudar a moeda de referência',
'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda',
'Currency rates are used to calculate project budget.' => 'As taxas de câmbio são utilizadas para calcular o orçamento do projeto.',
'Reference currency' => 'Moeda de Referência',
'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.',
'Unable to add this currency rate.' => 'Impossível de adicionar essa taxa de câmbio.',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s moveu a tarefa n° %d no primeiro swimlane',
'%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa n° %d no swimlane "%s"',
'Swimlane' => 'Swimlane',
'Budget overview' => 'Visão geral do orçamento',
'Type' => 'Tipo',
'There is not enough data to show something.' => 'Não há dados suficientes para mostrar alguma coisa.',
'Gravatar' => 'Gravatar',
'Hipchat' => 'Hipchat',
'Slack' => 'Slack',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Remoto',
'Enabled' => 'Activado',
'Disabled' => 'Desactivado',
'Google account linked' => 'Conta do Google associada',
'Github account linked' => 'Conta do Github associada',
'Username:' => 'Utilizador:',
'Name:' => 'Nome:',
'Email:' => 'E-mail:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Deslocamento horizontal',
'Compact/wide view' => 'Alternar entre a vista compacta e ampliada',
'No results match:' => 'Nenhum resultado:',
'Remove hourly rate' => 'Retirar taxa horária',
'Do you really want to remove this hourly rate?' => 'Tem a certeza que quer remover esta taxa horária?',
'Hourly rates' => 'Taxas horárias',
'Hourly rate' => 'Taxa horária',
'Currency' => 'Moeda',
'Effective date' => 'Data efectiva',
'Add new rate' => 'Adicionar nova taxa',
'Rate removed successfully.' => 'Taxa removido com sucesso.',
'Unable to remove this rate.' => 'Impossível de remover esta taxa.',
'Unable to save the hourly rate.' => 'Impossível salvar a taxa horária.',
'Hourly rate created successfully.' => 'Taxa horária criada com sucesso.',
'Start time' => 'Horário de início',
'End time' => 'Horário de término',
'Comment' => 'comentário',
@ -703,34 +691,18 @@ return array(
'Files' => 'Arquivos',
'Images' => 'Imagens',
'Private project' => 'Projecto privado',
'Amount' => 'Quantia',
'AUD - Australian Dollar' => 'AUD - Dólar australiano',
'Budget' => 'Orçamento',
'Budget line' => 'Rubrica orçamental',
'Budget line removed successfully.' => 'Rubrica orçamental removida com sucesso',
'Budget lines' => 'Rubricas orçamentais',
'CAD - Canadian Dollar' => 'CAD - Dólar canadense',
'CHF - Swiss Francs' => 'CHF - Francos Suíços',
'Cost' => 'Custo',
'Cost breakdown' => 'Repartição dos custos',
'Custom Stylesheet' => 'Folha de estilos personalizada',
'download' => 'transferir',
'Do you really want to remove this budget line?' => 'Tem a certeza que quer remover esta rubrica orçamental?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Despesas',
'GBP - British Pound' => 'GBP - Libra Esterlina',
'INR - Indian Rupee' => 'INR - Rúpia indiana',
'JPY - Japanese Yen' => 'JPY - Iene japonês',
'New budget line' => 'Nova rubrica orçamental',
'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês',
'Remove a budget line' => 'Remover uma rubrica orçamental',
'Remove budget line' => 'Remover uma rubrica orçamental',
'RSD - Serbian dinar' => 'RSD - Dinar sérvio',
'The budget line have been created successfully.' => 'A rubrica orçamental foi criada com sucesso.',
'Unable to create the budget line.' => 'Impossível adicionar esta rubrica orçamental.',
'Unable to remove this budget line.' => 'Impossível remover esta rubrica orçamental.',
'USD - US Dollar' => 'USD - Dólar norte-americano',
'Remaining' => 'Restante',
'Destination column' => 'Coluna de destino',
'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um utilizador',
'Move the task to another column when assignee is cleared' => 'Mover a tarefa para uma outra coluna quando esta não está atribuída',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Taxa',
'Change reference currency' => 'Mudar a moeda de referência',
'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda',
'Currency rates are used to calculate project budget.' => 'As taxas de câmbio são utilizadas para calcular o orçamento do projecto.',
'Reference currency' => 'Moeda de Referência',
'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.',
'Unable to add this currency rate.' => 'Impossível adicionar essa taxa de câmbio.',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s moveu a tarefa n° %d no primeiro swimlane',
'%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa n° %d no swimlane "%s"',
'Swimlane' => 'Swimlane',
'Budget overview' => 'Visão geral do orçamento',
'Type' => 'Tipo',
'There is not enough data to show something.' => 'Não há dados suficientes para mostrar alguma coisa.',
'Gravatar' => 'Gravatar',
'Hipchat' => 'Hipchat',
'Slack' => 'Slack',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Удаленный',
'Enabled' => 'Включен',
'Disabled' => 'Выключены',
'Google account linked' => 'Профиль Google связан',
'Github account linked' => 'Профиль Github связан',
'Username:' => 'Имя пользователя:',
'Name:' => 'Имя:',
'Email:' => 'E-mail:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Широкий вид',
'Compact/wide view' => 'Компактный/широкий вид',
'No results match:' => 'Отсутствуют результаты:',
'Remove hourly rate' => 'Удалить почасовую ставку',
'Do you really want to remove this hourly rate?' => 'Вы действительно хотите удалить эту почасовую ставку?',
'Hourly rates' => 'Почасовые ставки',
'Hourly rate' => 'Почасовая ставка',
'Currency' => 'Валюта',
'Effective date' => 'Дата вступления в силу',
'Add new rate' => 'Добавить новый показатель',
'Rate removed successfully.' => 'Показатель успешно удален.',
'Unable to remove this rate.' => 'Не удается удалить этот показатель.',
'Unable to save the hourly rate.' => 'Не удается сохранить почасовую ставку.',
'Hourly rate created successfully.' => 'Почасовая ставка успешно создана.',
'Start time' => 'Время начала',
'End time' => 'Время завершения',
'Comment' => 'Комментарий',
@ -703,34 +691,18 @@ return array(
'Files' => 'Файлы',
'Images' => 'Изображения',
'Private project' => 'Приватный проект',
'Amount' => 'Количество',
'AUD - Australian Dollar' => 'AUD - Австралийский доллар',
'Budget' => 'Бюджет',
'Budget line' => 'Статья бюджета',
'Budget line removed successfully.' => 'Бюджетная статья успешно удалена.',
'Budget lines' => 'Статьи бюджета',
'CAD - Canadian Dollar' => 'CAD - Канадский доллар',
'CHF - Swiss Francs' => 'CHF - Швейцарский Франк',
'Cost' => 'Стоимость',
'Cost breakdown' => 'Детализация затрат',
'Custom Stylesheet' => 'Пользовательский стиль',
'download' => 'загрузить',
'Do you really want to remove this budget line?' => 'Вы действительно хотите удалить эту статью бюджета?',
'EUR - Euro' => 'EUR - Евро',
'Expenses' => 'Расходы',
'GBP - British Pound' => 'GBP - Британский фунт',
'INR - Indian Rupee' => 'INR - Индийский рупий',
'JPY - Japanese Yen' => 'JPY - Японскай йена',
'New budget line' => 'Новая статья бюджета',
'NZD - New Zealand Dollar' => 'NZD - Новозеландский доллар',
'Remove a budget line' => 'Удалить строку в бюджете',
'Remove budget line' => 'Удалить статью бюджета',
'RSD - Serbian dinar' => 'RSD - Сербский динар',
'The budget line have been created successfully.' => 'Статья бюджета успешно создана.',
'Unable to create the budget line.' => 'Не удается создать эту статью бюджета.',
'Unable to remove this budget line.' => 'Не удается удалить эту статью бюджета.',
'USD - US Dollar' => 'USD - доллар США',
'Remaining' => 'Прочее',
'Destination column' => 'Колонка назначения',
'Move the task to another column when assigned to a user' => 'Переместить задачу в другую колонку, когда она назначена пользователю',
'Move the task to another column when assignee is cleared' => 'Переместить задачу в другую колонку, когда назначение снято ',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Курс',
'Change reference currency' => 'Изменить справочник валют',
'Add a new currency rate' => 'Add a new currency rate',
'Currency rates are used to calculate project budget.' => 'Курсы валют используются для расчета бюджета проекта.',
'Reference currency' => 'Справочник валют',
'The currency rate have been added successfully.' => 'Курс валюты был успешно добавлен.',
'Unable to add this currency rate.' => 'Невозможно добавить этот курс валюты.',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Udaljno',
'Enabled' => 'Omogući',
'Disabled' => 'Onemogući',
'Google account linked' => 'Połączone konto Google',
'Github account linked' => 'Połączone konto Github',
'Username:' => 'Korisničko ime:',
'Name:' => 'Ime i Prezime',
'Email:' => 'Email: ',
@ -667,17 +665,7 @@ return array(
// 'Horizontal scrolling' => '',
// 'Compact/wide view' => '',
// 'No results match:' => '',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
// 'Hourly rates' => '',
// 'Hourly rate' => '',
// 'Currency' => '',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
// 'Images' => '',
// 'Private project' => '',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
// 'Budget' => '',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
// 'Move the task to another column when assigned to a user' => '',
// 'Move the task to another column when assignee is cleared' => '',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Fjärr',
'Enabled' => 'Aktiverad',
'Disabled' => 'Inaktiverad',
'Google account linked' => 'Googlekonto länkat',
'Github account linked' => 'Githubkonto länkat',
'Username:' => 'Användarnam:',
'Name:' => 'Namn:',
'Email:' => 'E-post:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Horisontell scroll',
'Compact/wide view' => 'Kompakt/bred vy',
'No results match:' => 'Inga matchande resultat',
'Remove hourly rate' => 'Ta bort timtaxa',
'Do you really want to remove this hourly rate?' => 'Vill du verkligen ta bort denna timtaxa?',
'Hourly rates' => 'Timtaxor',
'Hourly rate' => 'Timtaxa',
'Currency' => 'Valuta',
'Effective date' => 'Giltighetsdatum',
'Add new rate' => 'Lägg till ny taxa',
'Rate removed successfully.' => 'Taxan togs bort.',
'Unable to remove this rate.' => 'Kunde inte ta bort taxan.',
'Unable to save the hourly rate.' => 'Kunde inte spara timtaxan.',
'Hourly rate created successfully.' => 'Timtaxan skapades.',
'Start time' => 'Starttid',
'End time' => 'Sluttid',
'Comment' => 'Kommentar',
@ -703,34 +691,18 @@ return array(
'Files' => 'Filer',
'Images' => 'Bilder',
'Private project' => 'Privat projekt',
'Amount' => 'Belopp',
'AUD - Australian Dollar' => 'AUD - Australiska dollar',
'Budget' => 'Budget',
'Budget line' => 'Budgetlinje',
'Budget line removed successfully.' => 'Budgetlinjen togs bort.',
'Budget lines' => 'Budgetlinjer',
'CAD - Canadian Dollar' => 'CAD - Kanadensiska dollar',
'CHF - Swiss Francs' => 'CHF - Schweiziska Franc',
'Cost' => 'Kostnad',
'Cost breakdown' => 'Kostnadssammanställning',
'Custom Stylesheet' => 'Anpassad stilmall',
'download' => 'ladda ned',
'Do you really want to remove this budget line?' => 'Vill du verkligen ta bort budgetlinjen?',
'EUR - Euro' => 'EUR - Euro',
'Expenses' => 'Utgifter',
'GBP - British Pound' => 'GBP - Brittiska Pund',
'INR - Indian Rupee' => 'INR - Indiska Rupier',
'JPY - Japanese Yen' => 'JPY - Japanska Yen',
'New budget line' => 'Ny budgetlinje',
'NZD - New Zealand Dollar' => 'NZD - Nya Zeeländska Dollar',
'Remove a budget line' => 'Ta bort en budgetlinje',
'Remove budget line' => 'Ta bort budgetlinje',
'RSD - Serbian dinar' => 'RSD - Serbiska Dinarer',
'The budget line have been created successfully.' => 'Budgetlinjen har skapats.',
'Unable to create the budget line.' => 'Kunde inte skapa budgetlinjen.',
'Unable to remove this budget line.' => 'Kunde inte ta bort budgetlinjen.',
'USD - US Dollar' => 'USD - Amerikanska Dollar',
'Remaining' => 'Återstående',
'Destination column' => 'Målkolumn',
'Move the task to another column when assigned to a user' => 'Flytta uppgiften till en annan kolumn när den tilldelats en användare',
'Move the task to another column when assignee is cleared' => 'Flytta uppgiften till en annan kolumn när tilldelningen tas bort.',
@ -746,7 +718,6 @@ return array(
'Rate' => 'Kurs',
'Change reference currency' => 'Ändra referenskurs',
'Add a new currency rate' => 'Lägg till ny valutakurs',
'Currency rates are used to calculate project budget.' => 'Valutakurser används för att beräkna projektbudget.',
'Reference currency' => 'Referensvaluta',
'The currency rate have been added successfully.' => 'Valutakursen har lagts till.',
'Unable to add this currency rate.' => 'Kunde inte lägga till valutakursen.',
@ -878,9 +849,6 @@ return array(
'%s moved the task #%d to the first swimlane' => '%s flyttade uppgiften #%d till första swimlane',
'%s moved the task #%d to the swimlane "%s"' => '%s flyttade uppgiften #%d till swimlane "%s"',
'Swimlane' => 'Swimlane',
'Budget overview' => 'Budgetöversikt',
'Type' => 'Typ',
'There is not enough data to show something.' => 'Det finns inte tillräckligt mycket data för att visa något.',
'Gravatar' => 'Gravatar',
'Hipchat' => 'Hipchat',
'Slack' => 'Slack',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'รีโมท',
'Enabled' => 'เปิดการใช้',
'Disabled' => 'ปิดการใช้',
'Google account linked' => 'เชื่อมกับกูเกิลแอคเคาท์',
'Github account linked' => 'เชื่อมกับกิทฮับแอคเคาท์',
'Username:' => 'ชื่อผู้ใช้:',
'Name:' => 'ชื่อ:',
'Email:' => 'อีเมล:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'เลื่อนตามแนวนอน',
'Compact/wide view' => 'พอดี/กว้าง มุมมอง',
'No results match:' => 'ไม่มีผลลัพท์ที่ตรง',
'Remove hourly rate' => 'ลบอัตรารายชั่วโมง',
'Do you really want to remove this hourly rate?' => 'คุณต้องการลบอัตรารายชั่วโมง?',
'Hourly rates' => 'อัตรารายชั่วโมง',
'Hourly rate' => 'อัตรารายชั่วโมง',
'Currency' => 'สกุลเงิน',
'Effective date' => 'วันที่จ่าย',
'Add new rate' => 'เพิ่มอัตราใหม่',
'Rate removed successfully.' => 'ลบอัตราเรียบร้อยแล้ว',
'Unable to remove this rate.' => 'ไม่สามารถลบอัตรานี้ได้',
'Unable to save the hourly rate.' => 'ไม่สามารถบันทึกอัตรารายชั่วโมง',
'Hourly rate created successfully.' => 'อัตรารายชั่วโมงสร้างเรียบร้อยแล้ว',
'Start time' => 'เวลาเริ่มต้น',
'End time' => 'เวลาจบ',
'Comment' => 'ความคิดเห็น',
@ -703,34 +691,18 @@ return array(
'Files' => 'ไฟล์',
'Images' => 'รูปภาพ',
'Private project' => 'โปรเจคส่วนตัว',
'Amount' => 'จำนวนเงิน',
// 'AUD - Australian Dollar' => '',
'Budget' => 'งบประมาณ',
'Budget line' => 'วงเงินงบประมาณ',
'Budget line removed successfully.' => 'ลบวงเงินประมาณเรียบร้อยแล้ว',
'Budget lines' => 'วงเงินงบประมาณ',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
'Cost' => 'มูลค่า',
'Cost breakdown' => 'รายละเอียดค่าใช้จ่าย',
// 'Custom Stylesheet' => '',
'download' => 'ดาวน์โหลด',
'Do you really want to remove this budget line?' => 'คุณต้องการลบวงเงินงบประมาณนี้?',
// 'EUR - Euro' => '',
'Expenses' => 'รายจ่าย',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
'New budget line' => 'วงเงินงบประมาณใหม่',
// 'NZD - New Zealand Dollar' => '',
'Remove a budget line' => 'ลบวงเงินประมาณ',
'Remove budget line' => 'ลบวงเงินประมาณ',
// 'RSD - Serbian dinar' => '',
'The budget line have been created successfully.' => 'สร้างวงเงินงบประมาณเรียบร้อยแล้ว',
'Unable to create the budget line.' => 'ไม่สามารถสร้างวงเงินงบประมาณได้',
'Unable to remove this budget line.' => 'ไม่สามารถลบวงเงินงบประมาณนี้',
// 'USD - US Dollar' => '',
'Remaining' => 'เหลืออยู่',
'Destination column' => 'คอลัมน์เป้าหมาย',
'Move the task to another column when assigned to a user' => 'ย้ายงานไปคอลัมน์อื่นเมื่อกำหนดบุคคลรับผิดชอบ',
'Move the task to another column when assignee is cleared' => 'ย้ายงานไปคอลัมน์อื่นเมื่อไม่กำหนดบุคคลรับผิดชอบ',
@ -746,7 +718,6 @@ return array(
'Rate' => 'อัตรา',
// 'Change reference currency' => '',
'Add a new currency rate' => 'เพิ่มอัตราแลกเปลี่ยนเงินตราใหม่',
'Currency rates are used to calculate project budget.' => 'อัตราแลกเปลี่ยนเงินตราถูกใช้ในการคำนวณงบประมาณของโปรเจค',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => 'Uzak',
'Enabled' => 'Etkinleştirildi',
'Disabled' => 'Devre dışı bırakıldı',
'Google account linked' => 'Google hesabıyla bağlı',
'Github account linked' => 'Github hesabıyla bağlı',
'Username:' => 'Kullanıcı adı',
'Name:' => 'Ad',
'Email:' => 'E-Posta',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => 'Geniş görünüm',
'Compact/wide view' => 'Ekrana sığdır / Geniş görünüm',
// 'No results match:' => '',
// 'Remove hourly rate' => '',
// 'Do you really want to remove this hourly rate?' => '',
// 'Hourly rates' => '',
// 'Hourly rate' => '',
// 'Currency' => '',
// 'Effective date' => '',
// 'Add new rate' => '',
// 'Rate removed successfully.' => '',
// 'Unable to remove this rate.' => '',
// 'Unable to save the hourly rate.' => '',
// 'Hourly rate created successfully.' => '',
// 'Start time' => '',
// 'End time' => '',
// 'Comment' => '',
@ -703,34 +691,18 @@ return array(
// 'Files' => '',
// 'Images' => '',
// 'Private project' => '',
// 'Amount' => '',
// 'AUD - Australian Dollar' => '',
// 'Budget' => '',
// 'Budget line' => '',
// 'Budget line removed successfully.' => '',
// 'Budget lines' => '',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
// 'Cost' => '',
// 'Cost breakdown' => '',
// 'Custom Stylesheet' => '',
// 'download' => '',
// 'Do you really want to remove this budget line?' => '',
// 'EUR - Euro' => '',
// 'Expenses' => '',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
// 'New budget line' => '',
// 'NZD - New Zealand Dollar' => '',
// 'Remove a budget line' => '',
// 'Remove budget line' => '',
// 'RSD - Serbian dinar' => '',
// 'The budget line have been created successfully.' => '',
// 'Unable to create the budget line.' => '',
// 'Unable to remove this budget line.' => '',
// 'USD - US Dollar' => '',
// 'Remaining' => '',
// 'Destination column' => '',
// 'Move the task to another column when assigned to a user' => '',
// 'Move the task to another column when assignee is cleared' => '',
@ -746,7 +718,6 @@ return array(
// 'Rate' => '',
// 'Change reference currency' => '',
// 'Add a new currency rate' => '',
// 'Currency rates are used to calculate project budget.' => '',
// 'Reference currency' => '',
// 'The currency rate have been added successfully.' => '',
// 'Unable to add this currency rate.' => '',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
// 'Budget overview' => '',
// 'Type' => '',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -395,8 +395,6 @@ return array(
'Remote' => '远程',
'Enabled' => '启用',
'Disabled' => '停用',
'Google account linked' => '已经链接谷歌账号',
'Github account linked' => '已经链接Github账号',
'Username:' => '用户名:',
'Name:' => '姓名:',
'Email:' => '电子邮件:',
@ -667,17 +665,7 @@ return array(
'Horizontal scrolling' => '水平滚动',
'Compact/wide view' => '紧凑/宽视图',
'No results match:' => '无匹配结果:',
'Remove hourly rate' => '删除小时工资',
'Do you really want to remove this hourly rate?' => '确定要删除此计时工资吗?',
'Hourly rates' => '小时工资',
'Hourly rate' => '小时工资',
'Currency' => '货币',
'Effective date' => '开始时间',
'Add new rate' => '添加小时工资',
'Rate removed successfully.' => '成功删除工资。',
'Unable to remove this rate.' => '无法删除此小时工资。',
'Unable to save the hourly rate.' => '无法删除小时工资。',
'Hourly rate created successfully.' => '成功创建小时工资。',
'Start time' => '开始时间',
'End time' => '结束时1间',
'Comment' => '注释',
@ -703,34 +691,18 @@ return array(
'Files' => '文件',
'Images' => '图片',
'Private project' => '私人项目',
'Amount' => '数量',
// 'AUD - Australian Dollar' => '',
'Budget' => '预算',
'Budget line' => '预算线',
'Budget line removed successfully.' => '成功删除预算线',
'Budget lines' => '预算线',
// 'CAD - Canadian Dollar' => '',
// 'CHF - Swiss Francs' => '',
'Cost' => '成本',
'Cost breakdown' => '成本分解',
'Custom Stylesheet' => '自定义样式表',
'download' => '下载',
'Do you really want to remove this budget line?' => '确定要删除此预算线吗?',
// 'EUR - Euro' => '',
'Expenses' => '花费',
// 'GBP - British Pound' => '',
// 'INR - Indian Rupee' => '',
// 'JPY - Japanese Yen' => '',
'New budget line' => '新预算线',
// 'NZD - New Zealand Dollar' => '',
'Remove a budget line' => '删除预算线',
'Remove budget line' => '删除预算线',
// 'RSD - Serbian dinar' => '',
'The budget line have been created successfully.' => '成功创建预算线。',
'Unable to create the budget line.' => '无法创建预算线。',
'Unable to remove this budget line.' => '无法删除此预算线。',
// 'USD - US Dollar' => '',
'Remaining' => '剩余',
'Destination column' => '目标栏目',
'Move the task to another column when assigned to a user' => '指定负责人时移动到其它栏目',
'Move the task to another column when assignee is cleared' => '移除负责人时移动到其它栏目',
@ -746,7 +718,6 @@ return array(
'Rate' => '汇率',
'Change reference currency' => '修改参考货币',
'Add a new currency rate' => '添加新汇率',
'Currency rates are used to calculate project budget.' => '汇率会用来计算项目预算。',
'Reference currency' => '参考货币',
'The currency rate have been added successfully.' => '成功添加汇率。',
'Unable to add this currency rate.' => '无法添加此汇率',
@ -878,9 +849,6 @@ return array(
// '%s moved the task #%d to the first swimlane' => '',
// '%s moved the task #%d to the swimlane "%s"' => '',
// 'Swimlane' => '',
'Budget overview' => '预算概览',
'Type' => '类型',
// 'There is not enough data to show something.' => '',
// 'Gravatar' => '',
// 'Hipchat' => '',
// 'Slack' => '',

View File

@ -64,7 +64,6 @@ class Acl extends Base
'export' => '*',
'project' => array('edit', 'update', 'share', 'integration', 'users', 'alloweverybody', 'allow', 'setowner', 'revoke', 'duplicate', 'disable', 'enable'),
'swimlane' => '*',
'budget' => '*',
'gantt' => array('project', 'savetaskdate', 'task', 'savetask'),
);

View File

@ -1,214 +0,0 @@
<?php
namespace Model;
use DateInterval;
use DateTime;
use SimpleValidator\Validator;
use SimpleValidator\Validators;
/**
* Budget
*
* @package model
* @author Frederic Guillot
*/
class Budget extends Base
{
/**
* SQL table name
*
* @var string
*/
const TABLE = 'budget_lines';
/**
* Get all budget lines for a project
*
* @access public
* @param integer $project_id
* @return array
*/
public function getAll($project_id)
{
return $this->db->table(self::TABLE)->eq('project_id', $project_id)->desc('date')->findAll();
}
/**
* Get the current total of the budget
*
* @access public
* @param integer $project_id
* @return float
*/
public function getTotal($project_id)
{
$result = $this->db->table(self::TABLE)->columns('SUM(amount) as total')->eq('project_id', $project_id)->findOne();
return isset($result['total']) ? (float) $result['total'] : 0;
}
/**
* Get breakdown by tasks/subtasks/users
*
* @access public
* @param integer $project_id
* @return \PicoDb\Table
*/
public function getSubtaskBreakdown($project_id)
{
return $this->db
->table(SubtaskTimeTracking::TABLE)
->columns(
SubtaskTimeTracking::TABLE.'.id',
SubtaskTimeTracking::TABLE.'.user_id',
SubtaskTimeTracking::TABLE.'.subtask_id',
SubtaskTimeTracking::TABLE.'.start',
SubtaskTimeTracking::TABLE.'.time_spent',
Subtask::TABLE.'.task_id',
Subtask::TABLE.'.title AS subtask_title',
Task::TABLE.'.title AS task_title',
Task::TABLE.'.project_id',
User::TABLE.'.username',
User::TABLE.'.name'
)
->join(Subtask::TABLE, 'id', 'subtask_id')
->join(Task::TABLE, 'id', 'task_id', Subtask::TABLE)
->join(User::TABLE, 'id', 'user_id')
->eq(Task::TABLE.'.project_id', $project_id)
->callback(array($this, 'applyUserRate'));
}
/**
* Gather necessary information to display the budget graph
*
* @access public
* @param integer $project_id
* @return array
*/
public function getDailyBudgetBreakdown($project_id)
{
$out = array();
$in = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->gt('amount', 0)->asc('date')->getAll('date', 'amount');
$time_slots = $this->getSubtaskBreakdown($project_id)->findAll();
foreach ($time_slots as $slot) {
$date = date('Y-m-d', $slot['start']);
if (! isset($out[$date])) {
$out[$date] = 0;
}
$out[$date] += $slot['cost'];
}
$start = key($in) ?: key($out);
$end = new DateTime;
$left = 0;
$serie = array();
for ($today = new DateTime($start); $today <= $end; $today->add(new DateInterval('P1D'))) {
$date = $today->format('Y-m-d');
$today_in = isset($in[$date]) ? (int) $in[$date] : 0;
$today_out = isset($out[$date]) ? (int) $out[$date] : 0;
if ($today_in > 0 || $today_out > 0) {
$left += $today_in;
$left -= $today_out;
$serie[] = array(
'date' => $date,
'in' => $today_in,
'out' => -$today_out,
'left' => $left,
);
}
}
return $serie;
}
/**
* Filter callback to apply the rate according to the effective date
*
* @access public
* @param array $records
* @return array
*/
public function applyUserRate(array $records)
{
$rates = $this->hourlyRate->getAllByProject($records[0]['project_id']);
foreach ($records as &$record) {
$hourly_price = 0;
foreach ($rates as $rate) {
if ($rate['user_id'] == $record['user_id'] && date('Y-m-d', $rate['date_effective']) <= date('Y-m-d', $record['start'])) {
$hourly_price = $this->currency->getPrice($rate['currency'], $rate['rate']);
break;
}
}
$record['cost'] = $hourly_price * $record['time_spent'];
}
return $records;
}
/**
* Add a new budget line in the database
*
* @access public
* @param integer $project_id
* @param float $amount
* @param string $comment
* @param string $date
* @return boolean|integer
*/
public function create($project_id, $amount, $comment, $date = '')
{
$values = array(
'project_id' => $project_id,
'amount' => $amount,
'comment' => $comment,
'date' => $date ?: date('Y-m-d'),
);
return $this->persist(self::TABLE, $values);
}
/**
* Remove a specific budget line
*
* @access public
* @param integer $budget_id
* @return boolean
*/
public function remove($budget_id)
{
return $this->db->table(self::TABLE)->eq('id', $budget_id)->remove();
}
/**
* Validate creation
*
* @access public
* @param array $values Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateCreation(array $values)
{
$v = new Validator($values, array(
new Validators\Required('project_id', t('Field required')),
new Validators\Required('amount', t('Field required')),
));
return array(
$v->execute(),
$v->getErrors()
);
}
}

View File

@ -1,121 +0,0 @@
<?php
namespace Model;
use SimpleValidator\Validator;
use SimpleValidator\Validators;
/**
* Hourly Rate
*
* @package model
* @author Frederic Guillot
*/
class HourlyRate extends Base
{
/**
* SQL table name
*
* @var string
*/
const TABLE = 'hourly_rates';
/**
* Get all user rates for a given project
*
* @access public
* @param integer $project_id
* @return array
*/
public function getAllByProject($project_id)
{
$members = $this->projectPermission->getMembers($project_id);
if (empty($members)) {
return array();
}
return $this->db->table(self::TABLE)->in('user_id', array_keys($members))->desc('date_effective')->findAll();
}
/**
* Get all rates for a given user
*
* @access public
* @param integer $user_id User id
* @return array
*/
public function getAllByUser($user_id)
{
return $this->db->table(self::TABLE)->eq('user_id', $user_id)->desc('date_effective')->findAll();
}
/**
* Get current rate for a given user
*
* @access public
* @param integer $user_id User id
* @return float
*/
public function getCurrentRate($user_id)
{
return $this->db->table(self::TABLE)->eq('user_id', $user_id)->desc('date_effective')->findOneColumn('rate') ?: 0;
}
/**
* Add a new rate in the database
*
* @access public
* @param integer $user_id User id
* @param float $rate Hourly rate
* @param string $currency Currency code
* @param string $date ISO8601 date format
* @return boolean|integer
*/
public function create($user_id, $rate, $currency, $date)
{
$values = array(
'user_id' => $user_id,
'rate' => $rate,
'currency' => $currency,
'date_effective' => $this->dateParser->removeTimeFromTimestamp($this->dateParser->getTimestamp($date)),
);
return $this->persist(self::TABLE, $values);
}
/**
* Remove a specific rate
*
* @access public
* @param integer $rate_id
* @return boolean
*/
public function remove($rate_id)
{
return $this->db->table(self::TABLE)->eq('id', $rate_id)->remove();
}
/**
* Validate creation
*
* @access public
* @param array $values Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateCreation(array $values)
{
$v = new Validator($values, array(
new Validators\Required('user_id', t('Field required')),
new Validators\Required('rate', t('Field required')),
new Validators\Numeric('rate', t('This value must be numeric')),
new Validators\Required('date_effective', t('Field required')),
new Validators\Required('currency', t('Field required')),
));
return array(
$v->execute(),
$v->getErrors()
);
}
}

View File

@ -322,19 +322,6 @@ function version_53($pdo)
$pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent FLOAT DEFAULT 0");
}
function version_52($pdo)
{
$pdo->exec('CREATE TABLE budget_lines (
`id` INT NOT NULL AUTO_INCREMENT,
`project_id` INT NOT NULL,
`amount` FLOAT NOT NULL,
`date` VARCHAR(10) NOT NULL,
`comment` TEXT,
FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8');
}
function version_51($pdo)
{
$pdo->exec('CREATE TABLE timetable_day (
@ -381,19 +368,6 @@ function version_51($pdo)
) ENGINE=InnoDB CHARSET=utf8');
}
function version_50($pdo)
{
$pdo->exec("CREATE TABLE hourly_rates (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
rate FLOAT DEFAULT 0,
date_effective INTEGER NOT NULL,
currency CHAR(3) NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8");
}
function version_49($pdo)
{
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');

View File

@ -315,18 +315,6 @@ function version_34($pdo)
$pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent REAL DEFAULT 0");
}
function version_33($pdo)
{
$pdo->exec('CREATE TABLE budget_lines (
"id" SERIAL PRIMARY KEY,
"project_id" INTEGER NOT NULL,
"amount" REAL NOT NULL,
"date" VARCHAR(10) NOT NULL,
"comment" TEXT,
FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE
)');
}
function version_32($pdo)
{
$pdo->exec('CREATE TABLE timetable_day (
@ -369,18 +357,6 @@ function version_32($pdo)
)');
}
function version_31($pdo)
{
$pdo->exec("CREATE TABLE hourly_rates (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
rate REAL DEFAULT 0,
date_effective INTEGER NOT NULL,
currency CHAR(3) NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE
)");
}
function version_30($pdo)
{
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');

View File

@ -292,18 +292,6 @@ function version_52($pdo)
$pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent REAL DEFAULT 0");
}
function version_51($pdo)
{
$pdo->exec('CREATE TABLE budget_lines (
"id" INTEGER PRIMARY KEY,
"project_id" INTEGER NOT NULL,
"amount" REAL NOT NULL,
"date" TEXT NOT NULL,
"comment" TEXT,
FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE
)');
}
function version_50($pdo)
{
$pdo->exec('CREATE TABLE timetable_day (
@ -346,18 +334,6 @@ function version_50($pdo)
)');
}
function version_49($pdo)
{
$pdo->exec("CREATE TABLE hourly_rates (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
rate REAL DEFAULT 0,
date_effective INTEGER NOT NULL,
currency TEXT NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE
)");
}
function version_48($pdo)
{
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');

View File

@ -20,7 +20,6 @@ class ClassProvider implements ServiceProviderInterface
'Action',
'Authentication',
'Board',
'Budget',
'Category',
'Color',
'Comment',
@ -28,7 +27,6 @@ class ClassProvider implements ServiceProviderInterface
'Currency',
'DateParser',
'File',
'HourlyRate',
'LastLogin',
'Link',
'Notification',

View File

@ -1,30 +0,0 @@
<div class="page-header">
<h2><?= t('Cost breakdown') ?></h2>
</div>
<?php if ($paginator->isEmpty()): ?>
<p class="alert"><?= t('There is nothing to show.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-20"><?= $paginator->order(t('Task'), 'task_title') ?></th>
<th class="column-25"><?= $paginator->order(t('Subtask'), 'subtask_title') ?></th>
<th class="column-20"><?= $paginator->order(t('User'), 'username') ?></th>
<th class="column-10"><?= t('Cost') ?></th>
<th class="column-10"><?= $paginator->order(t('Time spent'), \Model\SubtaskTimeTracking::TABLE.'.time_spent') ?></th>
<th class="column-15"><?= $paginator->order(t('Date'), 'start') ?></th>
</tr>
<?php foreach ($paginator->getCollection() as $record): ?>
<tr>
<td><?= $this->url->link($this->e($record['task_title']), 'task', 'show', array('project_id' => $project['id'], 'task_id' => $record['task_id'])) ?></td>
<td><?= $this->url->link($this->e($record['subtask_title']), 'task', 'show', array('project_id' => $project['id'], 'task_id' => $record['task_id'])) ?></td>
<td><?= $this->url->link($this->e($record['name'] ?: $record['username']), 'user', 'show', array('user_id' => $record['user_id'])) ?></td>
<td><?= n($record['cost']) ?></td>
<td><?= n($record['time_spent']).' '.t('hours') ?></td>
<td><?= dt('%B %e, %Y', $record['start']) ?></td>
</tr>
<?php endforeach ?>
</table>
<?= $paginator ?>
<?php endif ?>

View File

@ -1,47 +0,0 @@
<div class="page-header">
<h2><?= t('Budget lines') ?></h2>
</div>
<?php if (! empty($lines)): ?>
<table class="table-fixed table-stripped">
<tr>
<th class="column-20"><?= t('Budget line') ?></th>
<th class="column-20"><?= t('Date') ?></th>
<th><?= t('Comment') ?></th>
<th><?= t('Action') ?></th>
</tr>
<?php foreach ($lines as $line): ?>
<tr>
<td><?= n($line['amount']) ?></td>
<td><?= dt('%B %e, %Y', strtotime($line['date'])) ?></td>
<td><?= $this->e($line['comment']) ?></td>
<td>
<?= $this->url->link(t('Remove'), 'budget', 'confirm', array('project_id' => $project['id'], 'budget_id' => $line['id'])) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<h3><?= t('New budget line') ?></h3>
<?php endif ?>
<form method="post" action="<?= $this->url->href('budget', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('id', $values) ?>
<?= $this->form->hidden('project_id', $values) ?>
<?= $this->form->label(t('Amount'), 'amount') ?>
<?= $this->form->text('amount', $values, $errors, array('required'), 'form-numeric') ?>
<?= $this->form->label(t('Date'), 'date') ?>
<?= $this->form->text('date', $values, $errors, array('required'), 'form-date') ?>
<?= $this->form->label(t('Comment'), 'comment') ?>
<?= $this->form->text('comment', $values, $errors) ?>
<div class="form-actions">
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
</div>
</form>

View File

@ -1,34 +0,0 @@
<div class="page-header">
<h2><?= t('Budget overview') ?></h2>
</div>
<?php if (! empty($daily_budget)): ?>
<div id="budget-chart">
<div id="chart"
data-date-format="<?= e('%%Y-%%m-%%d') ?>"
data-metrics='<?= json_encode($daily_budget, JSON_HEX_APOS) ?>'
data-labels='<?= json_encode(array('in' => t('Budget line'), 'out' => t('Expenses'), 'left' => t('Remaining'), 'value' => t('Amount'), 'date' => t('Date'), 'type' => t('Type')), JSON_HEX_APOS) ?>'></div>
</div>
<hr/>
<table class="table-fixed table-stripped">
<tr>
<th><?= t('Date') ?></td>
<th><?= t('Budget line') ?></td>
<th><?= t('Expenses') ?></td>
<th><?= t('Remaining') ?></td>
</tr>
<?php foreach ($daily_budget as $line): ?>
<tr>
<td><?= dt('%B %e, %Y', strtotime($line['date'])) ?></td>
<td><?= n($line['in']) ?></td>
<td><?= n($line['out']) ?></td>
<td><?= n($line['left']) ?></td>
</tr>
<?php endforeach ?>
</table>
<?php else: ?>
<p class="alert"><?= t('There is not enough data to show something.') ?></p>
<?php endif ?>
<?= $this->asset->js('assets/js/vendor/d3.v3.min.js') ?>
<?= $this->asset->js('assets/js/vendor/c3.min.js') ?>

View File

@ -1,13 +0,0 @@
<div class="page-header">
<h2><?= t('Remove budget line') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info"><?= t('Do you really want to remove this budget line?') ?></p>
<div class="form-actions">
<?= $this->url->link(t('Yes'), 'budget', 'remove', array('project_id' => $project['id'], 'budget_id' => $budget_id), true, 'btn btn-red') ?>
<?= t('or') ?>
<?= $this->url->link(t('cancel'), 'budget', 'create', array('project_id' => $project['id'])) ?>
</div>
</div>

View File

@ -1,16 +0,0 @@
<div class="sidebar">
<h2><?= t('Budget') ?></h2>
<ul>
<li <?= $this->app->getRouterAction() === 'index' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Budget overview'), 'budget', 'index', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->getRouterAction() === 'create' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Budget lines'), 'budget', 'create', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->getRouterAction() === 'breakdown' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Cost breakdown'), 'budget', 'breakdown', array('project_id' => $project['id'])) ?>
</li>
</ul>
<div class="sidebar-collapse"><a href="#" title="<?= t('Hide sidebar') ?>"><i class="fa fa-chevron-left"></i></a></div>
<div class="sidebar-expand" style="display: none"><a href="#" title="<?= t('Expand sidebar') ?>"><i class="fa fa-chevron-right"></i></a></div>
</div>

View File

@ -52,5 +52,3 @@
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
</div>
</form>
<p class="alert alert-info"><?= t('Currency rates are used to calculate project budget.') ?></p>

View File

@ -1,46 +0,0 @@
<div class="page-header">
<h2><?= t('Hourly rates') ?></h2>
</div>
<?php if (! empty($rates)): ?>
<table>
<tr>
<th><?= t('Hourly rate') ?></th>
<th><?= t('Currency') ?></th>
<th><?= t('Effective date') ?></th>
<th><?= t('Action') ?></th>
</tr>
<?php foreach ($rates as $rate): ?>
<tr>
<td><?= n($rate['rate']) ?></td>
<td><?= $rate['currency'] ?></td>
<td><?= dt('%b %e, %Y', $rate['date_effective']) ?></td>
<td>
<?= $this->url->link(t('Remove'), 'hourlyrate', 'confirm', array('user_id' => $user['id'], 'rate_id' => $rate['id'])) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<h3><?= t('Add new rate') ?></h3>
<?php endif ?>
<form method="post" action="<?= $this->url->href('hourlyrate', 'save', array('user_id' => $user['id'])) ?>" autocomplete="off">
<?= $this->form->hidden('user_id', $values) ?>
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Hourly rate'), 'rate') ?>
<?= $this->form->text('rate', $values, $errors, array('required'), 'form-numeric') ?>
<?= $this->form->label(t('Currency'), 'currency') ?>
<?= $this->form->select('currency', $currencies_list, $values, $errors, array('required')) ?>
<?= $this->form->label(t('Effective date'), 'date_effective') ?>
<?= $this->form->text('date_effective', $values, $errors, array('required'), 'form-date') ?>
<div class="form-actions">
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
</div>
</form>

View File

@ -1,13 +0,0 @@
<div class="page-header">
<h2><?= t('Remove hourly rate') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info"><?= t('Do you really want to remove this hourly rate?') ?></p>
<div class="form-actions">
<?= $this->url->link(t('Yes'), 'hourlyrate', 'remove', array('user_id' => $user['id'], 'rate_id' => $rate_id), true, 'btn btn-red') ?>
<?= t('or') ?>
<?= $this->url->link(t('cancel'), 'hourlyrate', 'index', array('user_id' => $user['id'])) ?>
</div>
</div>

View File

@ -16,10 +16,6 @@
<i class="fa fa-line-chart fa-fw"></i>
<?= $this->url->link(t('Analytics'), 'analytic', 'tasks', array('project_id' => $project['id'])) ?>
</li>
<li>
<i class="fa fa-pie-chart fa-fw"></i>
<?= $this->url->link(t('Budget'), 'budget', 'index', array('project_id' => $project['id'])) ?>
</li>
<li>
<i class="fa fa-download fa-fw"></i>
<?= $this->url->link(t('Exports'), 'export', 'tasks', array('project_id' => $project['id'])) ?>

View File

@ -62,9 +62,6 @@
<li <?= $this->app->getRouterController() === 'user' && $this->app->getRouterAction() === 'authentication' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Edit Authentication'), 'user', 'authentication', array('user_id' => $user['id'])) ?>
</li>
<li <?= $this->app->getRouterController() === 'hourlyrate' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Hourly rates'), 'hourlyrate', 'index', array('user_id' => $user['id'])) ?>
</li>
<li <?= $this->app->getRouterController() === 'timetable' ? 'class="active"' : '' ?>>
<?= $this->url->link(t('Manage timetable'), 'timetable', 'index', array('user_id' => $user['id'])) ?>
</li>

File diff suppressed because one or more lines are too long

View File

@ -1,55 +0,0 @@
function BudgetChart() {
}
BudgetChart.prototype.execute = function() {
var categories = [];
var metrics = $("#chart").data("metrics");
var labels = $("#chart").data("labels");
var inputFormat = d3.time.format("%Y-%m-%d");
var outputFormat = d3.time.format($("#chart").data("date-format"));
var columns = [
[labels["in"]],
[labels["left"]],
[labels["out"]]
];
var colors = {};
colors[labels["in"]] = '#5858FA';
colors[labels["left"]] = '#04B404';
colors[labels["out"]] = '#DF3A01';
for (var i = 0; i < metrics.length; i++) {
categories.push(outputFormat(inputFormat.parse(metrics[i]["date"])));
columns[0].push(metrics[i]["in"]);
columns[1].push(metrics[i]["left"]);
columns[2].push(metrics[i]["out"]);
}
c3.generate({
data: {
columns: columns,
colors: colors,
type : 'bar'
},
bar: {
width: {
ratio: 0.25
}
},
grid: {
x: {
show: true
},
y: {
show: true
}
},
axis: {
x: {
type: 'category',
categories: categories
}
}
});
};

View File

@ -27,7 +27,6 @@ jQuery(document).ready(function() {
router.addRoute('analytic-user-repartition', UserRepartitionChart);
router.addRoute('analytic-cfd', CumulativeFlowDiagram);
router.addRoute('analytic-burndown', BurndownChart);
router.addRoute('budget-chart', BudgetChart);
router.addRoute('analytic-avg-time-column', AvgTimeColumnChart);
router.addRoute('analytic-task-time-column', TaskTimeColumnChart);
router.addRoute('analytic-lead-cycle-time', LeadCycleTimeChart);

View File

@ -1,43 +0,0 @@
<?php
require_once __DIR__.'/../Base.php';
use Model\User;
use Model\HourlyRate;
class HourlyRateTest extends Base
{
public function testCreation()
{
$hr = new HourlyRate($this->container);
$this->assertEquals(1, $hr->create(1, 32.4, 'EUR', '2015-01-01'));
$this->assertEquals(2, $hr->create(1, 42, 'CAD', '2015-02-01'));
$rates = $hr->getAllByUser(0);
$this->assertEmpty($rates);
$rates = $hr->getAllByUser(1);
$this->assertNotEmpty($rates);
$this->assertCount(2, $rates);
$this->assertEquals(42, $rates[0]['rate']);
$this->assertEquals('CAD', $rates[0]['currency']);
$this->assertEquals('2015-02-01', date('Y-m-d', $rates[0]['date_effective']));
$this->assertEquals(32.4, $rates[1]['rate']);
$this->assertEquals('EUR', $rates[1]['currency']);
$this->assertEquals('2015-01-01', date('Y-m-d', $rates[1]['date_effective']));
$this->assertEquals(0, $hr->getCurrentRate(0));
$this->assertEquals(42, $hr->getCurrentRate(1));
$this->assertTrue($hr->remove(2));
$this->assertEquals(32.4, $hr->getCurrentRate(1));
$this->assertTrue($hr->remove(1));
$this->assertEquals(0, $hr->getCurrentRate(1));
$rates = $hr->getAllByUser(1);
$this->assertEmpty($rates);
}
}