X-Git-Url: https://jasonwoof.com/gitweb/?p=contractor-progress.git;a=blobdiff_plain;f=tasks.php;h=03bca4691c95709f106ed4cf0eff314840f78871;hp=6351ca6e5ebd3b18a40eacc9dae9b98b39eb00dc;hb=a8968f20cd3b06b2cc19de6871019d4aaae6b79b;hpb=1bcde3c6ba88a93deaa0848df4de0b0857d9bf49 diff --git a/tasks.php b/tasks.php index 6351ca6..03bca46 100644 --- a/tasks.php +++ b/tasks.php @@ -4,7 +4,6 @@ require_once('code/tasks.php'); $GLOBALS['tasks_form_recipient'] = "fixme@example.com"; -define('TASKS_DB_FIELDS', 'title,url,description,state'); require_once('code/wfpl/template.php'); @@ -13,6 +12,10 @@ require_once('code/wfpl/messages.php'); require_once('code/wfpl/email.php'); require_once('code/db_connect.php'); +function description_has_fixmes($description) { + return (strpos($description, 'FIXME') !== false); +} + # replace every character in $str with " " function tonbsp($matches) { return str_repeat(' ', strlen($matches[0]) * 2); @@ -29,16 +32,18 @@ function tasks_get_fields() { $title = format_oneline($_REQUEST['title']); $url = format_oneline($_REQUEST['url']); $description = format_unix($_REQUEST['description']); + $price = format_decimal($_REQUEST['price']); - tasks_tem_sets($title, $url, $description); + tasks_tem_sets($title, $url, $description, $price); - return array($title, $url, $description); + return array($title, $url, $description, $price); } -function tasks_tem_sets($title, $url, $description) { +function tasks_tem_sets($title, $url, $description, $price) { tem_set('title', $title); tem_set('url', $url); tem_set('description', $description); + tem_set('price', $price); } function tasks_main() { @@ -66,19 +71,77 @@ function tasks_main() { function tasks_display_main() { $task_id = format_int($_REQUEST['tasks_id']);; - $row = db_get_row('tasks', 'title,url,description,state', 'where id=%i', $task_id); + $client_id = logged_in(); + if(logged_in_as_contractor()) { + $row = db_get_row('tasks', 'title,url,description,state,price', 'where id=%i', $task_id); + } else { + $row = db_get_row('tasks', 'title,url,description,state,price', 'where id=%i && client_id=%i', $task_id, $client_id); + } if($row) { - list($title, $url, $description, $state) = $row; + list($title, $url, $description, $state, $price) = $row; tem_set('task_id', $task_id); tem_set('title', $title); tem_set('url', $url); tem_set('description', $description); tem_set('state', task_state_pretty($state)); + tem_set('price', $price); if($state == TASK_BUG) { tem_show('bug_title'); } else { tem_show('normal_title'); } + if(logged_in_as_contractor()) { + switch($state) { + case TASK_DRAFT: + case TASK_NEEDS_CLARIFICATION: + case TASK_NEEDS_QUOTE: + case TASK_BUG: + case TASK_NEEDS_GO_AHEAD: + tem_show('normal_edit_link'); + tem_show('price_row'); + break; + case TASK_QUEUED: + tem_show('normal_edit_link'); + tem_show('working_link'); + tem_show('price_row'); + case TASK_WORKING: + tem_show('price_row'); + tem_show('needs_testing_link'); + break; + case TASK_NEEDS_TESTING: + case TASK_FINISHED: + tem_show('price_row'); + break; + } + } else { + switch($state) { + case TASK_DRAFT: + case TASK_NEEDS_CLARIFICATION: + case TASK_NEEDS_QUOTE: + case TASK_BUG: + tem_show('normal_edit_link'); + break; + case TASK_NEEDS_GO_AHEAD: + tem_show('price_row'); + tem_show('approve_price_link'); + tem_show('warning_edit_link'); + break; + case TASK_QUEUED: + tem_show('price_row'); + tem_show('warning_edit_link'); + break; + case TASK_WORKING: + tem_show('price_row'); + break; + case TASK_NEEDS_TESTING: + tem_show('price_row'); + tem_show('finished_link'); + break; + case TASK_FINISHED: + tem_show('price_row'); + break; + } + } } else { message("Task #$task_id not found"); return './'; @@ -87,9 +150,18 @@ function tasks_display_main() { function tasks_edit_main() { $state = TASK_DRAFT; # will be overwritten + $client_id = logged_in(); # fixed shortly if we're contractor $edit_id = format_int($_REQUEST['tasks_edit_id']); unset($_REQUEST['tasks_edit_id']); if($edit_id) { + $owner = db_get_value('tasks', 'client_id', 'where id=%i', $edit_id); + if(logged_in_as_contractor()) { + $client_id = $owner; + } elseif($owner != $client_id) { + message('Sorry, that task was entered by/for another client.'); + return './'; + } + # add hidden field for database id of row we're editing tem_set('tasks_edit_id', $edit_id); tem_show('editing'); @@ -98,16 +170,54 @@ function tasks_edit_main() { } if(isset($_REQUEST['tasks_new_bug'])) { - tem_show('bug_submit'); $state = TASK_BUG; - } else { - tem_show('normal_submits'); } - if($state == TASK_BUG) { - tem_show('bug_instructions'); - } else { - tem_show('normal_instructions'); + if(isset($_REQUEST['tasks_approve_price_id'])) { + $id = $_REQUEST['tasks_approve_price_id']; + $owner = db_get_value('tasks', 'client_id', 'where id=%i', $id);; + if(logged_in() != $owner) { + message("Error: can't approve a task entered by/for another client."); + return './'; + } + db_update('tasks', 'state', TASK_QUEUED, 'where id=%i', $id); + message('Price approved.'); + return './'; + } + + if(isset($_REQUEST['tasks_working_id'])) { + $id = $_REQUEST['tasks_working_id']; + if(!logged_in_as_contractor()) { + message("Error: only Jason can say what he's working on."); + return './'; + } + db_update('tasks', 'state', TASK_WORKING, 'where id=%i', $id); + message('OK, client locked out of modifying that one.'); + return './'; + } + + if(isset($_REQUEST['tasks_needs_testing_id'])) { + $id = $_REQUEST['tasks_needs_testing_id']; + if(!logged_in_as_contractor()) { + message("Error: only Jason can say when he's done."); + return './'; + } + db_update('tasks', 'state', TASK_NEEDS_TESTING, 'where id=%i', $id); + message('Task awaits testing.'); + return './'; + } + + if(isset($_REQUEST['tasks_finished_id'])) { + $id = $_REQUEST['tasks_finished_id']; + $owner = db_get_value('tasks', 'client_id', 'where id=%i', $id);; + if(logged_in() != $owner) { + message("Error: can't test a task entered by/for another client."); + return './'; + } + db_update('tasks', 'state', TASK_FINISHED, 'where id=%i', $id); + message('Task marked as finished.'); + # FIXME also mark it as paid if client's balance can cover it + return './'; } $delete_id = format_int($_REQUEST['tasks_delete_id']); @@ -120,25 +230,43 @@ function tasks_edit_main() { } if(isset($_REQUEST['title'])) { - list($title, $url, $description) = tasks_get_fields(); + list($title, $url, $description, $price) = tasks_get_fields(); # FIXME if(isset($_REQUEST['save_draft'])) { $state = TASK_DRAFT; } elseif(isset($_REQUEST['save_bug'])) { $state = TASK_BUG; - } else { - $state = TASK_NEEDS_QUOTE; + } elseif(isset($_REQUEST['save_price']) && logged_in_as_contractor()) { + $tiny_agreement = db_get_value('people', 'tiny_agreement', 'where id=%i', $client_id); + if($price < $tiny_agreement) { + $state = TASK_QUEUED; + } else { + $state = TASK_NEEDS_GO_AHEAD; + } + } elseif(isset($_REQUEST['needs_clarification'])) { + $state = TASK_NEEDS_CLARIFICATION; + } else { # better be "request_price" + if(description_has_fixmes($description)) { + $state = TASK_NEEDS_CLARIFICATION; + message('The description is not ready to be priced yet because it still contains at least one "FIXME".'); + } else { + $state = TASK_NEEDS_QUOTE; + } } if("you're happy with the POSTed values") { if($edit_id) { - db_update('tasks', 'title,url,description,state', $title, $url, $description, $state, 'where id=%i', $edit_id); + if(isset($_REQUEST['price']) && logged_in_as_contractor()) { + db_update('tasks', 'title,url,description,state,price', $title, $url, $description, $state, $price, 'where id=%i', $edit_id); + } else { + db_update('tasks', 'title,url,description,state', $title, $url, $description, $state, 'where id=%i', $edit_id); + } message('Task updated.'); } else { # new task $paid = 0; - $client_id = 4; # FIXME + $client_id = logged_in(); db_insert('tasks', 'client_id,title,url,description,state,paid', $client_id, $title, $url, $description, $state, $paid); message('Task saved.'); } @@ -171,14 +299,14 @@ function tasks_edit_main() { # fix their entry in whatever way you require. } elseif($edit_id) { # we've recieved an edit id, but no data. So we grab the values to be edited from the database - list($client_id, $ord, $title, $url, $description, $state, $paid) = db_get_row('tasks', TASKS_DB_FIELDS, 'where id=%i', $edit_id); - tasks_tem_sets($client_id, $ord, $title, $url, $description, $state, $paid); + list($title, $url, $description, $state, $paid) = db_get_row('tasks', 'title,url,description,state,price', 'where id=%i', $edit_id); + tasks_tem_sets($title, $url, $description, $price); } else { # form not submitted, you can set default values like so: #tem_set('client_id', 'Yes'); } - # this has to be later in the file because it requres that client_id be set already + # display header if($edit_id) { tem_show('edit_msg'); } elseif($state == TASK_BUG) { @@ -186,6 +314,28 @@ function tasks_edit_main() { } else { tem_show('new_msg'); } + + # display instructions + if($state == TASK_BUG) { + tem_show('bug_instructions'); + if(logged_in_as_contractor()) { + tem_show('price_field'); + tem_show('contractor_submits'); + } else { + tem_show('bug_submit'); + } + } elseif($state == TASK_NEEDS_QUOTE && logged_in_as_contractor()) { + tem_show('set_price_instructions'); + tem_show('price_field'); + tem_show('contractor_submits'); + } else { + if(description_has_fixmes($description)) { + tem_show('fixme_instructions'); + } else { + tem_show('normal_instructions'); + } + tem_show('normal_submits'); + } } ?>