Koha-Contrib-Mirabel

 view release on metacpan or  search on metacpan

lib/Koha/Contrib/Mirabel.pm  view on Meta::CPAN


use Modern::Perl;
use utf8;
use FindBin qw($Bin);
use List::Util qw/first/;
use YAML qw/LoadFile Dump/;
use XML::Simple;
use LWP::Simple;
use DateTime;
use C4::Biblio;
use MARC::Moose::Record;
use MARC::Moose::Field::Std;



has url => (
    is => 'rw',
    isa => 'Str',
    default => 'https://reseau-mirabel.info/site/service?',
);



has partenaire => ( is => 'rw', isa => 'Int' );



has tag => ( is => 'rw', isa => 'Str' );



has verbose => ( is => 'rw', isa => 'Bool', default => 1 );



has doit => ( is => 'rw', isa => 'Bool', default => 0 );


sub BUILD {
    my $self = shift;

    my $partenaire = C4::Context->preference('MirabelPartenaire');
    die "Il manque la préférence MirabelPartenaire" unless $partenaire;
    $self->partenaire($partenaire);

    my $tag = C4::Context->preference('MirabelTag');
    die "Il manque la préférence MirabelTag" unless $tag;
    $self->tag($tag);
}


sub get_biblio {
    my ($self, $biblionumber) = @_;

    my $record = GetMarcBiblio( { biblionumber => $biblionumber } );
    return unless $record;
    return MARC::Moose::Record::new_from($record, 'Legacy');
}


sub update {
    my ($self, $biblionumber, $services) = @_;

    say '_' x 40, " #$biblionumber" if $self->verbose;

    my $record = $self->get_biblio($biblionumber);
    unless ($record) {
        say 'ERREUR: Notice présente dans Mir@bel mais supprimée du Catalogue Koha'
            if $self->verbose;
        return;
    }
    print $record->as('Text') if $self->verbose;

    # On supprime de la notice biblio les champs cibles existants
    $record->delete( $self->tag );

    for my $service (@$services) {
        say "Mir\@bel #", $service->{id}, "\n",
            join("\n",
                 map { "  $_: " . $service->{$_} } grep { $_ ne 'id' }
                    keys %$service )
          if $self->verbose;
        my @sf = (
            [ 3 => $service->{id} ],
            [ 4 => $service->{type} ],
            [ a => $service->{urldirecte} || $service->{urlservice} ],
            [ b => $service->{nom} ],
        );
        if (my $value = $service->{acces}) { push @sf, [ c => $value ]; }

        my @coll;
        push @coll, $service->{debut} if $service->{debut};
        push @coll, '-';
        push @coll, $service->{fin} if $service->{fin};
        push @sf, [ d => join('', @coll) ] if @coll > 1;

        if (my $value = $service->{couverture}) { push @sf, [ e => $value ]; }
        if (my $value = $service->{lacunaire}) { push @sf, [ f => $value ]; }
        $record->append( MARC::Moose::Field::Std->new(
            tag => $self->tag, subf => \@sf ) );
    }
    print "\nAPRÈS:\n", $record->as('Text') if $self->verbose;

    # On réécrit la notice
    if ( $self->doit ) {
        $record = $record->as('Legacy');
        ModBiblioMarc( $record, $biblionumber, GetFrameworkCode($biblionumber) );
    }
}



sub sync {
    my $self = shift;

    if ($self->verbose) {
        say "Synchro";
        say "** TEST **" unless $self->doit;
    }

    my $url = $self->url . 'partenaire=' . $self->partenaire;



( run in 0.830 second using v1.01-cache-2.11-cpan-bbe5e583499 )