package FS::quotation;
-use base qw( FS::Template_Mixin FS::cust_main_Mixin FS::otaker_Mixin FS::Record );
+use base qw( FS::Template_Mixin FS::cust_main_Mixin FS::otaker_Mixin FS::Record
+ );
use strict;
-use FS::Record qw( qsearch qsearchs );
+use Tie::RefHash;
use FS::CurrentUser;
+use FS::UID qw( dbh );
+use FS::Maketext qw( emt );
use FS::cust_main;
-use FS::prospect_main;
-use FS::quotation_pkg;
+use FS::cust_pkg;
=head1 NAME
$self->usernum($FS::CurrentUser::CurrentUser->usernum) unless $self->usernum;
+ return 'prospectnum or custnum must be specified'
+ if ! $self->prospectnum
+ && ! $self->custnum;
+
$self->SUPER::check;
}
=item prospect_main
-=cut
-
-sub prospect_main {
- my $self = shift;
- qsearchs('prospect_main', { 'prospectnum' => $self->prospectnum } );
-}
-
=item cust_main
-=cut
-
-sub cust_main {
- my $self = shift;
- qsearchs('cust_main', { 'custnum' => $self->custnum } );
-}
-
=item cust_bill_pkg
=cut
sub cust_bill_pkg { #actually quotation_pkg objects
- my $self = shift;
- qsearch('quotation_pkg', { quotationnum=>$self->quotationnum });
+ shift->quotation_pkg(@_);
}
=item total_setup
}
+=item cust_or_prospect_label_link P
+
+HTML links to either the customer or prospect.
+
+Returns a list consisting of two elements. The first is a text label for the
+link, and the second is the URL.
+
+=cut
+
+sub cust_or_prospect_label_link {
+ my( $self, $p ) = @_;
+
+ if ( my $custnum = $self->custnum ) {
+ my $display_custnum = $self->cust_main->display_custnum;
+ my $target = $FS::CurrentUser::CurrentUser->default_customer_view eq 'jumbo'
+ ? '#quotations'
+ : ';show=quotations';
+ (
+ emt("View this customer (#[_1])",$display_custnum) =>
+ "${p}view/cust_main.cgi?custnum=$custnum$target"
+ );
+ } elsif ( my $prospectnum = $self->prospectnum ) {
+ (
+ emt("View this prospect (#[_1])",$prospectnum) =>
+ "${p}view/prospect_main.html?$prospectnum"
+ );
+ } else { #die?
+ ( '', '' );
+ }
+
+}
+
#prevent things from falsely showing up as taxes, at least until we support
# quoting tax amounts..
sub _items_tax {
shift->cust_bill_pkg;
}
+sub _items_total {
+ my( $self, $total_items ) = @_;
+
+ if ( $self->total_setup > 0 ) {
+ push @$total_items, {
+ 'total_item' => $self->mt( $self->total_recur > 0 ? 'Total Setup' : 'Total' ),
+ 'total_amount' => $self->total_setup,
+ };
+ }
+
+ #could/should add up the different recurring frequencies on lines of their own
+ # but this will cover the 95% cases for now
+ if ( $self->total_recur > 0 ) {
+ push @$total_items, {
+ 'total_item' => $self->mt('Total Recurring'),
+ 'total_amount' => $self->total_recur,
+ };
+ }
+
+}
+
=item enable_previous
=cut
sub enable_previous { 0 }
+=item convert_cust_main
+
+If this quotation already belongs to a customer, then returns that customer, as
+an FS::cust_main object.
+
+Otherwise, creates a new customer (FS::cust_main object and record, and
+associated) based on this quotation's prospect, then orders this quotation's
+packages as real packages for the customer.
+
+If there is an error, returns an error message, otherwise, returns the
+newly-created FS::cust_main object.
+
+=cut
+
+sub convert_cust_main {
+ my $self = shift;
+
+ my $cust_main = $self->cust_main;
+ return $cust_main if $cust_main; #already converted, don't again
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ $cust_main = $self->prospect_main->convert_cust_main;
+ unless ( ref($cust_main) ) { # eq 'FS::cust_main' ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $cust_main;
+ }
+
+ $self->prospectnum('');
+ $self->custnum( $cust_main->custnum );
+ my $error = $self->replace || $self->order;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+ $cust_main;
+
+}
+
+=item order
+
+This method is for use with quotations which are already associated with a customer.
+
+Orders this quotation's packages as real packages for the customer.
+
+If there is an error, returns an error message, otherwise returns false.
+
+=cut
+
+sub order {
+ my $self = shift;
+
+ tie my %cust_pkg, 'Tie::RefHash',
+ map { FS::cust_pkg->new({ pkgpart => $_->pkgpart,
+ quantity => $_->quantity,
+ })
+ => [] #services
+ }
+ $self->quotation_pkg ;
+
+ $self->cust_main->order_pkgs( \%cust_pkg );
+
+}
+
+=item disable
+
+Disables this quotation (sets disabled to Y, which hides the quotation on
+prospects and customers).
+
+If there is an error, returns an error message, otherwise returns false.
+
+=cut
+
+sub disable {
+ my $self = shift;
+ $self->disabled('Y');
+ $self->replace();
+}
+
+=item enable
+
+Enables this quotation.
+
+If there is an error, returns an error message, otherwise returns false.
+
+=cut
+
+sub enable {
+ my $self = shift;
+ $self->disabled('');
+ $self->replace();
+}
+
=back
=head1 CLASS METHODS