Order: new_from: auch gleiche Quell- und Ziel-Typen berücksichtigen
[kivitendo-erp.git] / SL / DB / Manager / Project.pm
1 package SL::DB::Manager::Project;
2
3 use strict;
4
5 use parent qw(SL::DB::Helper::Manager);
6
7 use SL::DB::Helper::Paginated;
8 use SL::DB::Helper::Sorted;
9 use SL::DB::Helper::Filtered;
10
11 sub object_class { 'SL::DB::Project' }
12
13 __PACKAGE__->make_manager_methods;
14 __PACKAGE__->add_filter_specs(
15   active => sub {
16     my ($key, $value, $prefix) = @_;
17     # TODO add boolean context
18     return ()                        if $value eq 'both';
19     return ($prefix . "active" => 1) if $value eq 'active';
20     return (or => [ $prefix . "active" => 0, $prefix . "active" => undef ]) if $value eq 'inactive';
21   },
22   valid => sub {
23     my ($key, $value, $prefix) = @_;
24     return ()                       if $value eq 'both';
25     return ($prefix . "valid" => 1) if $value eq 'valid';
26     return (or => [ $prefix . "valid" => 0, $prefix . "valid" => undef ]) if $value eq 'invalid';
27   },
28   status => sub {
29     my ($key, $value, $prefix) = @_;
30     return () if $value ne 'orphaned';
31     return __PACKAGE__->is_not_used_filter($prefix);
32   },
33   all => sub {
34     my ($key, $value, $prefix) = @_;
35     return or => [ map { $prefix . $_ => $value } qw(projectnumber description customer.name) ]
36   }
37 );
38
39 our %project_id_column_prefixes = (
40   ar              => 'global',
41   ap              => 'global',
42   oe              => 'global',
43   delivery_orders => 'global',
44 );
45
46 our @tables_with_project_id_cols = qw(acc_trans ap ar delivery_order_items delivery_orders invoice oe orderitems);
47
48 sub _sort_spec {
49   return (
50     default        => [ 'projectnumber', 1 ],
51     columns        => {
52       SIMPLE       => 'ALL',
53       customer     => 'customer.name',
54       project_type => 'project_type.description',
55       project_status => 'project_status.description',
56       customer_and_description => [ qw(customer.name project.description) ],
57     });
58 }
59
60 sub is_not_used_filter {
61   my ($class, $prefix) = @_;
62
63   my $query = join ' UNION ', map {
64     my $column = $project_id_column_prefixes{$_} . 'project_id';
65     qq|SELECT DISTINCT ${column} FROM ${_} WHERE ${column} IS NOT NULL|
66   } @tables_with_project_id_cols;
67
68   return ("!${prefix}id" => [ \"(${query})" ]);
69 }
70
71 sub default_objects_per_page {
72   20;
73 }
74
75 1;
76 __END__
77
78 =pod
79
80 =encoding utf8
81
82 =head1 NAME
83
84 SL::DB::Manager::Project - Manager for models for the 'project' table
85
86 =head1 SYNOPSIS
87
88 This is a standard Rose::DB::Manager based model manager and can be
89 used as such.
90
91 =head1 FUNCTIONS
92
93 =over 4
94
95 =item C<is_not_used_filter>
96
97 Returns an array containing a partial filter suitable for the C<query>
98 parameter that limits to projects that are not referenced from any
99 other database table.
100
101 =back
102
103 =head1 BUGS
104
105 Nothing here yet.
106
107 =head1 AUTHOR
108
109 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
110
111 =cut