From 171a4f9b0ddd508dab013a97690aae93f804615c Mon Sep 17 00:00:00 2001 From: Erik Huelsmann Date: Mon, 17 Jul 2023 22:59:57 +0200 Subject: [PATCH] Convert buttons on journal screen to workflow (#7516) * Convert buttons on journal screen to workflow --- UI/journal/journal_entry.html | 12 +- old/bin/gl.pl | 214 +++++++++++++++++------------- old/lib/LedgerSMB/GL.pm | 10 +- sql/changes/1.11/gl-workflows.sql | 28 ++++ sql/changes/LOADORDER | 1 + workflows/gl.actions.xml | 131 ++++++++++++++++++ workflows/gl.conditions.xml | 9 ++ workflows/gl.persisters.xml | 8 ++ workflows/gl.workflow.xml | 51 +++++++ 9 files changed, 356 insertions(+), 108 deletions(-) create mode 100644 sql/changes/1.11/gl-workflows.sql create mode 100644 workflows/gl.actions.xml create mode 100644 workflows/gl.conditions.xml create mode 100644 workflows/gl.persisters.xml create mode 100644 workflows/gl.workflow.xml diff --git a/UI/journal/journal_entry.html b/UI/journal/journal_entry.html index 056d1910b3..3eb2058a04 100644 --- a/UI/journal/journal_entry.html +++ b/UI/journal/journal_entry.html @@ -133,6 +133,9 @@ END ; END %] +
+
+ [% text('Status:') %] [% form.status %] @@ -348,15 +351,6 @@ name = "media" value = "screen" }; - PROCESS button element_data = { - id = "btn_print" - name = "__action" - text = text('Print') - class = "submit" - value = "print" - "data-dojo-type" = "lsmb/PrintButton" - "data-dojo-props" = "minimalGET: false" - }; END; %] [% IF form.recurringset ==1 %] diff --git a/old/bin/gl.pl b/old/bin/gl.pl index df1397893a..fe43d36b56 100644 --- a/old/bin/gl.pl +++ b/old/bin/gl.pl @@ -89,11 +89,25 @@ sub edit_and_save { check_balanced($form); $form->call_procedure(funcname=>'draft_delete', args => [ $form->{id} ]); GL->post_transaction( \%myconfig, \%$form, $locale); + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } edit(); } sub approve { $form->call_procedure(funcname=>'draft_approve', args => [ $form->{id} ]); + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } if ($form->{callback}){ print "Location: $form->{callback}\n"; print "Status: 302 Found\n\n"; @@ -103,28 +117,37 @@ sub approve { . qq|here.|; } else { - $form->info($locale->text('Draft Posted')); + new(); } } sub new { - for my $row (0 .. $form->{rowcount}){ - for my $fld(qw(accno projectnumber acc debit credit source memo)){ + for my $row (0 .. $form->{rowcount}){ + for my $fld(qw(accno projectnumber acc debit credit source memo)){ delete $form->{"${fld}_${row}"}; - } - } - delete $form->{description}; - delete $form->{reference}; - delete $form->{rowcount}; - delete $form->{id}; - add(); + } + } + delete $form->{description}; + delete $form->{reference}; + delete $form->{rowcount}; + delete $form->{id}; + delete $form->{workflow_id}; + add(); } sub copy_to_new { - delete $form->{reference}; - delete $form->{id}; - delete $form->{approved}; - update(); + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflow')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } + delete $form->{reference}; + delete $form->{id}; + delete $form->{approved}; + delete $form->{workflow_id}; + update(); } sub add { @@ -161,6 +184,13 @@ sub _reverse_amounts { sub reverse { $form->{title} = "Reverse"; + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } &create_links; # runs GL->transaction() _reverse_amounts(); @@ -168,6 +198,7 @@ sub reverse { $form->{reversing} = delete $form->{id}; $form->{reversing_reference} = $form->{reference}; delete $form->{approved}; + delete $form->{workflow_id}; display_form(); } @@ -273,6 +304,22 @@ sub display_form $form->{colrownotes}=0; } + my $wf; + if($form->{workflow_id}) { + $wf = $form->{_wire}->get('workflows') + ->fetch_workflow( 'GL', $form->{workflow_id} ); + } + else { + $wf = $form->{_wire}->get('workflows') + ->create_workflow( 'GL', + Workflow::Context->new( + 'batch-id' => $form->{batch_id}, + 'table_name' => 'gl' + ) ); + $form->{workflow_id} = $wf->id; + } + $wf->context->param( transdate => $form->{transdate} ); + $form->{status} = $wf->state; $focus = ( $form->{focus} ) ? $form->{focus} : "debit_$form->{rowcount}"; our %hiddens = ( 'direction' => $form->{direction}, @@ -288,7 +335,8 @@ sub display_form 'form_id' => $form->{form_id}, 'separate_duties' => $form->{separate_duties}, 'reversing' => $form->{reversing}, - 'reversing_reference' => $form->{reversing_reference} + 'reversing_reference' => $form->{reversing_reference}, + 'workflow_id' => $form->{workflow_id} ); @@ -308,93 +356,42 @@ sub display_form $transdate = $form->datetonum( \%myconfig, $form->{transdate} ); my @buttons; if ( !$form->{readonly} ) { - my $i; - - $i=1; - @buttons = ( - { action => 'update', - value => $locale->text('Update') }, - { action => 'post', - value => - ($form->{separate_duties} - ? $locale->text('Save') : $locale->text('Post')), - class => 'post' }, - { action => 'approve', value => $locale->text('Post'), - class => 'post' }, - { action => 'edit_and_save', - value => $locale->text('Save Draft') }, - { action => 'post_reversing', - value => ($form->{separate_duties} - ? $locale->text('Save') : $locale->text('Post')), }, - { action => 'save_temp', - value => $locale->text('Save Template') }, - { action => 'save_as_new', - value => $locale->text('Save as new') }, - { action => 'schedule', - value => $locale->text('Schedule') }, - { action => 'new', - value => $locale->text('New') }, - { action => 'copy_to_new', - value => $locale->text('Copy to New') }, + $wf->context->param( _is_closed => $form->is_closed( $transdate ) ); + %button_types = ( + print => 'lsmb/PrintButton' ); - - %a = (); - $a{'save_temp'} = not $form->{reversing}; - - if ( $form->{id}) { - for ( 'new', 'save_as_new', 'copy_to_new' ) { - $a{$_} = 1; - } - for ( 'schedule' ) { - $a{$_} = not $form->{reversing}; - } - if (!$form->{approved} && !$form->{batch_id}) { - # Need to check for draft_modify and draft_post - if ($form->is_allowed_role(['draft_post'])) { - $a{approve} = 1; - } - if ($form->is_allowed_role(['draft_modify'])) { - $a{edit_and_save} = not $form->{reversing}; - $a{post_reversing} = $form->{reversing}; - } - $a{update} = not $form->{reversing}; - } - } else { - if ( not $form->is_closed( $transdate ) ) { - for ( 'post' ) { $a{$_} = not $form->{reversing} } - for ( 'post_reversing' ) { $a{$_} = $form->{reversing} } - } - for ( 'update', 'schedule' ) { - $a{$_} = not $form->{reversing}; - } + for my $action_name ( $wf->get_current_actions ) { + my $action = $wf->get_action( $action_name ); + + next if ($action->ui // '') eq 'none'; + push @buttons, { + ndx => $action->order, + name => $action->name, + text => $locale->maketext($action->text), + doing => ($action->doing ? $locale->maketext($action->doing) : ''), + done => ($action->done ? $locale->maketext($action->done) : ''), + type => $button_types{$action->ui}, + tooltip => ($action->short_help ? $locale->maketext($action->short_help) : '') + }; } - $i=1; @buttons = map { { name => '__action', - value => $_->{action}, - text => $_->{value}, + value => $_->{name}, + text => $_->{text}, type => 'submit', class => $_->{class} // 'submit', - order => $i++ + order => $_->{ndx}, + 'data-lsmb-doing' => $_->{doing}, + 'data-lsmb-done' => $_->{done}, + 'data-dojo-type' => $_->{type} // 'dijit/form/Button', + 'data-dojo-props' => $_->{type} ? 'minimalGET: false' : '', } } - grep { $a{$_->{action}} } @buttons; + sort { $a->{ndx} <=> $b->{ndx} } @buttons; } - unless ($form->{reversed_by}) { - if ($form->{approved}) { - push @buttons, { - name => '__action', - value => 'reverse', - text => $locale->text('Reverse'), - type => 'submit', - class => 'submit', - }; - } - } - $form->{recurringset}=0; if ( $form->{recurring} ) { $form->{recurringset}=1; @@ -416,6 +413,13 @@ sub display_form sub save_temp { my ($department_name, $department_id) = split/--/, $form->{department}; + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } my @lines; for my $iter (0 .. $form->{rowcount}){ if ($form->{"accno_$iter"} and @@ -670,7 +674,10 @@ sub update { } - +sub post_and_approve { + post(); + $form->call_procedure(funcname=>'draft_approve', args => [ $form->{id} ]); +} sub post { if ($form->{id}){ @@ -681,6 +688,13 @@ sub post { $form->finalize_request(); }; $form->isblank( "transdate", $locale->text('Transaction Date missing!') ); + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } $transdate = $form->datetonum( \%myconfig, $form->{transdate} ); @@ -701,13 +715,20 @@ sub post { } -sub delete { +sub del { $form->error($locale->text('Cannot delete posted transaction')) if ($form->{approved}); + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } $form->call_procedure(funcname=>'draft_delete', args => [ $form->{id} ]); delete $form->{id}; delete $form->{reference}; - add(); + new(); } @@ -738,6 +759,13 @@ sub check_balanced { sub save_as_new { for (qw(id printed emailed)) { delete $form->{$_} } + if ($form->{workflow_id}) { + my $wf = $form->{_wire}->get('workflows')->fetch_workflow( + 'GL', $form->{workflow_id} + ); + $wf->context->param( transdate => $form->{transdate} ); + $wf->execute_action( $form->{__action} ); + } delete $form->{approved}; &post; } diff --git a/old/lib/LedgerSMB/GL.pm b/old/lib/LedgerSMB/GL.pm index 22bdae2daf..69a4ec1a87 100644 --- a/old/lib/LedgerSMB/GL.pm +++ b/old/lib/LedgerSMB/GL.pm @@ -82,9 +82,7 @@ sub post_transaction { my $sth; my $id = $dbh->quote( $form->{id} ); - if ($form->{separate_duties}){ - $form->{approved} = '0'; - } + $form->{approved} = '0'; if ( $form->{id} ) { $query = qq|SELECT id FROM gl WHERE id = $id|; @@ -119,10 +117,10 @@ sub post_transaction { || $form->dberror($query); ( $form->{id} ) = $sth->fetchrow_array(); - $query = q|UPDATE transactions SET reversing = ? WHERE id = ? AND workflow_id IS NULL|; + $query = q|UPDATE transactions SET workflow_id = ?, reversing = ? WHERE id = ? AND workflow_id IS NULL|; $sth = $dbh->prepare($query); $form->{reversing} ||= undef; # convert empty string to NULL - $sth->execute( $form->{reversing}, $form->{id} ) + $sth->execute( $form->{workflow_id}, $form->{reversing}, $form->{id} ) || $form->dberror($query); } @@ -274,7 +272,7 @@ sub transaction { @{$form->{currencies}} = (LedgerSMB::Setting->new(%$form))->get_currencies; - $query = qq|SELECT g.*, t.reversing, t.reversing_reference, t.reversed_by, t.reversed_by_reference + $query = qq|SELECT g.*, t.workflow_id, t.reversing, t.reversing_reference, t.reversed_by, t.reversed_by_reference FROM gl g JOIN transactions_reversal t on g.id = t.id WHERE g.id = ?|; diff --git a/sql/changes/1.11/gl-workflows.sql b/sql/changes/1.11/gl-workflows.sql new file mode 100644 index 0000000000..8571874469 --- /dev/null +++ b/sql/changes/1.11/gl-workflows.sql @@ -0,0 +1,28 @@ + +create temporary table workflow_transactions as + select gl.id as gl, + nextval('workflow_seq') as wf, + CASE WHEN approved THEN 'POSTED' + ELSE 'SAVED' END as state + from gl + where not exists (select from yearend y where y.trans_id = gl.id) + and not exists (select from payment p where p.gl_id = gl.id) + and not exists (select from inventory_report r where r.trans_id = gl.id) + and not exists (select from asset_report a where a.gl_id = gl.id); + +insert into workflow (workflow_id, type, state, last_update) +select wf, 'GL', state, now() + from workflow_transactions; + +update transactions trn + set workflow_id = wf + from workflow_transactions wt + where trn.id = wt.gl; + +insert into workflow_history + (workflow_hist_id, workflow_id, action, + description, state, workflow_user, history_date) +select nextval('workflow_history_seq'), wf, 'MIGRATE', + 'Workflow created during migration', state, + CURRENT_USER, now() + from workflow_transactions; diff --git a/sql/changes/LOADORDER b/sql/changes/LOADORDER index 0d7f0bc605..7eee7fc082 100644 --- a/sql/changes/LOADORDER +++ b/sql/changes/LOADORDER @@ -180,3 +180,4 @@ mc/delete-migration-validation-data.sql 1.11/ar-ap-role-naming-consistency.sql 1.11/aa-column-cleanup.sql 1.11/rename-action-parameter.sql +1.11/gl-workflows.sql diff --git a/workflows/gl.actions.xml b/workflows/gl.actions.xml new file mode 100644 index 0000000000..968864fb9d --- /dev/null +++ b/workflows/gl.actions.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/workflows/gl.conditions.xml b/workflows/gl.conditions.xml new file mode 100644 index 0000000000..379820edda --- /dev/null +++ b/workflows/gl.conditions.xml @@ -0,0 +1,9 @@ + + GL + + + diff --git a/workflows/gl.persisters.xml b/workflows/gl.persisters.xml new file mode 100644 index 0000000000..49409a003a --- /dev/null +++ b/workflows/gl.persisters.xml @@ -0,0 +1,8 @@ + + + diff --git a/workflows/gl.workflow.xml b/workflows/gl.workflow.xml new file mode 100644 index 0000000000..780634ba2b --- /dev/null +++ b/workflows/gl.workflow.xml @@ -0,0 +1,51 @@ + + GL + JournalEntry + Manage the life cycle of a GL document (excluding year-end, inventory adjustment and fixed assets transactions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +