+ # TT tags exist
+ if ( $content =~ m|\[\%.*\%\]| ) {
+ my $tt = Template->new();
+ my $template = $content;
+ # Replace 00X and 0XX with X or XX
+ $content =~ s|fields.00(\d)|fields.$1|g;
+ $content =~ s|fields.0(\d{2})|fields.$1|g;
+ my $tt_output;
+ $tt->process( \$content, $field_list, \$tt_output );
+ push @csv_rows, $tt_output;
+ } else {
+ for my $tag ( @$tags ) {
+ my @fields = $record->field( $tag->{fieldtag} );
+ # If it is a subfield
+ my @loop_values;
+ if (defined $tag->{subfieldtag} ) {
+ my $av = Koha::AuthorisedValues->search_by_marc_field({ frameworkcode => $frameworkcode, tagfield => $tag->{fieldtag}, tagsubfield => $tag->{subfieldtag}, });
+ $av = $av->count ? $av->unblessed : [];
+ my $av_description_mapping = { map { ( $_->{authorised_value} => $_->{lib} ) } @$av };
+ # For each field
+ foreach my $field (@fields) {
+ my @subfields = $field->subfield( $tag->{subfieldtag} );
+ foreach my $subfield (@subfields) {
+ push @loop_values, (defined $av_description_mapping->{$subfield}) ? $av_description_mapping->{$subfield} : $subfield;
+ }
+ }
+
+ # Or a field
+ } else {
+ my $av = Koha::AuthorisedValues->search_by_marc_field({ frameworkcode => $frameworkcode, tagfield => $tag->{fieldtag}, });
+ $av = $av->count ? $av->unblessed : [];
+ my $authvalues = { map { ( $_->{authorised_value} => $_->{lib} ) } @$av };
+
+ foreach my $field ( @fields ) {
+ my $value;
+
+ # If it is a control field
+ if ($field->is_control_field) {
+ $value = defined $authvalues->{$field->as_string} ? $authvalues->{$field->as_string} : $field->as_string;
+ } else {
+ # If it is a field, we gather all subfields, joined by the subfield separator
+ my @subvaluesarray;
+ my @subfields = $field->subfields;
+ foreach my $subfield (@subfields) {
+ push (@subvaluesarray, defined $authvalues->{$subfield->[1]} ? $authvalues->{$subfield->[1]} : $subfield->[1]);
+ }
+ $value = join ($subfieldseparator, @subvaluesarray);
+ }
+
+ # Field processing
+ my $marcfield = $tag->{fieldtag}; # This line fixes a retrocompatibility concern
+ # The "processing" could be based on the $marcfield variable.
+ eval $fieldprocessing if ($fieldprocessing); ## no critic (StringyEval)
+
+ push @loop_values, $value;
+ }
+
+ }
+ push @field_values, {
+ fieldtag => $tag->{fieldtag},
+ subfieldtag => $tag->{subfieldtag},
+ values => \@loop_values,
+ };
+ }
+ for my $field_value ( @field_values ) {
+ if ( $field_value->{subfieldtag} ) {
+ push @csv_rows, join( $subfieldseparator, @{ $field_value->{values} } );
+ } else {
+ push @csv_rows, join( $fieldseparator, @{ $field_value->{values} } );
+ }
+ }
+ }
+ }