Bug 24031: Add safety checks in Koha::Plugins::call
[koha.git] / C4 / UsageStats.pm
blob7aecc006dafeca9090e7605d62db76c733f7d0ed
1 package C4::UsageStats;
3 # This file is part of Koha.
5 # Copyright 2014 BibLibre
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.
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.
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>.
20 use Modern::Perl;
21 use C4::Context;
22 use POSIX qw(strftime);
23 use LWP::UserAgent;
24 use JSON;
26 use Koha::Libraries;
28 =head1 NAME
30 C4::UsageStats
32 =head1 DESCRIPTION
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,...
39 =head2 NeedUpdate
41 $needUpdateYN = C4::UsageStats::NeedUpdate;
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 !
47 =cut
49 sub NeedUpdate {
50 my $lastupdated = C4::Context->preference('UsageStatsLastUpdateTime') || 0;
51 my $now = strftime( "%s", localtime );
53 # Need to launch cron.
54 return 1 if $now - $lastupdated >= 2592000;
56 # Data don't need to be updated
57 return 0;
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, };
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||,
78 libraries => \@libraries,
81 # Get database volumetry.
82 foreach (
83 qw/biblio items auth_header old_issues old_reserves borrowers aqorders subscription/
86 $report->{volumetry}{$_} = _count($_);
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
331 $report->{systempreferences}{$_} = C4::Context->preference($_);
333 return $report;
336 =head2 ReportToCommunity
338 ReportToCommunity;
340 Send to hea.koha-community.org database informations
342 =cut
344 sub ReportToCommunity {
345 my $data = shift;
346 my $json = encode_json($data);
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,
355 my $content = decode_json( $res->decoded_content );
356 if ( $content->{koha_id} ) {
357 C4::Context->set_preference( 'UsageStatsID', $content->{koha_id} );
359 if ( $content->{id} ) {
360 C4::Context->set_preference( 'UsageStatsPublicID', $content->{id} );
364 =head2 _count
366 $data = _count($table);
368 Count the number of records in $table tables
370 =cut
372 sub _count {
373 my $table = shift;
375 my $dbh = C4::Context->dbh;
376 my $sth = $dbh->prepare("SELECT count(*) from $table");
377 $sth->execute;
378 return $sth->fetchrow_array;