RT# 79353 Update discount report - include waived setup fees
[freeside.git] / httemplate / search / cust_bill_pkg_discount.html
1 <%doc>
2
3 Display the Discount Detail Report:
4
5 Parameters:
6
7  - discount_classnum
8  - usernum
9  - agentnum
10  - beginning
11  - ending
12  - include_waived_setup
13
14 </%doc>
15 <& elements/search.html,
16   title       => 'Discounts',
17   name        => 'discounts',
18   query       => $query,
19   count_query => $count_query,
20   count_addl  => [ $money_char . '%.2f total' ],
21
22   header => [
23     qw(
24       Discount
25       Class
26       Amount
27       Months
28       Package
29       Invoice
30       Date
31     ),
32     FS::UI::Web::cust_header(),
33   ],
34
35   fields => [
36     # Discount
37     sub {
38         if ( $_[0]->pkgdiscountnum ) {
39             # Standard discount, not a waived setup fee
40             my $discount = qsearchs('discount',{
41                 discountnum => $_[0]->discountnum
42             });
43             return $discount->description;
44         } else {
45             return 'Waive setup fee';
46         }
47     },
48
49     # Class
50     sub {
51         if ( $_[0]->discountnum ) {
52             # Standard discount, not a waived setup fee
53             my $discount = qsearchs('discount',{
54                 discountnum => $_[0]->discountnum
55             });
56             return $discount->classname;
57         } else {
58             return 'n/a';
59         }
60     },
61
62     # Amount
63     sub {
64       sprintf(
65         $money_char.'%.2f',
66         $_[0]->amount ? $_[0]->amount : $_[0]->setup_fee
67       )
68     },
69
70     # Months
71     sub {
72       my $row = shift;
73       if ($row->pkgdiscountnum) {
74         return sprintf( '%.2f', $row->months );
75       } else {
76         return 'Setup';
77       }
78     },
79
80     # Package
81     'pkg',
82
83     # Invoice
84     'invnum',
85
86     # Date
87     sub { time2str('%b %d %Y', $_[0]->_date) },
88
89     # Customer
90     \&FS::UI::Web::cust_fields,
91   ],
92
93   sort_fields => [
94     '',       # Discount
95     '',       # Class
96     'amount', # Amount
97     'months', # Months
98     'pkg',    # Package
99     'invnum', # Invoice
100     '_date',  # Date
101   ],
102
103   links => [
104     '', # Discount
105     '', # Class
106     '', # Amount
107     '', # Months
108     '', # Package
109     [ "${p}view/cust_bill.cgi?", 'invnum' ], # Invoice
110     [ "${p}view/cust_bill.cgi?", 'invnum' ], # Date
111     (   # Customer
112       map {
113         $_ ne 'Cust. Status'
114           ? [ "${p}view/cust_main.cgi?", 'custnum' ]
115           : ''
116       } FS::UI::Web::cust_header()
117     ),
118   ],
119
120   align => 'lcrrlrr'.FS::UI::Web::cust_aligns(),
121   color => [ '','','','','','','',FS::UI::Web::cust_colors() ],
122   style => [ '','','','','','','',FS::UI::Web::cust_styles() ],
123 &>
124 <%init>
125
126 die "access denied"
127   unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
128
129 my $conf = new FS::Conf;
130
131 # Query building blocks
132 my @select = (qw(
133   cust_bill_pkg_discount.billpkgdiscountnum
134   cust_bill_pkg_discount.pkgdiscountnum
135   cust_bill_pkg_discount.amount
136   cust_bill_pkg_discount.months
137
138   cust_bill.invnum
139   cust_bill._date
140
141   part_pkg.pkg
142
143   cust_main.custnum
144
145   cust_pkg_discount.discountnum
146   cust_pkg.waive_setup),
147
148   "
149   (  SELECT optionvalue
150      FROM part_pkg_option
151      WHERE
152         part_pkg_option.pkgpart = cust_pkg.pkgpart
153         AND optionname = 'setup_fee'
154   ) as setup_fee  ",
155
156   "
157   COALESCE(
158       CAST(cust_bill_pkg_discount.amount AS TEXT),
159       (  SELECT optionvalue
160          FROM part_pkg_option
161          WHERE
162             part_pkg_option.pkgpart = cust_pkg.pkgpart
163             AND optionname = 'setup_fee'
164       )
165   ) as discountorwaive
166   ",
167
168   FS::UI::Web::cust_sql_fields(),
169 );
170
171 my $join = "
172 LEFT JOIN cust_bill_pkg_discount
173   USING (billpkgnum)
174
175 LEFT JOIN cust_pkg_discount
176   ON cust_bill_pkg_discount.pkgdiscountnum = cust_pkg_discount.pkgdiscountnum
177
178 LEFT JOIN cust_pkg
179   ON cust_bill_pkg.pkgnum = cust_pkg.pkgnum
180
181 LEFT JOIN part_pkg
182   USING (pkgpart)
183
184 LEFT JOIN cust_bill USING (invnum)
185
186 LEFT JOIN cust_main
187   ON cust_bill.custnum = cust_main.custnum
188
189 ";
190
191 # Each entry in @where will be joined with AND
192 my @where = (
193
194   # Agent Virtualization
195   $FS::CurrentUser::CurrentUser->agentnums_sql(table => 'cust_main'),
196
197   # Select only rows where there is a discount or waived setup fee
198   "(
199     cust_bill_pkg_discount.billpkgdiscountnum IS NOT NULL
200     OR (
201       cust_pkg.setup = cust_bill_pkg.sdate
202       AND cust_pkg.waive_setup = 'Y'
203     )
204   )",
205
206 );
207
208
209 # Filter: Date Range
210 my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
211 push @where, "_date >= $beginning", "_date <= $ending";
212
213
214 # Filter: Agent
215 if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
216   push @where, "cust_main.agentnum = $1";
217 }
218
219
220 # Filter: User
221 if ( $cgi->param('usernum') =~ /^(\d+)$/ ) {
222   push @where,
223     "( cust_pkg_discount.usernum = $1 OR cust_pkg_discount.usernum IS NULL )";
224 }
225
226 # Filter: Include waived setup fees
227 if ( !$cgi->param('include_waived_setup') ) {
228   push @where, "cust_bill_pkg_discount.pkgdiscountnum IS NOT NULL";
229 }
230
231 # Filter: Discount Class
232 if ( grep { $_ eq 'discount_classnum' } $cgi->param ) {
233
234 #  my @classnum = ();
235 #  if ( ref($params->{'discount_classnum'}) ) {
236 #
237 #    if ( ref($params->{'discount_classnum'}) eq 'HASH' ) {
238 #      @classnum = grep $params->{'discount_classnum'}{$_}, keys %{ $params->{'discount_classnum'} };
239 #    } elsif ( ref($params->{'discount_classnum'}) eq 'ARRAY' ) {
240 #      @classnum = @{ $params->{'discount_classnum'} };
241 #    } else {
242 #      die 'unhandled discount_classnum ref '. $params->{'discount_classnum'};
243 #    }
244 #
245 #
246 #  } elsif ( $params->{'discount_classnum'} =~ /^(\d*)$/ && $1 ne '0' ) {
247 #    @classnum = ( $1 );
248 #  }
249 #
250 #  if ( @classnum ) {
251
252    if ( $cgi->param('discount_classnum') =~ /^(\d*)$/ && $1 ne '0' ) {
253     my @classnum = ( $1 );
254
255     $join .= ' LEFT JOIN discount USING (discountnum) ';
256
257     my @c_where = ();
258     my @nums = grep $_, @classnum;
259     push @c_where, 'discount.classnum IN ('. join(',',@nums). ')' if @nums;
260     my $null = scalar( grep { $_ eq '' } @classnum );
261     push @c_where, 'discount.classnum IS NULL' if $null;
262
263     if ( scalar(@c_where) == 1 ) {
264       push @where, @c_where;
265     } elsif ( @c_where ) {
266       push @where, ' ( '. join(' OR ', @c_where). ' ) ';
267     }
268
269   }
270
271 }
272
273 # #(package) classnum
274 # # not specified: all classes
275 # # 0: empty class
276 # # N: classnum
277 # my $use_override = $cgi->param('use_override');
278 # if ( $cgi->param('classnum') =~ /^(\d+)$/ ) {
279 #   my $comparison = '';
280 #   if ( $1 == 0 ) {
281 #     $comparison = "IS NULL";
282 #   } else {
283 #     $comparison = "= $1";
284 #   }
285
286 #   if ( $use_override ) {
287 #     push @where, "(
288 #       part_pkg.classnum $comparison AND pkgpart_override IS NULL OR
289 #       override.classnum $comparison AND pkgpart_override IS NOT NULL
290 #     )";
291 #   } else {
292 #     push @where, "part_pkg.classnum $comparison";
293 #   }
294 # }
295
296 my $count_query;
297 if ( $cgi->param('include_waived_setup') ) {
298   $count_query = "
299     SELECT
300       COUNT(*),
301       SUM(
302         COALESCE(
303           cust_bill_pkg_discount.amount,
304           CAST((  SELECT optionvalue
305              FROM part_pkg_option
306              WHERE
307                 part_pkg_option.pkgpart = cust_pkg.pkgpart
308                 AND optionname = 'setup_fee'
309           ) AS NUMERIC )
310         )
311       ) ";
312 } else {
313   $count_query = "SELECT COUNT(*), SUM(cust_bill_pkg_discount.amount)";
314 }
315
316 my $where = ' WHERE '. join(' AND ', @where);
317
318 $count_query .= " FROM cust_bill_pkg $join $where";
319
320 my $query = {
321   'table'     => 'cust_bill_pkg',
322   'addl_from' => $join,
323   'hashref'   => {},
324   'select'    => join(', ', @select ),
325   'extra_sql' => $where,
326   'order_by'  => 'ORDER BY _date, billpkgdiscountnum',
327 };
328
329 my $money_char = $conf->config('money_char') || '$';
330
331 </%init>