use SL::BackgroundJob::Base;
use SL::BackgroundJob::BackgroundJobCleanup;
use SL::BackgroundJob::CleanBackgroundJobHistory;
+use SL::BackgroundJob::CloseProjectsBelongingToClosedSalesOrders;
use SL::BackgroundJob::CreatePeriodicInvoices;
use SL::BackgroundJob::FailedBackgroundJobsReport;
1;
-
--- /dev/null
+package SL::BackgroundJob::CloseProjectsBelongingToClosedSalesOrders;
+
+use strict;
+
+use parent qw(SL::BackgroundJob::Base);
+
+use SL::DB::Project;
+use SL::DB::ProjectStatus;
+
+sub run {
+ my ($self, $db_obj) = @_;
+
+ my $data = $db_obj->data_as_hash;
+ $data->{new_status} ||= 'done';
+ $data->{set_inactive} = 1 if !exists $data->{set_inactive};
+
+ my $new_status = SL::DB::Manager::ProjectStatus->find_by(name => $data->{new_status}) || die "No project status named '$data->{new_status}' found!";
+
+ my %attributes = (project_status_id => $new_status->id);
+ $attributes{active} = 0 if $data->{set_inactive};
+
+ my $sql = <<EOSQL;
+ id IN (
+ SELECT oe.globalproject_id
+ FROM oe
+ WHERE (oe.globalproject_id IS NOT NULL)
+ AND (oe.customer_id IS NOT NULL)
+ AND NOT COALESCE(oe.quotation, FALSE)
+ AND COALESCE(oe.closed, FALSE)
+ )
+EOSQL
+
+ SL::DB::Manager::Project->update_all(
+ set => \%attributes,
+ where => [
+ '!project_status_id' => $new_status->id,
+ \$sql,
+ ],
+ );
+
+ return 1;
+}
+
+1;
+
+__END__
+
+=encoding utf8
+
+=head1 NAME
+
+SL::BackgroundJob::CloseProjectsBelongingToClosedSalesOrders —
+Background job for closing all projects which are linked to a closed
+sales order (via C<oe.globalproject_id>)
+
+=head1 SYNOPSIS
+
+This background job searches all closed sales orders for linked
+projects. Those projects whose status is not C<done> will be modified:
+their status will be set to C<done> and their C<active> flag will be
+set to C<false>.
+
+Both of these can be configured via the job's data hash: C<new_status>
+is the new status' name (defaults to C<done>), and C<set_inactive>
+determines whether or not the project will be set to inactive
+(defaults to 1).
+
+The job is deactivated by default. Administrators of installations
+where such a feature is wanted have to create a job entry manually.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut