Bug 26133: Remove GetMarcHosts
[koha.git] / C4 / UsageStats.pm
1 package C4::UsageStats;
2
3 # This file is part of Koha.
4 #
5 # Copyright 2014 BibLibre
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use Modern::Perl;
21 use C4::Context;
22 use POSIX qw(strftime);
23 use LWP::UserAgent;
24 use JSON;
25
26 use Koha::Libraries;
27
28 =head1 NAME
29
30 C4::UsageStats
31
32 =head1 DESCRIPTION
33
34 This package contains what is needed to report Koha statistics to hea
35 hea.koha-community.org is the server that centralize Koha setups informations
36 Koha libraries are encouraged to provide informations about their collections,
37 their structure,...
38
39 =head2 NeedUpdate
40
41   $needUpdateYN = C4::UsageStats::NeedUpdate;
42
43 Returns Y (1) if the last update is more than 1 month old
44 This way, even if the cronjob is run every minute, the webservice will be called
45 only once a month !
46
47 =cut
48
49 sub NeedUpdate {
50     my $lastupdated = C4::Context->preference('UsageStatsLastUpdateTime') || 0;
51     my $now = strftime( "%s", localtime );
52
53     # Need to launch cron.
54     return 1 if $now - $lastupdated >= 2592000;
55
56     # Data don't need to be updated
57     return 0;
58 }
59
60 sub BuildReport {
61     my $report;
62     my @libraries;
63     if( C4::Context->preference('UsageStatsLibrariesInfo') ) {
64         my $libraries = Koha::Libraries->search;
65         while ( my $library = $libraries->next ) {
66             push @libraries, { name => $library->branchname, url => $library->branchurl, country => $library->branchcountry, geolocation => $library->geolocation, };
67         }
68     }
69     $report = {
70         installation => {
71             koha_id => C4::Context->preference('UsageStatsID')          || 0,
72             name    => C4::Context->preference('UsageStatsLibraryName') || q||,
73             url     => C4::Context->preference('UsageStatsLibraryUrl')  || q||,
74             type    => C4::Context->preference('UsageStatsLibraryType') || q||,
75             country => C4::Context->preference('UsageStatsCountry')     || q||,
76             geolocation => C4::Context->preference('UsageStatsGeolocation') || q||,
77         },
78         libraries => \@libraries,
79     };
80
81     # Get database volumetry.
82     foreach (
83         qw/biblio items auth_header old_issues old_reserves borrowers aqorders subscription/
84       )
85     {
86         $report->{volumetry}{$_} = _count($_);
87     }
88
89     # Get systempreferences.
90     foreach (
91         qw/
92         AcqCreateItem
93         AcqWarnOnDuplicateInvoice
94         AcqViewBaskets
95         BasketConfirmations
96         OrderPdfFormat
97         casAuthentication
98         casLogout
99         AllowPKIAuth
100         DebugLevel
101         delimiter
102         noItemTypeImages
103         OpacNoItemTypeImages
104         virtualshelves
105         AutoLocation
106         IndependentBranches
107         SessionStorage
108         Persona
109         AuthDisplayHierarchy
110         AutoCreateAuthorities
111         BiblioAddsAuthorities
112         AuthorityMergeLimit
113         AuthorityMergeMode
114         UseAuthoritiesForTracings
115         CatalogModuleRelink
116         hide_marc
117         IntranetBiblioDefaultView
118         LabelMARCView
119         OpacSuppression
120         SeparateHoldings
121         UseControlNumber
122         advancedMARCeditor
123         DefaultClassificationSource
124         EasyAnalyticalRecords
125         autoBarcode
126         item-level_itypes
127         marcflavour
128         PrefillItem
129         z3950NormalizeAuthor
130         SpineLabelAutoPrint
131         SpineLabelShowPrintOnBibDetails
132         BlockReturnOfLostItems
133         BlockReturnOfWithdrawnItems
134         CalculateFinesOnReturn
135         AgeRestrictionOverride
136         AllFinesNeedOverride
137         AllowFineOverride
138         AllowItemsOnHoldCheckoutSIP
139         AllowItemsOnHoldCheckoutSCO
140         AllowNotForLoanOverride
141         AllowRenewalLimitOverride
142         AllowReturnToBranch
143         AllowTooManyOverride
144         AutomaticItemReturn
145         AutoRemoveOverduesRestrictions
146         CircControl
147         HomeOrHoldingBranch
148         IssueLostItem
149         IssuingInProcess
150         ManInvInNoissuesCharge
151         OverduesBlockCirc
152         RenewalPeriodBase
153         RenewalSendNotice
154         RentalsInNoissuesCharge
155         ReturnBeforeExpiry
156         TransfersMaxDaysWarning
157         UseBranchTransferLimits
158         UseTransportCostMatrix
159         UseCourseReserves
160         finesCalendar
161         FinesIncludeGracePeriod
162         finesMode
163         RefundLostOnReturnControl
164         WhenLostChargeReplacementFee
165         WhenLostForgiveFine
166         AllowHoldDateInFuture
167         AllowHoldPolicyOverride
168         AllowHoldsOnDamagedItems
169         AllowHoldsOnPatronsPossessions
170         AutoResumeSuspendedHolds
171         canreservefromotherbranches
172         decreaseLoanHighHolds
173         DisplayMultiPlaceHold
174         emailLibrarianWhenHoldIsPlaced
175         ExpireReservesMaxPickUpDelay
176         OPACAllowHoldDateInFuture
177         OPACAllowUserToChooseBranch
178         ReservesControlBranch
179         ReservesNeedReturns
180         SuspendHoldsIntranet
181         SuspendHoldsOpac
182         TransferWhenCancelAllWaitingHolds
183         AllowAllMessageDeletion
184         AllowOfflineCirculation
185         PatronAutoComplete
186         CircAutoPrintQuickSlip
187         DisplayClearScreenButton
188         FilterBeforeOverdueReport
189         FineNotifyAtCheckin
190         itemBarcodeFallbackSearch
191         itemBarcodeInputFilter
192         previousIssuesDefaultSortOrder
193         RecordLocalUseOnReturn
194         AudioAlerts
195         SpecifyDueDate
196         todaysIssuesDefaultSortOrder
197         UpdateTotalIssuesOnCirc
198         UseTablesortForCirc
199         WaitingNotifyAtCheckin
200         SCOAllowCheckin
201         AutoSelfCheckAllowed
202         FRBRizeEditions
203         OPACFRBRizeEditions
204         AmazonCoverImages
205         OPACAmazonCoverImages
206         Babeltheque
207         BakerTaylorEnabled
208         GoogleJackets
209         HTML5MediaEnabled
210         LibraryThingForLibrariesEnabled
211         LocalCoverImages
212         OPACLocalCoverImages
213         NovelistSelectEnabled
214         OpenLibraryCovers
215         OpenLibrarySearch
216         SyndeticsEnabled
217         TagsEnabled
218         CalendarFirstDayOfWeek
219         opaclanguagesdisplay
220         AuthoritiesLog
221         BorrowersLog
222         CataloguingLog
223         FinesLog
224         IssueLog
225         LetterLog
226         ReturnLog
227         SubscriptionLog
228         BiblioDefaultView
229         COinSinOPACResults
230         DisplayOPACiconsXSLT
231         hidelostitems
232         HighlightOwnItemsOnOPAC
233         OpacAddMastheadLibraryPulldown
234         OPACDisplay856uAsImage
235         OpacHighlightedWords
236         OpacKohaUrl
237         OpacMaintenance
238         OpacPublic
239         OpacSeparateHoldings
240         OPACShowCheckoutName
241         OpacShowFiltersPulldownMobile
242         OPACShowHoldQueueDetails
243         OpacShowRecentComments
244         OPACShowUnusedAuthorities
245         OpacStarRatings
246         opacthemes
247         OPACURLOpenInNewWindow
248         OpacAuthorities
249         opacbookbag
250         OpacBrowser
251         OpacBrowseResults
252         OpacCloud
253         OPACFinesTab
254         OpacHoldNotes
255         OpacItemLocation
256         OpacPasswordChange
257         OPACPatronDetails
258         OPACpatronimages
259         OPACPopupAuthorsSearch
260         OpacTopissue
261         opacuserlogin
262         QuoteOfTheDay
263         RequestOnOpac
264         reviewson
265         ShowReviewer
266         ShowReviewerPhoto
267         SocialNetworks
268         suggestion
269         AllowPurchaseSuggestionBranchChoice
270         OpacAllowPublicListCreation
271         OpacAllowSharingPrivateLists
272         OpacRenewalAllowed
273         OpacRenewalBranch
274         OPACViewOthersSuggestions
275         SearchMyLibraryFirst
276         AnonSuggestions
277         EnableOpacSearchHistory
278         OPACPrivacy
279         opacreadinghistory
280         TrackClicks
281         PatronSelfRegistration
282         OPACShelfBrowser
283         AutoEmailOpacUser
284         AutoEmailPrimaryAddress
285         autoMemberNum
286         BorrowerRenewalPeriodBase
287         EnableBorrowerFiles
288         EnhancedMessagingPreferences
289         ExtendedPatronAttributes
290         intranetreadinghistory
291         patronimages
292         TalkingTechItivaPhoneNotification
293         uppercasesurnames
294         IncludeSeeFromInSearches
295         OpacGroupResults
296         QueryAutoTruncate
297         QueryFuzzy
298         QueryStemming
299         QueryWeightFields
300         TraceCompleteSubfields
301         TraceSubjectSubdivisions
302         UseICU
303         defaultSortField
304         displayFacetCount
305         OPACdefaultSortField
306         OPACItemsResultsDisplay
307         expandedSearchOption
308         IntranetNumbersPreferPhrase
309         OPACNumbersPreferPhrase
310         opacSerialDefaultTab
311         RenewSerialAddsSuggestion
312         RoutingListAddReserves
313         RoutingSerials
314         SubscriptionHistory
315         Display856uAsImage
316         DisplayIconsXSLT
317         template
318         yuipath
319         HidePatronName
320         intranetbookbag
321         StaffDetailItemSelection
322         viewISBD
323         viewLabeledMARC
324         viewMARC
325         ILS-DI
326         OAI-PMH
327         version
328         /
329       )
330     {
331         $report->{systempreferences}{$_} = C4::Context->preference($_);
332     }
333     return $report;
334 }
335
336 =head2 ReportToCommunity
337
338   ReportToCommunity;
339
340 Send to hea.koha-community.org database informations
341
342 =cut
343
344 sub ReportToCommunity {
345     my $data = shift;
346     my $json = encode_json($data);
347
348     my $url = "https://hea.koha-community.org/upload.pl";
349     my $ua = LWP::UserAgent->new;
350     my $res = $ua->post(
351         $url,
352         'Content-type' => 'application/json;charset=utf-8',
353         Content => $json,
354     );
355     my $content = decode_json( $res->decoded_content );
356     if ( $content->{koha_id} ) {
357         C4::Context->set_preference( 'UsageStatsID', $content->{koha_id} );
358     }
359     if ( $content->{id} ) {
360         C4::Context->set_preference( 'UsageStatsPublicID', $content->{id} );
361     }
362 }
363
364 =head2 _count
365
366   $data = _count($table);
367
368 Count the number of records in $table tables
369
370 =cut
371
372 sub _count {
373     my $table = shift;
374
375     my $dbh = C4::Context->dbh;
376     my $sth = $dbh->prepare("SELECT count(*) from $table");
377     $sth->execute;
378     return $sth->fetchrow_array;
379 }
380
381 1;