-use Modern::Perl;
-
-use base qw(Class::Accessor);
-
-use C4::Context;
-
-__PACKAGE__->mk_accessors(qw( id tablename name authorised_value_category marcfield searchable values ));
-
-sub new {
- my ( $class, $args ) = @_;
-
- my $additional_field = {
- id => $args->{id} // q||,
- tablename => $args->{tablename} // q||,
- name => $args->{name} // q||,
- authorised_value_category => $args->{authorised_value_category} // q||,
- marcfield => $args->{marcfield} // q||,
- searchable => $args->{searchable} // 0,
- values => $args->{values} // {},
- };
-
- my $self = $class->SUPER::new( $additional_field );
-
- bless $self, $class;
- return $self;
-}
-
-sub fetch {
- my ( $self ) = @_;
- my $dbh = C4::Context->dbh;
- my $field_id = $self->id;
- return unless $field_id;
- my $data = $dbh->selectrow_hashref(
- q|
- SELECT id, tablename, name, authorised_value_category, marcfield, searchable
- FROM additional_fields
- WHERE id = ?
- |,
- {}, ( $field_id )
- );
-
- die "This additional field does not exist (id=$field_id)" unless $data;
- $self->{id} = $data->{id};
- $self->{tablename} = $data->{tablename};
- $self->{name} = $data->{name};
- $self->{authorised_value_category} = $data->{authorised_value_category};
- $self->{marcfield} = $data->{marcfield};
- $self->{searchable} = $data->{searchable};
- return $self;
-}
-
-sub update {
- my ( $self ) = @_;
-
- die "There is no id defined for this additional field. I cannot update it" unless $self->{id};
-
- my $dbh = C4::Context->dbh;
- local $dbh->{RaiseError} = 1;
-
- return $dbh->do(q|
- UPDATE additional_fields
- SET name = ?,
- authorised_value_category = ?,
- marcfield = ?,
- searchable = ?
- WHERE id = ?
- |, {}, ( $self->{name}, $self->{authorised_value_category}, $self->{marcfield}, $self->{searchable}, $self->{id} ) );
-}
-
-sub delete {
- my ( $self ) = @_;
- return unless $self->{id};
- my $dbh = C4::Context->dbh;
- local $dbh->{RaiseError} = 1;
- return $dbh->do(q|
- DELETE FROM additional_fields WHERE id = ?
- |, {}, ( $self->{id} ) );
-}
-
-sub insert {
- my ( $self ) = @_;
- my $dbh = C4::Context->dbh;
- local $dbh->{RaiseError} = 1;
- $dbh->do(q|
- INSERT INTO additional_fields
- ( tablename, name, authorised_value_category, marcfield, searchable )
- VALUES ( ?, ?, ?, ?, ? )
- |, {}, ( $self->{tablename}, $self->{name}, $self->{authorised_value_category}, $self->{marcfield}, $self->{searchable} ) );
- $self->{id} = $dbh->{mysql_insertid};
-}
-
-sub insert_values {
- my ( $self ) = @_;
-
- my $dbh = C4::Context->dbh;
- local $dbh->{RaiseError} = 1;
- while ( my ( $record_id, $value ) = each %{$self->{values}} ) {
- next unless defined $value;
- my $updated = $dbh->do(q|
- UPDATE additional_field_values
- SET value = ?
- WHERE field_id = ?
- AND record_id = ?
- |, {}, ( $value, $self->{id}, $record_id ));
- if ( $updated eq '0E0' ) {
- $dbh->do(q|
- INSERT INTO additional_field_values( field_id, record_id, value )
- VALUES( ?, ?, ?)
- |, {}, ( $self->{id}, $record_id, $value ));
- }
- }
-}
-
-sub fetch_values {
- my ( $self, $args ) = @_;
- my $record_id = $args->{record_id};
- my $dbh = C4::Context->dbh;
- my $values = $dbh->selectall_arrayref(
- q|
- SELECT *
- FROM additional_fields af, additional_field_values afv
- WHERE af.id = afv.field_id
- AND af.tablename = ?
- AND af.name = ?
- | . ( $record_id ? q|AND afv.record_id = ?| : '' ),
- {Slice => {}}, ( $self->{tablename}, $self->{name}, ($record_id ? $record_id : () ) )
- );
-
- $self->{values} = {};
- for my $v ( @$values ) {
- $self->{values}{$v->{record_id}} = $v->{value};
- }
-}
-
-sub delete_values {
- my ($self, $args) = @_;
-
- my $record_id = $args->{record_id};
-
- my $dbh = C4::Context->dbh;
-
- my @where_strs = ('field_id = ?');
- my @where_args = ($self->{id});
-
- if ($record_id) {
- push @where_strs, 'record_id = ?';
- push @where_args, $record_id;
- }
-
- my $query = q{
- DELETE FROM additional_field_values
- WHERE
- } . join (' AND ', @where_strs);
-
- $dbh->do($query, undef, @where_args);
-}
-
-sub all {
- my ( $class, $args ) = @_;
- die "BAD CALL: Don't use fetch_all_values as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
- my $tablename = $args->{tablename};
- my $searchable = $args->{searchable};
- my $dbh = C4::Context->dbh;
- my $query = q|
- SELECT * FROM additional_fields WHERE 1
- |;
- $query .= q| AND tablename = ?|
- if $tablename;
-
- $query .= q| AND searchable = ?|
- if defined $searchable;
-
- my $results = $dbh->selectall_arrayref(
- $query, {Slice => {}}, (
- $tablename ? $tablename : (),
- defined $searchable ? $searchable : ()
- )
- );
- my @fields;
- for my $r ( @$results ) {
- push @fields, Koha::AdditionalField->new({
- id => $r->{id},
- tablename => $r->{tablename},
- name => $r->{name},
- authorised_value_category => $r->{authorised_value_category},
- marcfield => $r->{marcfield},
- searchable => $r->{searchable},
- });
- }
- return \@fields;
-
-}
-
-sub fetch_all_values {
- my ( $class, $args ) = @_;
- die "BAD CALL: Don't use fetch_all_values as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
-
- my $record_id = $args->{record_id};
- my $tablename = $args->{tablename};
- return unless $tablename;
-
- my $dbh = C4::Context->dbh;
- my $values = $dbh->selectall_arrayref(
- q|
- SELECT afv.record_id, af.name, afv.value
- FROM additional_fields af, additional_field_values afv
- WHERE af.id = afv.field_id
- AND af.tablename = ?
- | . ( $record_id ? q| AND afv.record_id = ?| : q|| ),
- {Slice => {}}, ( $tablename, ($record_id ? $record_id : ()) )
- );
-
- my $r;
- for my $v ( @$values ) {
- $r->{$v->{record_id}}{$v->{name}} = $v->{value};
- }
- return $r;
-}
-
-sub get_matching_record_ids {
- my ( $class, $args ) = @_;
- die "BAD CALL: Don't use fetch_all_values as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
-
- my $fields = $args->{fields} // [];
- my $tablename = $args->{tablename};
- my $exact_match = $args->{exact_match} // 1;
- return [] unless @$fields;
-
- my $dbh = C4::Context->dbh;
- my $query = q|SELECT * FROM |;
- my ( @subqueries, @args );
- my $i = 0;
- for my $field ( @$fields ) {
- $i++;
- my $subquery = qq|(
- SELECT record_id, field$i.name AS field${i}_name
- FROM additional_field_values afv
- LEFT JOIN
- (
- SELECT afv.id, af.name, afv.value
- FROM additional_field_values afv, additional_fields af
- WHERE afv.field_id = af.id
- AND af.name = ?
- AND af.tablename = ?
- AND value LIKE ?
- ) AS field$i USING (id)
- WHERE field$i.id IS NOT NULL
- ) AS values$i |;
- $subquery .= ' USING (record_id)' if $i > 1;
- push @subqueries, $subquery;
- push @args, $field->{name}, $tablename, ( ( $exact_match or $field->{authorised_value_category} ) ? $field->{value} : "%$field->{value}%" );
- }
- $query .= join( ' LEFT JOIN ', @subqueries ) . ' WHERE 1';
- for my $j ( 1 .. $i ) {
- $query .= qq| AND field${j}_name IS NOT NULL|;
- }
- my $values = $dbh->selectall_arrayref( $query, {Slice => {}}, @args );
- return [
- map { $_->{record_id} } @$values
- ]
-}
-
-sub update_fields_from_query {
- my ( $class, $args ) = @_;
- die "BAD CALL: Don't use update_fields_from_query as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
-
- my $query = $args->{query};
- my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename} } );
- for my $field ( @$additional_fields ) {
- my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch;
- if ( $af->{marcfield} ) {
- my ( $field, $subfield ) = split /\$/, $af->{marcfield};
- $af->{values} = undef;
- if ( $args->{marc_record} and $field and $subfield ) {
- my $value = $args->{marc_record}->subfield( $field, $subfield );
- $af->{values} = {
- $args->{record_id} => $value
- };
- }
- } else {
- $af->{values} = {
- $args->{record_id} => $query->param( 'additional_field_' . $field->{id} )
- } if defined $query->param( 'additional_field_' . $field->{id} );
- }
- $af->insert_values;
- }
-}
-
-sub get_filters_from_query {
- my ( $class, $args ) = @_;
- die "BAD CALL: Don't use get_filters_from_query as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
-
- my $query = $args->{query};
- my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename}, searchable => 1 } );
- my @additional_field_filters;
- for my $field ( @$additional_fields ) {
- my $filter_value = $query->param( 'additional_field_' . $field->{id} );
- if ( defined $filter_value and $filter_value ne q|| ) {
- push @additional_field_filters, {
- name => $field->{name},
- value => $filter_value,
- authorised_value_category => $field->{authorised_value_category},
- };
- }
- }
-
- return \@additional_field_filters;
-}
-
-sub get_filters_as_values {
- my ( $class, $filters ) = @_;
- die "BAD CALL: Don't use get_filters_as_values as an instance method"
- if ref $class and UNIVERSAL::can($class,'can');
-
- return { map { $_->{name} => $_->{value} } @$filters };
-}
-
-1;
-
-__END__
-