move header() to include(/elements/header.html) so it can be changed in one place...
[freeside.git] / httemplate / misc / process / meta-import.cgi
index d42d6d4..4cdecaf 100644 (file)
@@ -1,5 +1,6 @@
 <!-- mason kludge -->
-<%= header('Map tables') %>
+<%= include("/elements/header.html",'Map tables') %>
+
 <SCRIPT>
 var gSafeOnload = new Array();
 var gSafeOnsubmit = new Array();
@@ -19,68 +20,55 @@ function SafeOnsubmit() {
     gSafeOnsubmit[i]();
 }
 </SCRIPT>
+
+<FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
+
 <%
-  #one
-  unless ( $cgi->param('magic') ) {
-
-    #oops, silly
-    #my $fh = $cgi->upload('csvfile');
-    ##warn $cgi;
-    ##warn $fh;
-    #
-    #use Archive::Tar;
-    #$tar = Archive::Tar->new();
-    #$tar->create_archive($fh); #or die $tar->error;
-
-    #haha for now
-    my @files = qw(
-authserv  credtype  dunprev  invoice  pmtdet    product   taxplan
-ccdet     customer  genlog   ledger   pops      pubvars   
-cchist    discplan  glacct   origco   prodcat   recur     users
-credcode  dundet    invline  payment  prodclas  repforms  webserv
-    );
+  #use DBIx::DBSchema;
+  my $schema = new_native DBIx::DBSchema
+                 map { $cgi->param($_) } qw( data_source username password );
+  foreach my $field (qw( data_source username password )) { %>
+    <INPUT TYPE="hidden" NAME=<%= $field %> VALUE="<%= $cgi->param($field) %>">
+  <% }
+
+  my %schema;
+  use Tie::DxHash;
+  tie %schema, 'Tie::DxHash';
+  if ( $cgi->param('schema') ) {
+    my $schema_string = $cgi->param('schema');
+    %> <INPUT TYPE="hidden" NAME="schema" VALUE="<%=$schema_string%>"> <%
+    %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
+                      or die "guru meditation #420: $_";
+                    ( $1 => $2 );
+                  }
+              split( /\n/, $schema_string );
+  }
+
+  #first page
+  unless ( $cgi->param('magic') ) { %>
 
-    %>
-    <FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
     <INPUT TYPE="hidden" NAME="magic" VALUE="process">
-    <%= hashmaker('schema', \@files, [ grep { ! /^h_/ } dbdef->tables ] ) %>
+    <%= hashmaker('schema', [ $schema->tables ],
+                            [ grep !/^h_/, dbdef->tables ],  ) %>
     <br><INPUT TYPE="submit" VALUE="done">
-    </FORM>
-    </BODY>
-    </HTML>
     <%
 
-  } elsif ( $cgi->param('magic') eq 'process' ) {
+  #second page
+  } elsif ( $cgi->param('magic') eq 'process' ) { %>
 
-    %>
-    <FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
     <INPUT TYPE="hidden" NAME="magic" VALUE="process2">
     <%
 
-    my $schema_string = $cgi->param('schema');
-    my %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
-                         or die "guru meditation #420: $_";
-                       ( $1 => $2 );
-                     }
-                 split( /\n/, $schema_string );
-
-    #*** should be in global.asa/handler.pl like the rest
-    eval 'use Text::CSV_XS;';
-
+    my %unique;
     foreach my $table ( keys %schema ) {
 
-      my $csv = Text::CSV_XS->new({ 'binary'=>1 });
-      open(FILE,"</home/ivan/intergate/legacy/csvdir/$table")
-        or die "can't /home/ivan/intergate/legacy/csvdir/$table: $!";
-      my $header = lc(<FILE>);
-      close FILE;
-      $csv->parse($header) or die;
-      my @from_columns = $csv->fields;
-
+      my @from_columns = $schema->table($table)->columns;
       my @fs_columns = dbdef->table($schema{$table})->columns;
 
       %>
-      <%= hashmaker($table, \@from_columns, \@fs_columns, $table, $schema{$table} ) %>
+      <%= hashmaker( $table.'__'.$unique{$table}++,
+                     \@from_columns => \@fs_columns,
+                     $table         =>  $schema{$table}, ) %>
       <br><hr><br>
       <%
 
@@ -88,31 +76,58 @@ credcode  dundet    invline  payment  prodclas  repforms  webserv
 
     %>
     <br><INPUT TYPE="submit" VALUE="done">
-    </FORM>
-    </BODY>
-    </HTML>
     <%
 
-  } elsif ( $cgi->param('magic') eq 'process' ) {
+  #third (results)
+  } elsif ( $cgi->param('magic') eq 'process2' ) {
 
-    %>
-    print results!!
-    <%
+    print "<pre>\n";
+
+    my %unique;
+    foreach my $table ( keys %schema ) {
+      ( my $spaces = $table ) =~ s/./ /g;
+      print "'$table' => { 'table' => '$schema{$table}',\n".
+            #(length($table) x ' '). "         'map'   => {\n";
+            "$spaces        'map'   => {\n";
+      my %map = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
+                         or die "guru meditation #420: $_";
+                       ( $1 => $2 );
+                     }
+                 split( /\n/, $cgi->param($table.'__'.$unique{$table}++) );
+      foreach ( keys %map ) {
+        print "$spaces                     '$_' => '$map{$_}',\n";
+      }
+      print "$spaces                   },\n";
+      print "$spaces      },\n";
+
+    }
+    print "\n</pre>";
+
+  } else {
+    warn "unrecognized magic: ". $cgi->param('magic');
   }
 
+  %>
+</FORM>
+</BODY>
+</HTML>
+
+  <%
   #hashmaker widget
   sub hashmaker {
     my($name, $from, $to, $labelfrom, $labelto) = @_;
-    $fromsize = scalar(@$from);
-    $tosize = scalar(@$to);
+    my $fromsize = scalar(@$from);
+    my $tosize = scalar(@$to);
     "<TABLE><TR><TH>$labelfrom</TH><TH>$labelto</TH></TR><TR><TD>".
         qq!<SELECT NAME="${name}_from" SIZE=$fromsize>\n!.
         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$from ).
-        "</SELECT>\n".
+        "</SELECT>\n<BR>".
+      qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_from()">!.
       '</TD><TD>'.
         qq!<SELECT NAME="${name}_to" SIZE=$tosize>\n!.
         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$to ).
-        "</SELECT>\n".
+        "</SELECT>\n<BR>".
+      qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_to()">!.
       '</TD></TR>'.
       '<TR><TD COLSPAN=2>'.
         qq!<INPUT TYPE="button" VALUE="map" onClick="toke_$name(this.form)">!.
@@ -138,6 +153,24 @@ credcode  dundet    invline  payment  prodclas  repforms  webserv
               object.options[index] = null;
               return value;
             }
+            function repack_${name}_from() {
+              var object = document.OneTrueForm.${name}_from;
+              object.options.length = 0;
+              ". join("\n", 
+                   map { "addOption_$name(object, '$_');\n" }
+                       ( sort { $a cmp $b } @$from )           ). "
+            }
+            function repack_${name}_to() {
+              var object = document.OneTrueForm.${name}_to;
+              object.options.length = 0;
+              ". join("\n", 
+                   map { "addOption_$name(object, '$_');\n" }
+                       ( sort { $a cmp $b } @$to )           ). "
+            }
+            function addOption_$name(object,value) {
+              var length = object.length;
+              object.options[length] = new Option(value, value, false, false);
+            }
       </script>".
       '';
   }