+sub cust_sort_fields {
+ cust_header(@_) if( @_ or !@cust_fields );
+ #inefficientish, but tiny lists and only run once per page
+
+ map { $_ eq 'custnum' ? 'custnum' : '' } @cust_fields;
+
+}
+
+=item cust_sql_fields [ CUST_FIELDS_VALUE ]
+
+Returns a list of fields for the SELECT portion of an SQL query.
+
+As with L<the cust_header subroutine|/cust_header>, the fields returned are
+defined by the supplied customer fields setting, or if no customer fields
+setting is supplied, the <B>cust-fields</B> configuration value.
+
+=cut
+
+sub cust_sql_fields {
+
+ my @fields = qw( last first company );
+# push @fields, map "ship_$_", @fields;
+
+ cust_header(@_) if( @_ or !@cust_fields );
+ #inefficientish, but tiny lists and only run once per page
+
+ my @location_fields;
+ foreach my $field (qw( address1 address2 city state zip )) {
+ foreach my $pre ('bill_','ship_') {
+ if ( grep { $_ eq $pre.$field } @cust_fields ) {
+ push @location_fields, $pre.'location.'.$field.' AS '.$pre.$field;
+ }
+ }
+ }
+ foreach my $pre ('bill_','ship_') {
+ if ( grep { $_ eq $pre.'country_full' } @cust_fields ) {
+ push @location_fields, $pre.'locationnum';
+ }
+ }
+
+ foreach my $field (qw(daytime night mobile fax payby)) {
+ push @fields, $field if (grep { $_ eq $field } @cust_fields);
+ }
+ push @fields, 'agent_custid';
+
+ my @extra_fields = ();
+ if (grep { $_ eq 'current_balance' } @cust_fields) {
+ push @extra_fields, FS::cust_main->balance_sql . " AS current_balance";
+ }
+
+ map("cust_main.$_", @fields), @location_fields, @extra_fields;
+}
+
+=item join_cust_main [ TABLE[.CUSTNUM] ] [ LOCATION_TABLE[.LOCATIONNUM] ]
+
+Returns an SQL join phrase for the FROM clause so that the fields listed
+in L<cust_sql_fields> will be available. Currently joins to cust_main
+itself, as well as cust_location (under the aliases 'bill_location' and
+'ship_location') if address fields are needed. L<cust_header()> should have
+been called already.
+
+All of these will be left joins; if you want to exclude rows with no linked
+cust_main record (or bill_location/ship_location), you can do so in the
+WHERE clause.
+
+TABLE is the table containing the custnum field. If CUSTNUM (a field name
+in that table) is specified, that field will be joined to cust_main.custnum.
+Otherwise, this function will assume the field is named "custnum". If the
+argument isn't present at all, the join will just say "USING (custnum)",
+which might work.
+
+As a special case, if TABLE is 'cust_main', only the joins to cust_location
+will be returned.