Project-Picker basierend auf Part-Picker
[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   } elsif ($params{style} =~ m/full/) {
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     $description = $self->customer->name . " (${description})";
70
71   } else {
72     $description = $self->projectnumber;
73     if ($self->description && do { my $desc = quotemeta $self->description; $self->projectnumber !~ m/$desc/ }) {
74       $description .= ' (' . $self->description . ')';
75     }
76   }
77
78   return $description;
79 }
80
81 1;
82
83 __END__
84
85 =pod
86
87 =head1 NAME
88
89 SL::DB::Project: Model for the 'project' table
90
91 =head1 SYNOPSIS
92
93 This is a standard Rose::DB::Object based model and can be used as one.
94
95 =head1 FUNCTIONS
96
97 =over 4
98
99 =item C<validate>
100
101 Checks whether or not all fields are set to valid values so that the
102 object can be saved. If valid returns an empty list. Returns an array
103 of translated error message otherwise.
104
105 =item C<is_used>
106
107 Checks whether or not the project is referenced from any other
108 database table. Returns a boolean value.
109
110 =item C<is_projectnumber_unique>
111
112 Returns trueish if the project number is not used for any other
113 project in the database. Also returns trueish if no project number has
114 been set yet.
115
116 =item C<full_description %params>
117
118 Returns a full description for the project which can consist of the
119 project number, its description or both. This is determined by the
120 parameter C<style> which defaults to C<both>:
121
122 =over 2
123
124 =item C<both>
125
126 Returns the project's number followed by its description in
127 parenthesis (e.g. "12345 (Secret Combinations)"). If the project's
128 description is already part of the project's number then it will not
129 be appended.
130
131 =item C<projectnumber> (or simply C<number>)
132
133 Returns only the project's number.
134
135 =item C<projectdescription> (or simply C<description>)
136
137 Returns only the project's description.
138
139 =item C<full>
140
141 Returns the customer name followed by the project number and project
142 description in parenthesis (e.g. "Evil Corp (12345 World
143 domination)"). If the project's description is already part of the
144 project's number then it will not be appended.
145
146 =back
147
148 =back
149
150 =head1 AUTHOR
151
152 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
153
154 =cut