[freeside-commits] branch master updated. 9db332d80967969856c5b5fe8b6ac91304734b04

Jonathan Prykop jonathan at 420.am
Fri Jan 29 18:25:41 PST 2016


The branch, master has been updated
       via  9db332d80967969856c5b5fe8b6ac91304734b04 (commit)
      from  49432ea28e2f6b274d614b8317fc18c423211e4f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 9db332d80967969856c5b5fe8b6ac91304734b04
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Fri Jan 29 20:24:46 2016 -0600

    RT#39831 Quotation extra information for line items

diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 029dbe1..7bc30ef 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1980,6 +1980,7 @@ sub tables_hashref {
         'quotationpkgnum', 'int', '', '', '', '',
         'format',  'char', 'NULL', 1, '', '',       # not used for anything
         'detail',  'varchar', '', 255, '', '',
+        'copy_on_order',        'char', 'NULL',  1, '', '', # 'Y' to copy when ordering
       ],
       'primary_key'  => 'detailnum',
       'unique'       => [],
diff --git a/FS/FS/quotation.pm b/FS/FS/quotation.pm
index c400493..cb3d80b 100644
--- a/FS/FS/quotation.pm
+++ b/FS/FS/quotation.pm
@@ -399,12 +399,18 @@ as ordered.
 sub order {
   my $self = shift;
   my $pkgnum_map = shift || {};
+  my $details_map = {};
 
   tie my %all_cust_pkg, 'Tie::RefHash';
   foreach my $quotation_pkg ($self->quotation_pkg) {
     my $cust_pkg = FS::cust_pkg->new;
     $pkgnum_map->{ $quotation_pkg->quotationpkgnum } = $cust_pkg;
 
+    # details will be copied below, after package is ordered
+    $details_map->{ $quotation_pkg->quotationpkgnum } = [ 
+      map { $_->copy_on_order ? $_->detail : () } $quotation_pkg->quotation_pkg_detail
+    ];
+
     foreach (qw(pkgpart locationnum start_date contract_end quantity waive_setup)) {
       $cust_pkg->set( $_, $quotation_pkg->get($_) );
     }
@@ -418,15 +424,45 @@ sub order {
     $all_cust_pkg{$cust_pkg} = []; # no services
   }
 
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
   my $error = $self->cust_main->order_pkgs( \%all_cust_pkg );
   
+  unless ($error) {
+    # copy details (copy_on_order filtering handled above)
+    foreach my $quotationpkgnum (keys %$details_map) {
+      next unless @{$details_map->{$quotationpkgnum}};
+      $error = $pkgnum_map->{$quotationpkgnum}->set_cust_pkg_detail(
+        'I',
+        @{$details_map->{$quotationpkgnum}}
+      );
+      last if $error;
+    }
+  }
+
   foreach my $quotationpkgnum (keys %$pkgnum_map) {
     # convert the objects to just pkgnums
     my $cust_pkg = $pkgnum_map->{$quotationpkgnum};
     $pkgnum_map->{$quotationpkgnum} = $cust_pkg->pkgnum;
   }
 
-  $error;
+  if ($error) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  ''; #no error
+
 }
 
 =item charge
diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm
index e264209..1e5a0da 100644
--- a/FS/FS/quotation_pkg.pm
+++ b/FS/FS/quotation_pkg.pm
@@ -380,16 +380,27 @@ sub delete_details {
 
 }
 
-=item set_details [ DETAIL, DETAIL, ... ]
+=item set_details PARAM
 
-Sets quotation details for this package (see L<FS::quotation_pkg_detail>).
+Sets new quotation details for this package (see L<FS::quotation_pkg_detail>),
+removing existing details.
+
+Recognizes the following parameters:
+
+details - arrayref of strings, one for each new detail
+
+copy_on_order - if true, sets copy_on_order flag on new details
 
 If there is an error, returns the error, otherwise returns false.
 
 =cut
 
 sub set_details {
-  my( $self, @details ) = @_;
+  my $self = shift;
+  my %opt = @_;
+
+  $opt{'details'} ||= [];
+  my @details = @{$opt{'details'}};
 
   my $oldAutoCommit = $FS::UID::AutoCommit;
   local $FS::UID::AutoCommit = 0;
@@ -405,6 +416,7 @@ sub set_details {
     my $quotation_pkg_detail = new FS::quotation_pkg_detail {
       'quotationpkgnum' => $self->quotationpkgnum,
       'detail' => $detail,
+      'copy_on_order' => $opt{'copy_on_order'} ? 'Y' : '',
     };
     $error = $quotation_pkg_detail->insert;
     if ( $error ) {
diff --git a/FS/FS/quotation_pkg_detail.pm b/FS/FS/quotation_pkg_detail.pm
index ce13589..76e2fd1 100644
--- a/FS/FS/quotation_pkg_detail.pm
+++ b/FS/FS/quotation_pkg_detail.pm
@@ -42,6 +42,10 @@ for the relevant L<FS::quotation_pkg>
 
 detail text
 
+=item copy_on_order
+
+flag, indicates detail should be copied over when ordering
+
 =cut
 
 # 'format' field isn't used, there for TemplateItem_Mixin
@@ -109,6 +113,7 @@ sub check {
     $self->ut_numbern('detailnum')
     || $self->ut_foreign_key('quotationpkgnum', 'quotation_pkg', 'quotationpkgnum')
     || $self->ut_text('detail')
+    || $self->ut_flag('copy_on_order')
   ;
   return $error if $error;
 
diff --git a/httemplate/edit/process/quotation_pkg_detail.html b/httemplate/edit/process/quotation_pkg_detail.html
index 2fc4202..9e4ac32 100644
--- a/httemplate/edit/process/quotation_pkg_detail.html
+++ b/httemplate/edit/process/quotation_pkg_detail.html
@@ -40,6 +40,9 @@ for ( my $row = 0; exists($param->{"detail$row"}); $row++ ) {
     if $param->{"detail$row"} =~ /\S/;
 }
 
-my $error = $quotation_pkg->set_details(@details);
+my $error = $quotation_pkg->set_details( 
+              details => \@details,
+              copy_on_order => scalar($cgi->param('copy_on_order')) ? 'Y' : ''
+            );
 
 </%init>
diff --git a/httemplate/edit/quotation_pkg_detail.html b/httemplate/edit/quotation_pkg_detail.html
index 80a9044..ae09b9c 100644
--- a/httemplate/edit/quotation_pkg_detail.html
+++ b/httemplate/edit/quotation_pkg_detail.html
@@ -21,6 +21,20 @@
     <TD BGCOLOR="#ffffff"><% $part_pkg->comment |h %></TD>
   </TR>
 
+  <TR>
+    <TD></TD>
+    <TD>
+      <SELECT NAME="copy_on_order">
+        <OPTION VALUE=""<% $copy_on_order ? '' : ' SELECTED' %>>
+          <% emt('Details will only appear on quotation') %>
+        </OPTION>
+        <OPTION VALUE="Y"<% $copy_on_order ? ' SELECTED' : '' %>>
+          <% emt('Copy details to invoice when placing order') %>
+        </OPTION>
+      </SELECT>
+    </TD>
+  </TR>
+
 % my $row = 0;
 % for ( @details ) { 
 
@@ -111,6 +125,21 @@ my $part_pkg = $quotation_pkg->part_pkg;
 
 my @details = $quotation_pkg->details;
 
+my $copy_on_order = 0;
+if (@details) {
+
+  # currently, they should either all have this flag, or none
+  # but just in case, erring on the side of not copying to invoice 
+  #   unless every existing detail has copy_on_order
+  # (anyway, user has to submit change, this is just for autofill)
+
+  my @quotation_pkg_detail = $quotation_pkg->quotation_pkg_detail;
+  my @copy_on_order = grep { $_->copy_on_order } @quotation_pkg_detail;
+  $copy_on_order = 1 if @copy_on_order;
+  my @no_copy_on_order = grep { !$_->copy_on_order } @quotation_pkg_detail;
+  $copy_on_order = 0 if @no_copy_on_order;  
+}
+
 my $title = ( scalar(@details) ? 'Edit ' : 'Add ' ). 'Quotation Details';
 
 </%init>

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Schema.pm                                   |    1 +
 FS/FS/quotation.pm                                |   38 ++++++++++++++++++++-
 FS/FS/quotation_pkg.pm                            |   18 ++++++++--
 FS/FS/quotation_pkg_detail.pm                     |    5 +++
 httemplate/edit/process/quotation_pkg_detail.html |    5 ++-
 httemplate/edit/quotation_pkg_detail.html         |   29 ++++++++++++++++
 6 files changed, 91 insertions(+), 5 deletions(-)




More information about the freeside-commits mailing list