{"id":15494214,"url":"https://github.com/farolfo/jira-scheduler","last_synced_at":"2026-01-31T02:30:20.136Z","repository":{"id":24460174,"uuid":"27863249","full_name":"farolfo/JIRA-Scheduler","owner":"farolfo","description":"Schedule your Jira tasks for this sprint in Haskell!","archived":false,"fork":false,"pushed_at":"2015-06-04T04:45:37.000Z","size":284,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-30T12:19:26.638Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/farolfo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-11T09:19:12.000Z","updated_at":"2020-10-15T02:21:13.000Z","dependencies_parsed_at":"2022-08-22T08:20:34.100Z","dependency_job_id":null,"html_url":"https://github.com/farolfo/JIRA-Scheduler","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farolfo%2FJIRA-Scheduler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farolfo%2FJIRA-Scheduler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farolfo%2FJIRA-Scheduler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farolfo%2FJIRA-Scheduler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/farolfo","download_url":"https://codeload.github.com/farolfo/JIRA-Scheduler/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239780147,"owners_count":19695735,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-02T08:12:25.374Z","updated_at":"2026-01-31T02:30:20.067Z","avatar_url":"https://github.com/farolfo.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"JIRA Scheduler\n===============\n\nGiven a bunch of JIRA tasks for the sprint, the JIRA-Scheduler generates a plan for the next two weeks saying what tasks should be done first given the priority, duration, owner and which tasks block the ones you are doing.\n\nThe core for this shceduling problem solver is a genetic algorithm.\n\nThis project is written in Haskel and used as a final project for the Functional Programming subject at ITBA.\n\n###Install\n\nInstall the ```random-extras``` package using cabal\n\n```\ncabal install random-extras\n```\n\n###Application overview\n\n```haskell\ndata Priority = Highest | High | Medium | Low | Lowest deriving (Show); \n\n-- A JIRA task\ndata Task = Task {\n      id :: String,           -- The identifier of the JIRA task\n      owner :: String,        -- The owner of the JIRA\n      duration :: Integer,    -- The duration in hours that the task will require to be developed\n      blockedBy :: [Task],    -- All the tasks that are blocking the development of this one\n      priority :: Priority,   -- The priority of this task\n      startHour :: Integer    -- Hour from the begining of the sprint when the task should start\n} deriving (Show);\n\n-- A backlog, just a bunch of JIRAs\ndata Backlog = Backlog [Task] deriving (Show);\n\n-- Initialize the JIRA tasks you want to do in the sprint, \n-- set whatever in the 'startHour field', we will fill that for you\ntask1 = Task {\n      identifier=\"ITBA-1\",\n      owner=\"Pablo\",\n      duration=12,\n      blockedBy=[],\n      priority=Highest,\n      startHour=0\n};\ntask2 = Task {\n      identifier=\"ITBA-2\",\n      owner=\"Pablo\",\n      duration=32,\n      blockedBy=[task1],\n      priority=Highest,\n      startHour=0\n};\ntask1 = Task {\n      identifier=\"ITBA-3\",\n      owner=\"Juan\",\n      duration=6,\n      blockedBy=[task1,task2],\n      priority=Highest,\n      startHour=0\n};\n\n-- Put the JIRAs in the backlog\nbacklog = Backlog [task1, task2, task3];\n\n-- Execute the JIRA scheduler and the tasks will have now the start hour property set as it should be\n-- JIRAScheduler :: Backlog -\u003e Backlog\nscheduledBacklog = JIRAScheduler backlog;\n```\n\n###Some observations\n\n* It is assumed that the attributes are always given in the Tasks, i.e.: no empty owners, nor duration.\n* It is assumed we have NO cycles betwen the JIRAs 'blocked by' chain, i.e.: no A blocked by B and B blocked by A, directly or not.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffarolfo%2Fjira-scheduler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffarolfo%2Fjira-scheduler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffarolfo%2Fjira-scheduler/lists"}