Kundenstatistik: offene Rechnungen, offene Aufträge, Angebote, Aufträge,
[kivitendo-erp.git] / SL / Controller / CustomerVendorTurnover.pm
1 package SL::Controller::CustomerVendorTurnover;
2 use strict;
3 use parent qw(SL::Controller::Base);
4 use SL::DBUtils;
5 use SL::DB::AccTransaction;
6 use SL::DB::Invoice;
7 use SL::DB::Order;
8 use SL::DB;
9
10 __PACKAGE__->run_before('check_auth');
11
12 sub action_list_turnover {
13   my ($self) = @_;
14
15   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
16
17   my $cv = $::form->{id} || {};
18   my $open_invoices;
19   if ( $::form->{db} eq 'customer' ) {
20   $open_invoices = SL::DB::Manager::Invoice->get_all(
21     query => [customer_id => $cv,
22                 or => [
23                       amount => { gt => \'paid'},
24                       amount => { lt => \'paid'},
25                     ],
26     ],
27     with_objects => ['dunnings'],
28   );
29   } else {
30     $open_invoices = SL::DB::Manager::PurchaseInvoice->get_all(
31       query   => [ vendor_id => $cv,
32                 or => [
33                       amount => { gt => \'paid'},
34                       amount => { lt => \'paid'},
35                     ],
36                ],
37       sort_by => 'invnumber DESC',
38     );
39   }
40   my $open_items;
41   if (@{$open_invoices}) {
42     return $self->render(\'', { type => 'json' }) unless scalar @{$open_invoices};
43     $open_items = $self->_list_open_items($open_invoices);
44   }
45   my $open_orders = $self->_get_open_orders();
46   return $self->render('customer_vendor_turnover/turnover', { header => 0 }, open_orders => $open_orders, open_items => $open_items, id => $cv);
47 }
48
49 sub _list_open_items {
50   my ($self, $open_items) = @_;
51
52   return $self->render('customer_vendor_turnover/_list_open_items', { output => 0 }, OPEN_ITEMS => $open_items, title => $::locale->text('Open Items') );
53 }
54
55 sub action_count_open_items_by_year {
56   my ($self) = @_;
57
58   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
59   my $dbh = SL::DB->client->dbh;
60
61   my $cv = $::form->{id} || {};
62
63   my $query = "SELECT EXTRACT (YEAR FROM d.transdate),
64     count(d.id),
65     max(d.dunning_level)
66     FROM dunning d
67     LEFT JOIN ar a
68     ON a.id = d.trans_id
69     LEFT JOIN customer c
70     ON a.customer_id = c.id
71     WHERE c.id = $cv
72     GROUP BY EXTRACT (YEAR FROM d.transdate), c.id
73     ORDER BY date_part DESC";
74
75    $self->{dun_statistic} = selectall_hashref_query($::form, $dbh, $query);
76    $self->render('customer_vendor_turnover/count_open_items_by_year', { layout => 0 });
77 }
78 sub action_count_open_items_by_month {
79
80   my ($self) = @_;
81
82   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
83   my $dbh = SL::DB->client->dbh;
84
85   my $cv = $::form->{id} || {};
86
87   my $query = "SELECT CONCAT(EXTRACT (MONTH FROM d.transdate),'/',EXTRACT (YEAR FROM d.transdate)) AS date_part,
88     count(d.id),
89     max(d.dunning_level)
90     FROM dunning d
91     LEFT JOIN ar a
92     ON a.id = d.trans_id
93     LEFT JOIN customer c
94     ON a.customer_id = c.id
95     WHERE c.id = $cv
96     GROUP BY EXTRACT (YEAR FROM d.transdate), EXTRACT (MONTH FROM d.transdate), c.id
97     ORDER BY EXTRACT (YEAR FROM d.transdate) DESC";
98
99    $self->{dun_statistic} = selectall_hashref_query($::form, $dbh, $query);
100    $self->render('customer_vendor_turnover/count_open_items_by_year', { layout => 0 });
101 }
102 sub action_turnover_by_month {
103
104   my ($self) = @_;
105
106   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
107
108   my $dbh = SL::DB->client->dbh;
109   my $cv = $::form->{id} || {};
110   my ($db, $cv_type);
111   if ($::form->{db} eq 'customer') {
112     $db      = "ar";
113     $cv_type = "customer_id";
114   } else {
115     $db      = "ap";
116     $cv_type = "vendor_id";
117   }
118   my $query = <<SQL;
119 SELECT CONCAT(EXTRACT (MONTH FROM transdate),'/',EXTRACT (YEAR FROM transdate)) AS date_part,
120     count(id) as count,
121     sum(amount) as amount,
122     sum(netamount) as netamount,
123     sum(paid) as paid
124     FROM $db WHERE $cv_type = $cv
125     GROUP BY EXTRACT (YEAR FROM transdate), EXTRACT (MONTH FROM transdate)
126     ORDER BY EXTRACT (YEAR FROM transdate) DESC, EXTRACT (MONTH FROM transdate) DESC
127 SQL
128    $self->{turnover_statistic} = selectall_hashref_query($::form, $dbh, $query);
129    $self->render('customer_vendor_turnover/count_turnover', { layout => 0 });
130 }
131 sub action_turnover_by_year {
132   my ($self) = @_;
133
134   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
135
136   my $dbh = SL::DB->client->dbh;
137   my $cv = $::form->{id} || {};
138   my ($db, $cv_type);
139   if ($::form->{db} eq 'customer') {
140     $db      = "ar";
141     $cv_type = "customer_id";
142   } else {
143     $db      = "ap";
144     $cv_type = "vendor_id";
145   }
146   my $query = <<SQL;
147 SELECT EXTRACT (YEAR FROM transdate) as date_part,
148     count(id) as count,
149     sum(amount) as amount,
150     sum(netamount) as netamount,
151     sum(paid) as paid
152     FROM $db WHERE $cv_type = $cv
153     GROUP BY date_part
154     ORDER BY date_part DESC
155 SQL
156    $self->{turnover_statistic} = selectall_hashref_query($::form, $dbh, $query);
157    $self->render('customer_vendor_turnover/count_turnover', { layout => 0 });
158 }
159
160 sub action_get_invoices {
161   my ($self) = @_;
162
163   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
164
165   my $cv = $::form->{id} || {};
166   my $invoices;
167   if ( $::form->{db} eq 'customer' ) {
168     $invoices = SL::DB::Manager::Invoice->get_all(
169       query => [ customer_id => $cv, ],
170       sort_by => 'invnumber DESC',
171     );
172   } else {
173     $invoices = SL::DB::Manager::PurchaseInvoice->get_all(
174       query => [ vendor_id => $cv, ],
175       sort_by => 'invnumber DESC',
176     );
177   }
178   $self->render('customer_vendor_turnover/invoices_statistic', { layout => 0 }, invoices => $invoices);
179 }
180
181 sub action_get_orders {
182   my ($self) = @_;
183
184   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
185
186   my $cv = $::form->{id} || {};
187   my $orders;
188   my $type = $::form->{type};
189   if ( $::form->{db} eq 'customer' ) {
190     $orders = SL::DB::Manager::Order->get_all(
191       query => [ customer_id => $cv,
192                  quotation   => ($type eq 'quotation' ? 'T' : 'F') ],
193       sort_by => ( $type eq 'order' ? 'ordnumber DESC' : 'quonumber DESC'),
194     );
195   } else {
196     $orders = SL::DB::Manager::Order->get_all(
197       query => [ vendor_id => $cv,
198                  quotation   => ($type eq 'quotation' ? 'T' : 'F') ],
199       sort_by => ( $type eq 'order' ? 'ordnumber DESC' : 'quonumber DESC'),
200     );
201   }
202   if ( $type eq 'order') {
203     $self->render('customer_vendor_turnover/order_statistic', { layout => 0 }, orders => $orders);
204   } else {
205     $self->render('customer_vendor_turnover/quotation_statistic', { layout => 0 }, orders => $orders);
206   }
207 }
208
209 sub _get_open_orders {
210   my ( $self ) = @_;
211
212   return $self->render('generic/error', { layout => 0 }, label_error => "list_transactions needs a trans_id") unless $::form->{id};
213   my $open_orders;
214   my $cv = $::form->{id} || {};
215
216   if ( $::form->{db} eq 'customer' ) {
217     $open_orders = SL::DB::Manager::Order->get_all(
218       query => [ customer_id => $cv,
219                    closed => 'F',
220                ],
221                sort_by => 'ordnumber DESC',
222                );
223   } else {
224     $open_orders = SL::DB::Manager::Order->get_all(
225       query => [ vendor_id => $cv,
226                    closed => 'F',
227                ],
228                sort_by => 'ordnumber DESC',
229                );
230   }
231
232   return 0 unless scalar @{$open_orders};
233   return $self->render('customer_vendor_turnover/_list_open_orders', { output => 0 }, orders => $open_orders, title => $::locale->text('Open Orders') );
234 }
235
236 sub _list_articles_by_invoice {
237 }
238 sub _list_count_articles_by_year {
239 }
240 sub check_auth {
241   $::auth->assert('general_ledger');
242 }
243 1;