Bug 24759: Rename renewalbranch to renewal_branchcode
[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         virtualshelves
104         AutoLocation
105         IndependentBranches
106         SessionStorage
107         Persona
108         AuthDisplayHierarchy
109         AutoCreateAuthorities
110         BiblioAddsAuthorities
111         AuthorityMergeLimit
112         AuthorityMergeMode
113         UseAuthoritiesForTracings
114         CatalogModuleRelink
115         hide_marc
116         IntranetBiblioDefaultView
117         LabelMARCView
118         OpacSuppression
119         SeparateHoldings
120         UseControlNumber
121         advancedMARCeditor
122         DefaultClassificationSource
123         EasyAnalyticalRecords
124         autoBarcode
125         item-level_itypes
126         marcflavour
127         PrefillItem
128         z3950NormalizeAuthor
129         SpineLabelAutoPrint
130         SpineLabelShowPrintOnBibDetails
131         BlockReturnOfLostItems
132         BlockReturnOfWithdrawnItems
133         CalculateFinesOnReturn
134         AgeRestrictionOverride
135         AllFinesNeedOverride
136         AllowFineOverride
137         AllowItemsOnHoldCheckoutSIP
138         AllowItemsOnHoldCheckoutSCO
139         AllowNotForLoanOverride
140         AllowRenewalLimitOverride
141         AllowReturnToBranch
142         AllowTooManyOverride
143         AutomaticItemReturn
144         AutoRemoveOverduesRestrictions
145         CircControl
146         HomeOrHoldingBranch
147         IssueLostItem
148         IssuingInProcess
149         ManInvInNoissuesCharge
150         OverduesBlockCirc
151         RenewalPeriodBase
152         RenewalSendNotice
153         RentalsInNoissuesCharge
154         ReturnBeforeExpiry
155         TransfersMaxDaysWarning
156         UseBranchTransferLimits
157         useDaysMode
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         AllowSelfCheckReturns
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         UseKohaPlugins
217         SyndeticsEnabled
218         TagsEnabled
219         CalendarFirstDayOfWeek
220         opaclanguagesdisplay
221         AuthoritiesLog
222         BorrowersLog
223         CataloguingLog
224         FinesLog
225         IssueLog
226         LetterLog
227         ReturnLog
228         SubscriptionLog
229         BiblioDefaultView
230         COinSinOPACResults
231         DisplayOPACiconsXSLT
232         hidelostitems
233         HighlightOwnItemsOnOPAC
234         OpacAddMastheadLibraryPulldown
235         OPACDisplay856uAsImage
236         OpacHighlightedWords
237         OpacKohaUrl
238         OpacMaintenance
239         OpacPublic
240         OpacSeparateHoldings
241         OPACShowCheckoutName
242         OpacShowFiltersPulldownMobile
243         OPACShowHoldQueueDetails
244         OpacShowRecentComments
245         OPACShowUnusedAuthorities
246         OpacStarRatings
247         opacthemes
248         OPACURLOpenInNewWindow
249         OpacAuthorities
250         opacbookbag
251         OpacBrowser
252         OpacBrowseResults
253         OpacCloud
254         OPACFinesTab
255         OpacHoldNotes
256         OpacItemLocation
257         OpacPasswordChange
258         OPACPatronDetails
259         OPACpatronimages
260         OPACPopupAuthorsSearch
261         OpacTopissue
262         opacuserlogin
263         QuoteOfTheDay
264         RequestOnOpac
265         reviewson
266         ShowReviewer
267         ShowReviewerPhoto
268         SocialNetworks
269         suggestion
270         AllowPurchaseSuggestionBranchChoice
271         OpacAllowPublicListCreation
272         OpacAllowSharingPrivateLists
273         OpacRenewalAllowed
274         OpacRenewalBranch
275         OPACViewOthersSuggestions
276         SearchMyLibraryFirst
277         AnonSuggestions
278         EnableOpacSearchHistory
279         OPACPrivacy
280         opacreadinghistory
281         TrackClicks
282         PatronSelfRegistration
283         OPACShelfBrowser
284         AutoEmailOpacUser
285         AutoEmailPrimaryAddress
286         autoMemberNum
287         BorrowerRenewalPeriodBase
288         EnableBorrowerFiles
289         EnhancedMessagingPreferences
290         ExtendedPatronAttributes
291         intranetreadinghistory
292         patronimages
293         TalkingTechItivaPhoneNotification
294         uppercasesurnames
295         IncludeSeeFromInSearches
296         OpacGroupResults
297         QueryAutoTruncate
298         QueryFuzzy
299         QueryStemming
300         QueryWeightFields
301         TraceCompleteSubfields
302         TraceSubjectSubdivisions
303         UseICU
304         defaultSortField
305         displayFacetCount
306         OPACdefaultSortField
307         OPACItemsResultsDisplay
308         expandedSearchOption
309         IntranetNumbersPreferPhrase
310         OPACNumbersPreferPhrase
311         opacSerialDefaultTab
312         RenewSerialAddsSuggestion
313         RoutingListAddReserves
314         RoutingSerials
315         SubscriptionHistory
316         Display856uAsImage
317         DisplayIconsXSLT
318         template
319         yuipath
320         HidePatronName
321         intranetbookbag
322         StaffDetailItemSelection
323         viewISBD
324         viewLabeledMARC
325         viewMARC
326         ILS-DI
327         OAI-PMH
328         version
329         /
330       )
331     {
332         $report->{systempreferences}{$_} = C4::Context->preference($_);
333     }
334     return $report;
335 }
336
337 =head2 ReportToCommunity
338
339   ReportToCommunity;
340
341 Send to hea.koha-community.org database informations
342
343 =cut
344
345 sub ReportToCommunity {
346     my $data = shift;
347     my $json = encode_json($data);
348
349     my $url = "https://hea.koha-community.org/upload.pl";
350     my $ua = LWP::UserAgent->new;
351     my $res = $ua->post(
352         $url,
353         'Content-type' => 'application/json;charset=utf-8',
354         Content => $json,
355     );
356     my $content = decode_json( $res->decoded_content );
357     if ( $content->{koha_id} ) {
358         C4::Context->set_preference( 'UsageStatsID', $content->{koha_id} );
359     }
360     if ( $content->{id} ) {
361         C4::Context->set_preference( 'UsageStatsPublicID', $content->{id} );
362     }
363 }
364
365 =head2 _count
366
367   $data = _count($table);
368
369 Count the number of records in $table tables
370
371 =cut
372
373 sub _count {
374     my $table = shift;
375
376     my $dbh = C4::Context->dbh;
377     my $sth = $dbh->prepare("SELECT count(*) from $table");
378     $sth->execute;
379     return $sth->fetchrow_array;
380 }
381
382 1;