Refactoring
[kivitendo-erp.git] / SL / DB / Project.pm
1 package SL::DB::Project;
2
3 use strict;
4
5 use List::MoreUtils qw(any);
6
7 use SL::DB::MetaSetup::Project;
8 use SL::DB::Manager::Project;
9
10 use SL::DB::Helper::CustomVariables(
11   module      => 'Projects',
12   cvars_alias => 1,
13 );
14
15 __PACKAGE__->meta->initialize;
16
17 sub validate {
18   my ($self) = @_;
19
20   my @errors;
21   push @errors, $::locale->text('The project number is missing.')        if !$self->projectnumber;
22   push @errors, $::locale->text('The project number is already in use.') if !$self->is_projectnumber_unique;
23   push @errors, $::locale->text('The description is missing.')           if !$self->description;
24
25   return @errors;
26 }
27
28 sub is_used {
29   my ($self) = @_;
30
31   # Unsaved projects are never referenced.
32   return 0 unless $self->id;
33
34   return any {
35     my $column = $SL::DB::Manager::Project::project_id_column_prefixes{$_} . 'project_id';
36     $self->db->dbh->selectrow_arrayref(qq|SELECT EXISTS(SELECT * FROM ${_} WHERE ${column} = ?)|, undef, $self->id)->[0]
37   } @SL::DB::Manager::Project::tables_with_project_id_cols;
38 }
39
40 sub is_projectnumber_unique {
41   my ($self) = @_;
42
43   return 1 unless $self->projectnumber;
44
45   my @filter = (projectnumber => $self->projectnumber);
46   @filter    = (and => [ @filter, '!id' => $self->id ]) if $self->id;
47
48   return !SL::DB::Manager::Project->get_first(where => \@filter);
49 }
50
51 sub full_description {
52   my ($self, %params) = @_;
53
54   $params{style} ||= 'both';
55   my $description;
56
57   if ($params{style} =~ m/number/) {
58     $description = $self->projectnumber;
59
60   } elsif ($params{style} =~ m/description/) {
61     $description = $self->description;
62
63   } else {
64     $description = $self->projectnumber;
65     if ($self->description && do { my $desc = quotemeta $self->description; $self->projectnumber !~ m/$desc/ }) {
66       $description .= ' (' . $self->description . ')';
67     }
68   }
69
70   return $description;
71 }
72
73 1;
74
75 __END__
76
77 =pod
78
79 =head1 NAME
80
81 SL::DB::Project: Model for the 'project' table
82
83 =head1 SYNOPSIS
84
85 This is a standard Rose::DB::Object based model and can be used as one.
86
87 =head1 FUNCTIONS
88
89 =over 4
90
91 =item C<validate>
92
93 Checks whether or not all fields are set to valid values so that the
94 object can be saved. If valid returns an empty list. Returns an array
95 of translated error message otherwise.
96
97 =item C<is_used>
98
99 Checks whether or not the project is referenced from any other
100 database table. Returns a boolean value.
101
102 =item C<is_projectnumber_unique>
103
104 Returns trueish if the project number is not used for any other
105 project in the database. Also returns trueish if no project number has
106 been set yet.
107
108 =item C<full_description %params>
109
110 Returns a full description for the project which can consist of the
111 project number, its description or both. This is determined by the
112 parameter C<style> which defaults to C<both>:
113
114 =over 2
115
116 =item C<both>
117
118 Returns the project's number followed by its description in
119 parenthesis (e.g. "12345 (Secret Combinations)"). If the project's
120 description is already part of the project's number then it will not
121 be appended.
122
123 =item C<projectnumber> (or simply C<number>)
124
125 Returns only the project's number.
126
127 =item C<projectdescription> (or simply C<description>)
128
129 Returns only the project's description.
130
131 =back
132
133 =back
134
135 =head1 AUTHOR
136
137 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
138
139 =cut