Bug 32027: Fix 'librarian interface' to use 'staff interface' in Pages/HTML customiza...
[koha-ffzg.git] / C4 / ImportExportFramework.pm
index 2ad5ac9..3d44d46 100644 (file)
@@ -193,7 +193,7 @@ Functions for handling import/export.
 
 =head2 ExportFramework
 
-Export all the information of a Framework to an excel "xml" file or OpenDocument SpreadSheet "ods" file.
+Export all information of a bibliographic or authority MARC framework to an Excel "xml" file, comma separated values "csv" or OpenDocument SpreadSheet "ods".
 
 return :
 succes
@@ -202,7 +202,7 @@ succes
 
 sub ExportFramework
 {
-    my ($frameworkcode, $xmlStrRef, $mode) = @_;
+    my ($frameworkcode, $xmlStrRef, $mode, $frameworktype) = @_;
 
     my $dbh = C4::Context->dbh;
     if ($dbh) {
@@ -229,8 +229,15 @@ sub ExportFramework
             }
         }
 
-        if (_export_table('marc_tag_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
-            if (_export_table('marc_subfield_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
+        my $table = 'marc_tag_structure';
+        my $subtable = 'marc_subfield_structure';
+        if ($frameworktype eq "authority") {
+            $table = 'auth_tag_structure';
+            $subtable = 'auth_subfield_structure';
+        }
+
+        if (_export_table($table, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
+            if (_export_table($subtable, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
                 $$xmlStrRef = $dom->toString(1) if ($mode eq 'ods' || $mode eq 'excel');
                 return 1;
             }
@@ -245,20 +252,20 @@ sub ExportFramework
 # Export all the data from a mysql table to an spreadsheet.
 sub _export_table
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode, $mode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $mode, $frameworktype) = @_;
     if ($mode eq 'csv') {
-        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     } elsif ($mode eq 'ods') {
-        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     } else {
-        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     }
 }
 
 # Export the mysql table to an csv file
 sub _export_table_csv
 {
-    my ($table, $dbh, $strCSV, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $strCSV, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         # First row with the name of the columns
@@ -274,6 +281,9 @@ sub _export_table_csv
         $$strCSV .= chr(10);
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -306,7 +316,7 @@ sub _export_table_csv
 # Export the mysql table to an ods file
 sub _export_table_ods
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         my $elementTable = $dom->createElement('table:table');
@@ -335,6 +345,9 @@ sub _export_table_ods
         }
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -372,7 +385,7 @@ sub _export_table_ods
 # Export the mysql table to an excel-xml (openoffice/libreoffice compatible) file
 sub _export_table_excel
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         my $elementWS = $dom->createElement('Worksheet');
@@ -402,6 +415,9 @@ sub _export_table_excel
         }
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -433,12 +449,6 @@ sub _export_table_excel
     return 1;
 }#_export_table_excel
 
-
-
-
-
-
-
 # Format chars problematics to a correct format for xml.
 sub _parseContent2Xml
 {
@@ -623,7 +633,7 @@ sub _getMeta
 
 =head2 ImportFramework
 
-Import all the information of a Framework from a excel-xml/ods file.
+Import all the information of a MARC or Authority Type Framework from a excel-xml/ods file.
 
 return :
 success
@@ -632,11 +642,12 @@ success
 
 sub ImportFramework
 {
-    my ($filename, $frameworkcode, $deleteFilename) = @_;
+    my ($filename, $frameworkcode, $deleteFilename, $frameworktype) = @_;
 
     my $tempdir;
     my $ok = -1;
     my $dbh = C4::Context->dbh;
+    $frameworktype ||= '';
     if (-r $filename && $dbh) {
         my $extension = '';
         if ($filename =~ /\.(csv|ods|xml)$/i) {
@@ -662,15 +673,33 @@ sub ImportFramework
                     # They are text files, so open it to read
                     open($dom, '<', $filename);
                 }
+
+                my $table = 'marc_tag_structure';
+                my $subtable = 'marc_subfield_structure';
+                if ($frameworktype eq "authority") {
+                    $table = 'auth_tag_structure';
+                    $subtable = 'auth_subfield_structure';
+                }
+
                 if ($dom) {
                     # Process both tables
                     my $numDeleted = 0;
                     my $numDeletedAux = 0;
-                    if (($numDeletedAux = _import_table($dbh, 'marc_tag_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension)) >= 0) {
-                        $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
-                        if (($numDeletedAux = _import_table($dbh, 'marc_subfield_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension)) >= 0) {
+                    if ($frameworktype eq "authority"){
+                        if (($numDeletedAux = _import_table($dbh, $table, $frameworkcode, $dom, ['authtypecode', 'tagfield'], $extension, $frameworktype)) >= 0) {
                             $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
-                            $ok = ($numDeleted > 0)?$numDeleted:0;
+                            if (($numDeletedAux = _import_table($dbh, $subtable, $frameworkcode, $dom, ['authtypecode', 'tagfield', 'tagsubfield'], $extension, $frameworktype)) >= 0) {
+                                $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
+                                $ok = ($numDeleted > 0)?$numDeleted:0;
+                            }
+                        }
+                    } else {
+                        if (($numDeletedAux = _import_table($dbh, $table, $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension, $frameworktype)) >= 0) {
+                            $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
+                            if (($numDeletedAux = _import_table($dbh, $subtable, $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension, $frameworktype)) >= 0) {
+                                $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
+                                $ok = ($numDeleted > 0)?$numDeleted:0;
+                            }
                         }
                     }
                 } else {
@@ -789,15 +818,19 @@ sub _check_validity_worksheet
 # Import the data from an excel-xml/ods to mysql tables.
 sub _import_table
 {
-    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format) = @_;
+    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format, $frameworktype) = @_;
     my %fields2Delete;
     my $query;
     my @fields;
+    $frameworktype ||= '';
     # Create hash with all elements defined by primary key to know which ones to delete after parsing the spreadsheet
     eval {
         @fields = @$PKArray;
         shift @fields;
         $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE authtypecode=?';
+        }
         my $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $field;
@@ -820,11 +853,11 @@ sub _import_table
                 push @fieldsName, $hashRef->{Field};
             }
         };
-        $ok = _import_table_csv($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete, \@fieldsName);
+        $ok = _import_table_csv($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete, \@fieldsName, $frameworktype);
     } elsif ($format eq 'ods') {
-        $ok = _import_table_ods($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete);
+        $ok = _import_table_ods($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete, $frameworktype);
     } else {
-        $ok = _import_table_excel($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete);
+        $ok = _import_table_excel($dbh, $table, $frameworkcode, $dom, $PKArray, \%fields2Delete, $frameworktype);
     }
     if ($ok) {
         if (($ok = scalar(keys %fields2Delete)) > 0) {
@@ -875,7 +908,7 @@ sub _processRow_DB
 # Process the rows of a worksheet and insert/update them in a mysql table.
 sub _processRows_Table
 {
-    my ($dbh, $frameworkcode, $nodeR, $table, $PKArray, $format, $fields2Delete) = @_;
+    my ($dbh, $frameworkcode, $nodeR, $table, $PKArray, $format, $fields2Delete, $frameworktype) = @_;
 
     my $query;
     my @fields = ();
@@ -901,7 +934,7 @@ sub _processRows_Table
                 chop($updateStr) if ($updateStr);
             } else {
                 # Get data from row
-                my ($dataFields, $dataFieldsR) = _getDataFields($frameworkcode, $nodeR, \@fields, $format);
+                my ($dataFields, $dataFieldsR) = _getDataFields($frameworkcode, $nodeR, \@fields, $format, $frameworktype);
                 if (scalar(@fields) == scalar(@$dataFieldsR)) {
                     $ok = _processRow_DB($dbh, $table, $fields, $dataStr, $updateStr, $dataFieldsR, $dataFields, $PKArray, \@fieldsPK, $fields2Delete);
                 } else {
@@ -921,8 +954,7 @@ sub _processRows_Table
 # Import worksheet from the csv file to the mysql table
 sub _import_table_csv
 {
-    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete, $fields) = @_;
-
+    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete, $fields, $frameworktype) = @_;
     my $row = '';
     my $partialRow = '';
     my $numFields = @$fields;
@@ -971,17 +1003,31 @@ sub _import_table_csv
                 for my $value (@arrData) {
                     if ( grep { $_ == $j } @empty_indexes ) {
                         # empty field
-                    } elsif ($fields->[$j] eq 'frameworkcode' && $value ne $frameworkcode) {
-                        $dataFields{$fields->[$j]} = $frameworkcode;
-                        push @values, $frameworkcode;
-                    } elsif ($fields->[$j] eq 'isurl' && defined $value && $value eq q{}) {
-                        $dataFields{$fields->[$j]} = undef;
-                        push @values, undef;
+                    } elsif ($frameworktype eq "authority"){
+                        if ($fields->[$j] eq 'authtypecode' && $value ne $frameworkcode) {
+                            $dataFields{$fields->[$j]} = $frameworkcode;
+                            push @values, $frameworkcode;
+                        } elsif ($fields->[$j] eq 'isurl' && defined $value && $value eq q{}) {
+                            $dataFields{$fields->[$j]} = undef;
+                            push @values, undef;
+                        } else {
+                            $dataFields{$fields->[$j]} = $value;
+                            push @values, $value;
+                        }
+                        $j++
                     } else {
-                        $dataFields{$fields->[$j]} = $value;
-                        push @values, $value;
+                        if ($fields->[$j] eq 'frameworkcode' && $value ne $frameworkcode) {
+                            $dataFields{$fields->[$j]} = $frameworkcode;
+                            push @values, $frameworkcode;
+                        } elsif ($fields->[$j] eq 'isurl' && defined $value && $value eq q{}) {
+                            $dataFields{$fields->[$j]} = undef;
+                            push @values, undef;
+                        } else {
+                            $dataFields{$fields->[$j]} = $value;
+                            push @values, $value;
+                        }
+                        $j++
                     }
-                    $j++
                 }
                 $ok = _processRow_DB($dbh, $table, $fieldsStr, $dataStr, $updateStr, \@values, \%dataFields, $PKArray, \@fieldsPK, $fields2Delete);
             }
@@ -996,7 +1042,7 @@ sub _import_table_csv
 # Import worksheet from the ods content.xml file to the mysql table
 sub _import_table_ods
 {
-    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete) = @_;
+    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete, $frameworktype) = @_;
 
     my $xc = XML::LibXML::XPathContext->new($dom);
     $xc->registerNs('xmlns:office','urn:oasis:names:tc:opendocument:xmlns:office:1.0');
@@ -1006,7 +1052,7 @@ sub _import_table_ods
     @nodes = $xc->findnodes('//table:table[@table:name="' . $table . '"]');
     if (@nodes == 1 && $nodes[0]->hasChildNodes()) {
         my $nodeR = $nodes[0]->firstChild;
-        return _processRows_Table($dbh, $frameworkcode, $nodeR, $table, $PKArray, 'ods', $fields2Delete);
+        return _processRows_Table($dbh, $frameworkcode, $nodeR, $table, $PKArray, 'ods', $fields2Delete, $frameworktype);
     } else {
         Koha::Logger->get->warn("Error _import_table_ods there's not worksheet for $table");
     }
@@ -1017,7 +1063,7 @@ sub _import_table_ods
 # Import worksheet from the excel-xml file to the mysql table
 sub _import_table_excel
 {
-    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete) = @_;
+    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete, $frameworktype) = @_;
 
     my $xc = XML::LibXML::XPathContext->new($dom);
     $xc->registerNs('xmlns','urn:schemas-microsoft-com:office:spreadsheet');
@@ -1030,7 +1076,7 @@ sub _import_table_excel
             my @nodesT = $nodes[$i]->getElementsByTagNameNS('urn:schemas-microsoft-com:office:spreadsheet', 'Table');
             if (@nodesT == 1 && $nodesT[0]->hasChildNodes()) {
                 my $nodeR = $nodesT[0]->firstChild;
-                return _processRows_Table($dbh, $frameworkcode, $nodeR, $table, $PKArray, undef, $fields2Delete);
+                return _processRows_Table($dbh, $frameworkcode, $nodeR, $table, $PKArray, undef, $fields2Delete, $frameworktype);
             }
         }
     } else {
@@ -1067,10 +1113,11 @@ sub _getDataNodeODS
 # Get the data from a row of a spreadsheet
 sub _getDataFields
 {
-    my ($frameworkcode, $node, $fields, $format) = @_;
+    my ($frameworkcode, $node, $fields, $format, $frameworktype) = @_;
 
     my $dataFields = {};
     my @dataFieldsA = ();
+    $frameworktype ||= '';
     if ($node && $node->hasChildNodes()) {
         my $node2 = $node->firstChild;
         my ($data, $repeated);
@@ -1094,11 +1141,20 @@ sub _getDataFields
             if ($ok) {
                 $data //= '';
                 $data = '' if ($data eq '#');
-                if ( $fields->[$i] eq 'frameworkcode' ) {
-                    $data = $frameworkcode;
-                }
-                elsif ( $fields->[$i] eq 'isurl' ) {
-                    $data = undef if defined $data && $data eq q{};
+                if ($frameworktype eq "authority") {
+                    if ( $fields->[$i] eq 'authtypecode' ) {
+                        $data = $frameworkcode;
+                    }
+                    elsif ( $fields->[$i] eq 'isurl' ) {
+                        $data = undef if defined $data && $data eq q{};
+                    }
+                } else {
+                    if ( $fields->[$i] eq 'frameworkcode' ) {
+                        $data = $frameworkcode;
+                    }
+                    elsif ( $fields->[$i] eq 'isurl' ) {
+                        $data = undef if defined $data && $data eq q{};
+                    }
                 }
                 $dataFields->{$fields->[$i]} = $data;
                 push @dataFieldsA, $data;