Bugzilla – Attachment 180315 Details for
Bug 17015
New Koha Calendar
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 17015: Install scripts for DiscreteCalendar
Bug-17015-Install-scripts-for-DiscreteCalendar.patch (text/plain), 60.05 KB, created by
Maryse Simard
on 2025-04-02 12:35:07 UTC
(
hide
)
Description:
Bug 17015: Install scripts for DiscreteCalendar
Filename:
MIME Type:
Creator:
Maryse Simard
Created:
2025-04-02 12:35:07 UTC
Size:
60.05 KB
patch
obsolete
>From 365ecbe878db5e0780632b87ff57b731b1fa313b Mon Sep 17 00:00:00 2001 >From: Charles Farmer <charles.farmer@inLibro.com> >Date: Wed, 4 Sep 2019 14:57:19 -0400 >Subject: [PATCH] Bug 17015: Install scripts for DiscreteCalendar > >Signed-off-by: Michal Denar <black23@gmail.com> >--- > ..._17015_part1_create_discrete_calendar.perl | 20 + > ...ug_17015_part2_fill_discrete_calendar.perl | 150 ++++ > .../bug_17015_part3_drop_calendar.perl | 11 + > installer/data/mysql/updatedatabase.pl | 6 +- > .../en/modules/tools/discrete_calendar.tt | 705 +++++++++--------- > misc/cronjobs/staticfines.pl | 2 +- > tools/discrete_calendar.pl | 14 +- > 7 files changed, 546 insertions(+), 362 deletions(-) > create mode 100644 installer/data/mysql/atomicupdate/bug_17015_part1_create_discrete_calendar.perl > create mode 100755 installer/data/mysql/atomicupdate/bug_17015_part2_fill_discrete_calendar.perl > create mode 100644 installer/data/mysql/atomicupdate/bug_17015_part3_drop_calendar.perl > >diff --git a/installer/data/mysql/atomicupdate/bug_17015_part1_create_discrete_calendar.perl b/installer/data/mysql/atomicupdate/bug_17015_part1_create_discrete_calendar.perl >new file mode 100644 >index 0000000000..f276da11a3 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_17015_part1_create_discrete_calendar.perl >@@ -0,0 +1,20 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ if ( !TableExists( 'discrete_calendar' ) ) { >+ $dbh->do( qq{ >+ CREATE TABLE `discrete_calendar` ( >+ `date` datetime NOT NULL, >+ `branchcode` varchar(10) NOT NULL, >+ `is_opened` tinyint(1) DEFAULT 1, >+ `holiday_type` varchar(1) DEFAULT '', >+ `note` varchar(30) DEFAULT '', >+ `description` mediumtext DEFAULT '', >+ `open_hour` time NOT NULL, >+ `close_hour` time NOT NULL, >+ PRIMARY KEY (`branchcode`,`date`) >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; >+ } ); >+ } >+ >+ NewVersion( $DBversion, 17015, "New koha calendar Part 1 - Create discrete_calendar table to keep track of library day's information"); >+} >diff --git a/installer/data/mysql/atomicupdate/bug_17015_part2_fill_discrete_calendar.perl b/installer/data/mysql/atomicupdate/bug_17015_part2_fill_discrete_calendar.perl >new file mode 100755 >index 0000000000..1b4282af63 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_17015_part2_fill_discrete_calendar.perl >@@ -0,0 +1,150 @@ >+#!/usr/bin/perl >+ >+# >+# Script that fills the discrete_calendar table with dates, using the other date-related tables >+# >+use Modern::Perl; >+use DateTime; >+use DateTime::Format::Strptime; >+use Data::Dumper; >+use Getopt::Long; >+use C4::Context; >+ >+# Options >+my $daysInFuture = 365; >+ >+my $dbh = C4::Context->dbh; >+$dbh->{AutoCommit} = 0; >+$dbh->{RaiseError} = 1; >+ >+my $currentDate = DateTime->today; >+ >+# two years ago >+my $startDate = DateTime->new( >+day => $currentDate->day(), >+month => $currentDate->month(), >+year => $currentDate->year()-2, >+time_zone => C4::Context->tz() >+)->truncate( to => 'day' ); >+ >+# a year into the future >+my $endDate = DateTime->new( >+day => $currentDate->day(), >+month => $currentDate->month(), >+year => $currentDate->year(), >+time_zone => C4::Context->tz() >+)->truncate( to => 'day' ); >+$endDate->add(days => $daysInFuture); >+ >+# finds branches; >+my $selectBranchesSt = 'SELECT branchname, branchcode FROM branches'; >+my $selectBranchesSth = $dbh->prepare($selectBranchesSt); >+$selectBranchesSth->execute(); >+my @branches = (); >+while (my @row = $selectBranchesSth->fetchrow_array ) { >+ print "[$row[1]] $row[0]\n"; >+ push @branches, $row[1]; >+} >+ >+# finds what days are closed for each branch >+my %repeatableHolidaysPerBranch = (); >+my %specialHolidaysPerBranch = (); >+my $selectWeeklySt; >+my $selectWeeklySth; >+ >+foreach my $branch (@branches){ >+ if ( TableExists( 'repeatable_holidays' ) ) { >+ $selectWeeklySt = 'SELECT weekday, title, day, month FROM repeatable_holidays WHERE branchcode = ?'; >+ $selectWeeklySth = $dbh->prepare($selectWeeklySt); >+ $selectWeeklySth->execute($branch); >+ >+ my @weeklyHolidays = (); >+ >+ while ( my ($weekDay, $title, $day, $month) = $selectWeeklySth->fetchrow_array ) { >+ push @weeklyHolidays,{weekday => $weekDay, title => $title, day => $day, month => $month}; >+ >+ } >+ >+ $repeatableHolidaysPerBranch{$branch} = \@weeklyHolidays; >+ } >+ >+ if ( TableExists( 'repeatable_holidays' ) ) { >+ my $selectSpecialHolidayDateSt = 'SELECT day,month,year,title FROM special_holidays WHERE branchcode = ? AND isexception = 0'; >+ my $specialHolidayDatesSth = $dbh->prepare($selectSpecialHolidayDateSt); >+ $specialHolidayDatesSth -> execute($branch); >+ # Tranforms dates from specialHolidays table in DateTime for our new table >+ my @specialHolidayDates = (); >+ while ( my ($day, $month, $year, $title) = $specialHolidayDatesSth->fetchrow_array ) { >+ >+ my $specialHolidayDate = DateTime->new( >+ day => $day, >+ month => $month, >+ year => $year, >+ time_zone => C4::Context->tz() >+ )->truncate( to => 'day' ); >+ push @specialHolidayDates,{date=>$specialHolidayDate, title=> $title}; >+ } >+ >+ $specialHolidaysPerBranch{$branch} = \@specialHolidayDates; >+ } >+} >+ >+# Fills table with dates and sets 'is_opened' according to the branch's weekly restrictions (repeatable_holidays) >+my $insertDateSt; >+my $insertDateSth; >+ >+# Loop that does everything in the world >+for (my $tempDate = $startDate->clone(); $tempDate <= $endDate;$tempDate->add(days => 1)){ >+ foreach my $branch (@branches){ >+ my $dayOfWeek = $tempDate->day_of_week; >+ # Representation fix >+ # DateTime object dow (1-7) where Monday is 1 >+ # Arrays are 0-based where 0 = Sunday, not 7. >+ my $open_hour = "09:00:00"; >+ my $close_hour = "17:00:00"; >+ >+ # Finds closed days >+ my $is_opened =1; >+ my $specialDescription = ""; >+ my $holiday_type =''; >+ $dayOfWeek = $tempDate->day_of_week % 7; >+ foreach my $holidayWeekDay ( @{$repeatableHolidaysPerBranch{$branch}} ) { >+ if (defined($holidayWeekDay) && defined($holidayWeekDay->{weekday}) && $dayOfWeek == $holidayWeekDay->{weekday}) { >+ $is_opened = 0; >+ $specialDescription = $holidayWeekDay->{title}; >+ $holiday_type = 'W'; >+ } elsif ($holidayWeekDay->{day} && $holidayWeekDay->{month}) { >+ my $date = DateTime->new( >+ day => $holidayWeekDay->{day}, >+ month => $holidayWeekDay->{month}, >+ year => $tempDate->year(), >+ time_zone => C4::Context->tz() >+ )->truncate( to => 'day' ); >+ >+ if ($tempDate == $date) { >+ $is_opened = 0; >+ $specialDescription = $holidayWeekDay->{title}; >+ $holiday_type = 'R'; >+ } >+ } >+ } >+ >+ foreach my $specialDate (@{$specialHolidaysPerBranch{$branch}}){ >+ if ($tempDate->datetime() eq $specialDate->{date}->datetime()) { >+ $is_opened = 0; >+ $specialDescription = $specialDate->{title}; >+ $holiday_type = 'E'; >+ } >+ } >+ #final insert statement >+ >+ $insertDateSt = 'INSERT IGNORE INTO discrete_calendar (date,branchcode,is_opened,holiday_type,note,open_hour,close_hour) VALUES (?,?,?,?,?,?,?)'; >+ $insertDateSth = $dbh->prepare($insertDateSt); >+ $insertDateSth->execute($tempDate,$branch,$is_opened,$holiday_type,$specialDescription,$open_hour,$close_hour); >+ } >+} >+ >+# If everything went well we commit to the database >+$dbh->commit(); >+$dbh->{AutoCommit} = 1; >+$dbh->{RaiseError} = 0; >diff --git a/installer/data/mysql/atomicupdate/bug_17015_part3_drop_calendar.perl b/installer/data/mysql/atomicupdate/bug_17015_part3_drop_calendar.perl >new file mode 100644 >index 0000000000..a7e96b0ae5 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_17015_part3_drop_calendar.perl >@@ -0,0 +1,11 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ if ( TableExists( 'repeatable_holidays' ) ) { >+ $dbh->do( "DROP TABLE IF EXISTS `repeatable_holidays`;" ); >+ } >+ if ( TableExists( 'special_holidays' ) ) { >+ $dbh->do( "DROP TABLE IF EXISTS `special_holidays`;" ); >+ } >+ >+ NewVersion( $DBversion, 17015, "New koha calendar Part 3 - Drop deprecated calendar-related tables after creating and filling discrete_calendar"); >+} >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index adbd5e4c50..508d1dfaa2 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -17806,7 +17806,7 @@ if ( CheckVersion($DBversion) ) { > > $DBversion = '16.12.00.032'; > if ( CheckVersion($DBversion) ) { >- require Koha::Calendar; >+ require Koha::DiscreteCalendar; > > $dbh->do( > q{ >@@ -17839,10 +17839,10 @@ if ( CheckVersion($DBversion) ) { > > my $expirationdate = dt_from_string( $hold->{waitingdate} ); > if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) { >- my $calendar = Koha::Calendar->new( >+ my $calendar = Koha::DiscreteCalendar->new({ > branchcode => $hold->{branchcode}, > days_mode => C4::Context->preference('useDaysMode') >- ); >+ }); > $expirationdate = $calendar->days_forward( $expirationdate, $max_pickup_delay ); > } else { > $expirationdate->add( days => $max_pickup_delay ); >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/discrete_calendar.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/discrete_calendar.tt >index 78f0a5e44a..0c814426ce 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/discrete_calendar.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/discrete_calendar.tt >@@ -1,9 +1,15 @@ > [% USE raw %] > [% USE Asset %] > [% USE Branches %] >+[% PROCESS 'i18n.inc' %] > [% SET footerjs = 1 %] > [% INCLUDE 'doc-head-open.inc' %] >-<title>[% Branches.GetName( branch ) | html %] calendar › Tools › Koha</title> >+<title >+ >[% FILTER collapse %] >+ [% tx("{library} calendar", { library = Branches.GetName( branch ) }) | html %] >+ › [% t("Tools") | html %] › [% t("Koha") | html %] >+ [% END %]</title >+> > [% INCLUDE 'doc-head-close.inc' %] > [% Asset.css("css/calendar.css") | $raw %] > </head> >@@ -19,365 +25,362 @@ > <a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a> > [% END %] > [% WRAPPER breadcrumb_item bc_active= 1 %] >- <span>[% Branches.GetName( branch ) | html %] calendar</span> >+ [% tx("{library} calendar", { library = Branches.GetName( branch ) }) | html %] > [% END %] > [% END #/ WRAPPER breadcrumbs %] > [% END #/ WRAPPER sub-header.inc %] > >-<div id="main" class="main container-fluid"> >- <div class="row"> >- <div class="col-sm-10 col-sm-push-2"> >- <main> >- [% IF no_branch_selected %] >- <div class="dialog alert"> >- <strong>No library set!</strong> >- </div> >- [% END %] >- >- [% UNLESS datesInfos %] >- <div class="dialog alert"> >- <strong>Error!</strong> You have to run add_days_discrete_calendar.pl in order to use Discrete Calendar. >- </div> >- [% END %] >+[% WRAPPER 'main-container.inc' aside='tools-menu' %] >+ [% IF no_branch_selected %] >+ <div class="dialog alert"> >+ <strong>No library set!</strong> >+ </div> >+ [% END %] >+ >+ [% UNLESS datesInfos %] >+ <div class="dialog alert"> >+ <strong>Error!</strong> You have to run add_days_discrete_calendar.pl in order to use Discrete Calendar. >+ </div> >+ [% END %] >+ >+ [% IF date_format_error %] >+ <div class="dialog alert"> >+ <strong>Error!</strong> Date format error. Please try again. >+ </div> >+ [% END %] >+ >+ [% IF cannot_edit_past_dates %] >+ <div class="alert alert-danger"> >+ <strong>Error!</strong> You cannot edit the past. The date '[% error_date | html %]' was out of range for the requested action. >+ </div> >+ [% END %] >+ >+ <h1>[% tx("{library} calendar", { library = Branches.GetName( branch ) }) | html %]</h1> > >- [% IF date_format_error %] >- <div class="dialog alert"> >- <strong>Error!</strong> Date format error. Please try again. >- </div> >- [% END %] >- >- [% IF cannot_edit_past_dates %] >- <div class="alert alert-danger"> >- <strong>Error!</strong> You cannot edit the past. The date '[% error_date | html %]' was out of range for the requested action. >- </div> >- [% END %] >- >- <h1>[% Branches.GetName( branch ) | html %] calendar</h1> >- >- <div class="row"> >- <div class="col-sm-6"> >- <div class="page-section"> >- <label for="branch">Define the holidays for:</label> >- <form id="copyCalendar-form" method="post"> >- <select id="branch" name="branch"> >- [% PROCESS options_for_libraries libraries => Branches.all( selected => branch ) %] >- </select> >- Copy calendar to >- <select id='newBranch' name ='newBranch'> >- <option value=""></option> >- [% FOREACH l IN Branches.all() %] >- [% UNLESS branch == l.branchcode %] >- <option value="[% l.branchcode | html %]">[% l.branchname | html %]</option> >+ <div class="row"> >+ <div class="col-sm-6"> >+ <div class="page-section"> >+ <label for="branch">Define the holidays for:</label> >+ <form id="copyCalendar-form" method="post"> >+ [% INCLUDE 'csrf-token.inc' %] >+ <select id="branch" name="branch"> >+ [% PROCESS options_for_libraries libraries => Branches.all( selected => branch ) %] >+ </select> >+ <label for="newBranch">Copy calendar to</label> >+ <select id='newBranch' name ='newBranch'> >+ <option value=""></option> >+ [% FOREACH l IN Branches.all() %] >+ [% UNLESS branch == l.branchcode %] >+ <option value="[% l.branchcode | html %]">[% l.branchname | html %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ <input type="hidden" name="action" value="copyBranch" /> >+ <input type="submit" class="btn btn-primary" value="Clone"> >+ </form> >+ >+ <h3>Calendar information</h3> >+ >+ <div class="calendar"> >+ <span id="calendar-anchor"></span> >+ >+ <!-- ***************************** Panel to deal with new holidays ********************** --> >+ <div class="panel newHoliday" id="newHoliday"> >+ <form id="newHoliday-form" method="post"> >+ [% INCLUDE 'csrf-token.inc' %] >+ <fieldset class="brief"> >+ <h3>Edit date details</h3> >+ <span id="holtype"></span> >+ <ol> >+ <li> >+ <strong>Library:</strong> >+ <span id="newBranchNameOutput"></span> >+ <input type="hidden" id="branch" name="branch" value="[% branch | html %]" /> >+ </li> >+ <li> >+ <strong>From date:</strong> >+ <span id="newDaynameOutput"></span>, >+ >+ [% IF ( dateformat == "us" ) %] >+ <span id="newMonthOutput"></span>/<span id="newDayOutput"></span>/<span id="newYearOutput"></span> >+ [% ELSIF ( dateformat == "metric" ) %] >+ <span id="newDayOutput"></span>/<span id="newMonthOutput"></span>/<span id="newYearOutput"></span> >+ [% ELSIF ( dateformat == "dmydot" ) %] >+ <span id="newDayOutput"></span>.<span id="newMonthOutput"></span>.<span id="newYearOutput"></span> >+ [% ELSE %] >+ <span id="newYearOutput"></span>/<span id="newMonthOutput"></span>/<span id="newDayOutput"></span> > [% END %] >- [% END %] >- </select> >- <input type="hidden" name="action" value="copyBranch" /> >- <input type="submit" value="Clone"> >- </form> >- >- <h3>Calendar information</h3> >- >- <div class="calendar"> >- <span id="calendar-anchor"></span> >- >- <!-- ***************************** Panel to deal with new holidays ********************** --> >- <div class="panel newHoliday" id="newHoliday"> >- <form id="newHoliday-form" method="post"> >- <fieldset class="brief"> >- <h3>Edit date details</h3> >- <span id="holtype"></span> >+ >+ <input type="hidden" id="newDayname" name="showDayname" /> >+ <input type="hidden" id="Day" name="Day" /> >+ <input type="hidden" id="Month" name="Month" /> >+ <input type="hidden" id="Year" name="Year" /> >+ </li> >+ <li class="dateinsert"> >+ <strong>To date:</strong> >+ <input type="text" id="to_date_flatpickr" size="20" /> >+ </li> >+ <li> >+ <label for="title">Title: </label> >+ <input type="text" name="Title" id="title" size="35" /> >+ </li> >+ <li> >+ <label for="description">Description: </label> >+ <textarea id="description" name="description" rows="2" cols="40"></textarea> >+ </li> >+ <li id="holidayType"> >+ <label for="holidayType">Date type</label> >+ <select name ='holidayType'> >+ <option value="empty"></option> >+ <option value="none">Working day</option> >+ <option value="E">Unique holiday</option> >+ <option value="W">Weekly holiday</option> >+ <option value="R">Repeatable holiday</option> >+ <option value="F">Floating holiday</option> >+ <option value="N" disabled>Need validation</option> >+ </select> >+ <a href="#" class="helptext">[?]</a> >+ <div class="hint"> > <ol> >- <li> >- <strong>Library:</strong> >- <span id="newBranchNameOutput"></span> >- <input type="hidden" id="branch" name="branch" value="[% branch | html %]" /> >- </li> >- <li> >- <strong>From date:</strong> >- <span id="newDaynameOutput"></span>, >- >- [% IF ( dateformat == "us" ) %] >- <span id="newMonthOutput"></span>/<span id="newDayOutput"></span>/<span id="newYearOutput"></span> >- [% ELSIF ( dateformat == "metric" ) %] >- <span id="newDayOutput"></span>/<span id="newMonthOutput"></span>/<span id="newYearOutput"></span> >- [% ELSIF ( dateformat == "dmydot" ) %] >- <span id="newDayOutput"></span>.<span id="newMonthOutput"></span>.<span id="newYearOutput"></span> >- [% ELSE %] >- <span id="newYearOutput"></span>/<span id="newMonthOutput"></span>/<span id="newDayOutput"></span> >- [% END %] >- >- <input type="hidden" id="newDayname" name="showDayname" /> >- <input type="hidden" id="Day" name="Day" /> >- <input type="hidden" id="Month" name="Month" /> >- <input type="hidden" id="Year" name="Year" /> >- </li> >- <li class="dateinsert"> >- <strong>To date:</strong> >- <input type="text" id="to_date_flatpickr" size="20" /> >- </li> >- <li> >- <label for="title">Title: </label> >- <input type="text" name="Title" id="title" size="35" /> >- </li> >- <li> >- <label for="description">Description: </label> >- <textarea id="description" name="description" rows="2" cols="40"></textarea> >- </li> >- <li id="holidayType"> >- <label for="holidayType">Date type</label> >- <select name ='holidayType'> >- <option value="empty"></option> >- <option value="none">Working day</option> >- <option value="E">Unique holiday</option> >- <option value="W">Weekly holiday</option> >- <option value="R">Repeatable holiday</option> >- <option value="F">Floating holiday</option> >- <option value="N" disabled>Need validation</option> >- </select> >- <a href="#" class="helptext">[?]</a> >- <div class="hint"> >- <ol> >- <li><strong>Working day:</strong> the library is open on that day.</li> >- <li><strong>Unique holiday:</strong> make a single holiday. For example, selecting August 1, 2012 will make it a holiday, but will not affect August 1 in other years.</li> >- <li><strong>Weekly holiday:</strong> make this weekday a holiday, every week. For example, if your library is closed on Saturdays, use this option to make every Saturday a holiday.</li> >- <li><strong>Repeatable holiday:</strong> this will take this day and month as a reference to make it a holiday. Through this option, you can repeat this rule for every year. For example, selecting August 1 will make August 1 a holiday every year.</li> >- <li><strong>Floating holiday:</strong> this will take this day and month as a reference to make it a floating holiday. Through this option, you can add a holiday that repeats every year but not necessarily on the exact same day. On subsequent years the date will need validation.</li> >- <li><strong>Need validation:</strong> this holiday has been added automatically, but needs to be validated.</li> >- </ol> >- </div> >- </li> >- <li id="days_of_week"> >- <label for="day_of_week">Week day</label> >- <select name ='day_of_week'> >- <option value="everyday">Everyday</option> >- <option value="1">Sundays</option> >- <option value="2">Mondays</option> >- <option value="3">Tuesdays</option> >- <option value="4">Wednesdays</option> >- <option value="5">Thursdays</option> >- <option value="6">Fridays</option> >- <option value="7">Saturdays</option> >- </select> >- </li> >- <li class="radio" id="deleteType"> >- <input type="checkbox" name="deleteType" id="deleteType_checkbox" value="1" ><label for="deleteType_checkbox"> Delete this type</label> >- <a href="#" class="helptext">[?]</a> >- <div class="hint">Remove all repeated or weekly holidays of the selected date or week day <br> if working day is selected.</div> >- </li> >- <li> >- <label for="openHour">Open hours: </label><input type="text" name="openHour" id='openHour' /> >- </li> >- <li> >- <label for="closeHour">Close hours: </label><input type="text" name="closeHour" id='closeHour' /> >- </li> >- <li class="radio"> >- <input type="radio" name="action" id="EditRadioButton" value="edit" checked/> >- <label for="EditRadioButton">Edit selected dates</label> >- </li> >- <li class="radio"> >- <input type="radio" name="action" id="CopyRadioButton" value="copyDates" /> >- <label for="CopyRadioButton">Copy to different dates</label> >- </li> >- <li class="CopyDatePanel"> >- <label>From:</label> >- <input type="text" id="copyto_from_flatpickr" size="20"/> >- <label>To:</label> >- <input type="text" id="copyto_to_flatpickr" size="20"/> >- </li> >- <li class="checkbox"> >- <input type="checkbox" name="all_branches" id="all_branches" /> >- <label for="all_branches">Copy to all libraries</label>. >- <a href="#" class="helptext">[?]</a> >- <div class="hint">If checked, this holiday will be copied to all libraries.</div> >- </li> >+ <li><strong>Working day:</strong> the library is open on that day.</li> >+ <li><strong>Unique holiday:</strong> make a single holiday. For example, selecting August 1, 2012 will make it a holiday, but will not affect August 1 in other years.</li> >+ <li><strong>Weekly holiday:</strong> make this weekday a holiday, every week. For example, if your library is closed on Saturdays, use this option to make every Saturday a holiday.</li> >+ <li><strong>Repeatable holiday:</strong> this will take this day and month as a reference to make it a holiday. Through this option, you can repeat this rule for every year. For example, selecting August 1 will make August 1 a holiday every year.</li> >+ <li><strong>Floating holiday:</strong> this will take this day and month as a reference to make it a floating holiday. Through this option, you can add a holiday that repeats every year but not necessarily on the exact same day. On subsequent years the date will need validation.</li> >+ <li><strong>Need validation:</strong> this holiday has been added automatically, but needs to be validated.</li> > </ol> >- >- <!-- These yyyy-mm-dd --> >- <input type="hidden" name="from_date" id='from_date'> >- <input type="hidden" name="to_date" id='to_date'> >- <input type="hidden" name="copyto_from" id='copyto_from'> >- <input type="hidden" name="copyto_to" id='copyto_to'> >- <input type="hidden" name="daysnumber" id='daysnumber'> >- <input type="hidden" name="local_today" id='local_today'> >- >- <fieldset class="action"> >- <input type="submit" name="submit" value="Save" /> >- <a href="#" class="cancel hidePanel newHoliday">Cancel</a> >- </fieldset> >- </fieldset> >- </form> >- </div> >- </div> >- </div> <!-- /.page-section --> >- </div> <!-- /.col-sm-6 --> >- >- <div class="col-sm-6"> >- <div class="page-section"> >- <div class="help"> >- <h4>Hints</h4> >- <ul> >- <li>Search in the calendar the day you want to set as holiday.</li> >- <li>Click the date to add or edit a holiday.</li> >- <li>Enter a title and description for the holiday.</li> >- <li>Specify how the holiday should repeat.</li> >- <li>Click Save to finish.</li> >- <li>PS: >- <ul> >- <li>Past dates cannot be changed</li> >- <li>Weekly holidays change open/close hours for all the days affected unless inputs are empty</li> >- </ul> >+ </div> > </li> >- </ul> >- <h4>Key</h4> >- <p> >- <span class="key normalday">Working day</span> >- <span class="key holiday">Unique holiday</span> >- <span class="key repeatableweekly">Holiday repeating weekly</span> >- <span class="key repeatableyearly">Holiday repeating yearly</span> >- <span class="key float">Floating holiday</span> >- <span class="key exception">Need validation</span> >- </p> >- </div> <!-- /#help --> >- >- <div id="holiday-list"> >- [% IF ( NEED_VALIDATION_HOLIDAYS ) %] >- <h3>Need validation holidays</h3> >- <table id="holidayexceptions" class="dataTable no-footer"> >- <thead> >- <tr> >- <th class="exception">Date</th> >- <th class="exception">Title</th> >- <th class="exception">Description</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH need_validation_holiday IN NEED_VALIDATION_HOLIDAYS %] >- <tr> >- <td><a href="#main" onclick="go_to_date('[% need_validation_holiday.date | html %]')"><span title="[% need_validation_holiday.DATE_SORT | html %]">[% need_validation_holiday.outputdate | html %]</span></a></td> >- <td>[% need_validation_holiday.note | html %]</td> >- <td>[% need_validation_holiday.description.replace('\\\r\\\n', '<br />') | html %]</td> >- </tr> >- [% END %] >- </tbody> >- </table> <!-- /#holidayexceptions --> >- [% END # /IF ( EXCEPTION_HOLIDAYS_LOOP ) %] >- >- [% IF ( WEEKLY_HOLIDAYS ) %] >- <h3>Weekly - Repeatable holidays</h3> >- <table id="holidayweeklyrepeatable" class="dataTable no-footer"> >- <thead> >- <tr> >- <th class="repeatableweekly">Day of week</th> >- <th class="repeatableweekly">Title</th> >- <th class="repeatableweekly">Description</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH WEEK_DAYS_LOO IN WEEKLY_HOLIDAYS %] >- <tr> >- <td>[% WEEK_DAYS_LOO.weekday | html %]</td> >- <td>[% WEEK_DAYS_LOO.note | html %]</td> >- <td>[% WEEK_DAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >- </tr> >- [% END %] >- </tbody> >- </table> <!-- /#holidayweeklyrepeatable --> >- [% END # / IF ( WEEKLY_HOLIDAYS ) %] >- >- [% IF ( REPEATABLE_HOLIDAYS ) %] >- <h3>Yearly - Repeatable holidays</h3> >- <table id="holidaysyearlyrepeatable" class="dataTable no-footer"> >- <thead> >- <tr> >- [% IF ( dateformat == "metric" ) %] >- <th class="repeatableyearly">Day/month</th> >- [% ELSE %] >- <th class="repeatableyearly">Month/day</th> >- [% END %] >- <th class="repeatableyearly">Title</th> >- <th class="repeatableyearly">Description</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH DAY_MONTH_HOLIDAYS_LOO IN REPEATABLE_HOLIDAYS %] >- <tr> >- [% IF ( dateformat == "metric" ) %] >- <td><span title="[% DAY_MONTH_HOLIDAYS_LOO.DATE_SORT | html %]">[% DAY_MONTH_HOLIDAYS_LOO.day | html %]/[% DAY_MONTH_HOLIDAYS_LOO.month | html %]</span></td> >- [% ELSE %] >- <td><span title="[% DAY_MONTH_HOLIDAYS_LOO.DATE_SORT | html %]">[% DAY_MONTH_HOLIDAYS_LOO.month | html %]/[% DAY_MONTH_HOLIDAYS_LOO.day | html %]</span></td> >- [% END %] >- <td>[% DAY_MONTH_HOLIDAYS_LOO.note | html %]</td> >- <td>[% DAY_MONTH_HOLIDAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >- </tr> >- [% END %] >- </tbody> >- </table> <!-- /#holidaysyearlyrepeatable --> >- [% END # /IF ( REPEATABLE_HOLIDAYS ) %] >- >- [% IF ( UNIQUE_HOLIDAYS ) %] >- <h3>Unique holidays</h3> >- <label class="controls"> >- <input type="checkbox" name="show_past" id="show_past_holidaysunique" class="show_past" /> >- Show past entries >- </label> >- <table id="holidaysunique" class="dataTable no-footer"> >- <thead> >- <tr> >- <th class="holiday">Date</th> >- <th class="holiday">Title</th> >- <th class="holiday">Description</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH HOLIDAYS_LOO IN UNIQUE_HOLIDAYS %] >- <tr data-date="[% HOLIDAYS_LOO.date | html %]"> >- <td><a href="#main" onclick="go_to_date('[% HOLIDAYS_LOO.date | html %]')"><span title="[% HOLIDAYS_LOO.DATE_SORT | html %]">[% HOLIDAYS_LOO.outputdate | html %]</span></a></td> >- <td>[% HOLIDAYS_LOO.note | html %]</td> >- <td>[% HOLIDAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >- </tr> >- [% END %] >- </tbody> >- </table> <!-- /#holidaysunique --> >- [% END # /IF ( UNIQUE_HOLIDAYS ) %] >- >- [% IF ( FLOAT_HOLIDAYS ) %] >- <h3>Floating holidays</h3> >- <label class="controls"> >- <input type="checkbox" name="show_past" id="show_past_holidaysfloat" class="show_past" /> >- Show past entries >- </label> >- <table id="holidaysfloat" class="dataTable no-footer"> >- <thead> >- <tr> >- <th class="float">Date</th> >- <th class="float">Title</th> >- <th class="float">Description</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH float_holiday IN FLOAT_HOLIDAYS %] >- <tr data-date="[% float_holiday.date | html %]"> >- <td><a href="#main" onclick="go_to_date('[% float_holiday.date | html %]')"><span title="[% float_holiday.DATE_SORT | html %]">[% float_holiday.outputdate | html %]</span></a></td> >- <td>[% float_holiday.note | html %]</td> >- <td>[% float_holiday.description.replace('\\\r\\\n', '<br />') | html %]</td> >- </tr> >- [% END %] >- </tbody> >- </table> <!-- /#holidaysfloat --> >- [% END # /IF ( FLOAT_HOLIDAYS ) %] >- </div> <!-- /#holiday-list --> >- </div> <!-- /.page-section --> >- </div> <!-- /.col-sm-6 --> >- </div> <!-- /.row --> >- </main> >- </div> <!-- /.col-sm-10.col-sm-push-2 --> >- >- <div class="col-sm-2 col-sm-pull-10"> >- <aside> >- [% INCLUDE 'tools-menu.inc' %] >- </aside> >- </div> <!-- .col-sm-2.col-sm-pull-10 --> >- </div> <!-- /.row --> >+ <li id="days_of_week"> >+ <label for="day_of_week">Week day</label> >+ <select name ='day_of_week'> >+ <option value="everyday">Everyday</option> >+ <option value="1">Sundays</option> >+ <option value="2">Mondays</option> >+ <option value="3">Tuesdays</option> >+ <option value="4">Wednesdays</option> >+ <option value="5">Thursdays</option> >+ <option value="6">Fridays</option> >+ <option value="7">Saturdays</option> >+ </select> >+ </li> >+ <li class="radio" id="deleteType"> >+ <input type="checkbox" name="deleteType" id="deleteType_checkbox" value="1" ><label for="deleteType_checkbox"> Delete this type</label> >+ <a href="#" class="helptext">[?]</a> >+ <div class="hint">Remove all repeated or weekly holidays of the selected date or week day <br> if working day is selected.</div> >+ </li> >+ <li> >+ <label for="openHour">Open hours: </label><input type="text" name="openHour" id='openHour' /> >+ </li> >+ <li> >+ <label for="closeHour">Close hours: </label><input type="text" name="closeHour" id='closeHour' /> >+ </li> >+ <li class="radio"> >+ <input type="radio" name="action" id="EditRadioButton" value="edit" checked/> >+ <label for="EditRadioButton">Edit selected dates</label> >+ </li> >+ <li class="radio"> >+ <input type="radio" name="action" id="CopyRadioButton" value="copyDates" /> >+ <label for="CopyRadioButton">Copy to different dates</label> >+ </li> >+ <li class="CopyDatePanel"> >+ <label>From:</label> >+ <input type="text" id="copyto_from_flatpickr" size="20"/> >+ <label>To:</label> >+ <input type="text" id="copyto_to_flatpickr" size="20"/> >+ </li> >+ <li class="checkbox"> >+ <input type="checkbox" name="all_branches" id="all_branches" /> >+ <label for="all_branches">Copy to all libraries</label>. >+ <a href="#" class="helptext">[?]</a> >+ <div class="hint">If checked, this holiday will be copied to all libraries.</div> >+ </li> >+ </ol> >+ >+ <!-- These yyyy-mm-dd --> >+ <input type="hidden" name="from_date" id='from_date'> >+ <input type="hidden" name="to_date" id='to_date'> >+ <input type="hidden" name="copyto_from" id='copyto_from'> >+ <input type="hidden" name="copyto_to" id='copyto_to'> >+ <input type="hidden" name="daysnumber" id='daysnumber'> >+ <input type="hidden" name="local_today" id='local_today'> >+ >+ <fieldset class="action"> >+ <input type="submit" name="submit" class="btn btn-primary" value="Save" /> >+ <a href="#" class="cancel hidePanel newHoliday">Cancel</a> >+ </fieldset> >+ </fieldset> >+ </form> >+ </div> >+ </div> >+ </div> <!-- /.page-section --> >+ </div> <!-- /.col-sm-6 --> >+ >+ <div class="col-sm-6"> >+ <div class="page-section"> >+ <div class="help"> >+ <h4>Hints</h4> >+ <ul> >+ <li>Search in the calendar the day you want to set as holiday.</li> >+ <li>Click the date to add or edit a holiday.</li> >+ <li>Enter a title and description for the holiday.</li> >+ <li>Specify how the holiday should repeat.</li> >+ <li>Click Save to finish.</li> >+ <li>PS: >+ <ul> >+ <li>Past dates cannot be changed</li> >+ <li>Weekly holidays change open/close hours for all the days affected unless inputs are empty</li> >+ </ul> >+ </li> >+ </ul> >+ <h4>Key</h4> >+ <p> >+ <span class="key normalday">Working day</span> >+ <span class="key holiday">Unique holiday</span> >+ <span class="key repeatableweekly">Holiday repeating weekly</span> >+ <span class="key repeatableyearly">Holiday repeating yearly</span> >+ <span class="key float">Floating holiday</span> >+ <span class="key exception">Need validation</span> >+ </p> >+ </div> <!-- /#help --> >+ >+ <div id="holiday-list"> >+ [% IF ( NEED_VALIDATION_HOLIDAYS ) %] >+ <h3>Need validation holidays</h3> >+ <table id="holidayexceptions" class="dataTable no-footer"> >+ <thead> >+ <tr> >+ <th class="exception">Date</th> >+ <th class="exception">Title</th> >+ <th class="exception">Description</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH need_validation_holiday IN NEED_VALIDATION_HOLIDAYS %] >+ <tr> >+ <td> >+ <a href="#main" onclick="go_to_date('[% need_validation_holiday.date | html %]')"><span title="[% need_validation_holiday.DATE_SORT | html %]">[% need_validation_holiday.outputdate | html %]</span></a> >+ </td> >+ <td>[% need_validation_holiday.note | html %]</td> >+ <td>[% need_validation_holiday.description.replace('\\\r\\\n', '<br />') | html %]</td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> <!-- /#holidayexceptions --> >+ [% END # /IF ( EXCEPTION_HOLIDAYS_LOOP ) %] >+ >+ [% IF ( WEEKLY_HOLIDAYS ) %] >+ <h3>Weekly - Repeatable holidays</h3> >+ <table id="holidayweeklyrepeatable" class="dataTable no-footer"> >+ <thead> >+ <tr> >+ <th class="repeatableweekly">Day of week</th> >+ <th class="repeatableweekly">Title</th> >+ <th class="repeatableweekly">Description</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH WEEK_DAYS_LOO IN WEEKLY_HOLIDAYS %] >+ <tr> >+ <td>[% WEEK_DAYS_LOO.weekday | html %]</td> >+ <td>[% WEEK_DAYS_LOO.note | html %]</td> >+ <td>[% WEEK_DAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> <!-- /#holidayweeklyrepeatable --> >+ [% END # / IF ( WEEKLY_HOLIDAYS ) %] >+ >+ [% IF ( REPEATABLE_HOLIDAYS ) %] >+ <h3>Yearly - Repeatable holidays</h3> >+ <table id="holidaysyearlyrepeatable" class="dataTable no-footer"> >+ <thead> >+ <tr> >+ [% IF ( dateformat == "metric" ) %] >+ <th class="repeatableyearly">Day/month</th> >+ [% ELSE %] >+ <th class="repeatableyearly">Month/day</th> >+ [% END %] >+ <th class="repeatableyearly">Title</th> >+ <th class="repeatableyearly">Description</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH DAY_MONTH_HOLIDAYS_LOO IN REPEATABLE_HOLIDAYS %] >+ <tr> >+ [% IF ( dateformat == "metric" ) %] >+ <td><span title="[% DAY_MONTH_HOLIDAYS_LOO.DATE_SORT | html %]">[% DAY_MONTH_HOLIDAYS_LOO.day | html %]/[% DAY_MONTH_HOLIDAYS_LOO.month | html %]</span></td> >+ [% ELSE %] >+ <td><span title="[% DAY_MONTH_HOLIDAYS_LOO.DATE_SORT | html %]">[% DAY_MONTH_HOLIDAYS_LOO.month | html %]/[% DAY_MONTH_HOLIDAYS_LOO.day | html %]</span></td> >+ [% END %] >+ <td>[% DAY_MONTH_HOLIDAYS_LOO.note | html %]</td> >+ <td>[% DAY_MONTH_HOLIDAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> <!-- /#holidaysyearlyrepeatable --> >+ [% END # /IF ( REPEATABLE_HOLIDAYS ) %] >+ >+ [% IF ( UNIQUE_HOLIDAYS ) %] >+ <h3>Unique holidays</h3> >+ <label class="controls"> >+ <input type="checkbox" name="show_past" id="show_past_holidaysunique" class="show_past" /> >+ Show past entries >+ </label> >+ <table id="holidaysunique" class="dataTable no-footer"> >+ <thead> >+ <tr> >+ <th class="holiday">Date</th> >+ <th class="holiday">Title</th> >+ <th class="holiday">Description</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH HOLIDAYS_LOO IN UNIQUE_HOLIDAYS %] >+ <tr data-date="[% HOLIDAYS_LOO.date | html %]"> >+ <td><a href="#main" onclick="go_to_date('[% HOLIDAYS_LOO.date | html %]')"><span title="[% HOLIDAYS_LOO.DATE_SORT | html %]">[% HOLIDAYS_LOO.outputdate | html %]</span></a></td> >+ <td>[% HOLIDAYS_LOO.note | html %]</td> >+ <td>[% HOLIDAYS_LOO.description.replace('\\\r\\\n', '<br />') | html %]</td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> <!-- /#holidaysunique --> >+ [% END # /IF ( UNIQUE_HOLIDAYS ) %] >+ >+ [% IF ( FLOAT_HOLIDAYS ) %] >+ <h3>Floating holidays</h3> >+ <label class="controls"> >+ <input type="checkbox" name="show_past" id="show_past_holidaysfloat" class="show_past" /> >+ Show past entries >+ </label> >+ <table id="holidaysfloat" class="dataTable no-footer"> >+ <thead> >+ <tr> >+ <th class="float">Date</th> >+ <th class="float">Title</th> >+ <th class="float">Description</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH float_holiday IN FLOAT_HOLIDAYS %] >+ <tr data-date="[% float_holiday.date | html %]"> >+ <td><a href="#main" onclick="go_to_date('[% float_holiday.date | html %]')"><span title="[% float_holiday.DATE_SORT | html %]">[% float_holiday.outputdate | html %]</span></a></td> >+ <td>[% float_holiday.note | html %]</td> >+ <td>[% float_holiday.description.replace('\\\r\\\n', '<br />') | html %]</td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> <!-- /#holidaysfloat --> >+ [% END # /IF ( FLOAT_HOLIDAYS ) %] >+ </div> >+ <!-- /#holiday-list --> >+ </div> >+ <!-- /.page-section --> >+ </div> >+ <!-- /.col-sm-6 --> >+ </div> >+ <!-- /.row --> >+[% END %] > > [% MACRO jsinclude BLOCK %] > [% INCLUDE 'calendar.inc' %] >diff --git a/misc/cronjobs/staticfines.pl b/misc/cronjobs/staticfines.pl >index 0cbee81582..b060497d17 100755 >--- a/misc/cronjobs/staticfines.pl >+++ b/misc/cronjobs/staticfines.pl >@@ -32,12 +32,12 @@ use Date::Calc qw( Date_to_Days ); > use Koha::Script -cron; > use C4::Context; > use C4::Overdues qw( CalcFine checkoverdues GetFine Getoverdues ); >-use C4::DiscreteCalendar qw(); # don't need any exports from Calendar > use C4::Log qw( cronlogaction ); > use Getopt::Long qw( GetOptions ); > use List::MoreUtils qw( none ); > use Koha::DateUtils qw( dt_from_string output_pref ); > use Koha::Patrons; >+use Koha::DiscreteCalendar; > > my $help = 0; > my $verbose = 0; >diff --git a/tools/discrete_calendar.pl b/tools/discrete_calendar.pl >index 71c46a9e8d..4633bc9df6 100755 >--- a/tools/discrete_calendar.pl >+++ b/tools/discrete_calendar.pl >@@ -20,21 +20,21 @@ use Modern::Perl; > > use CGI qw ( -utf8 ); > >-use C4::Auth qw( get_template_and_user ); >+use C4::Auth qw( get_template_and_user ); > use C4::Output qw( output_html_with_http_headers ); > >-use Koha::DateUtils qw ( dt_from_string output_pref ); >+use Koha::DateUtils qw( dt_from_string output_pref ); > use Koha::DiscreteCalendar; > > my $input = CGI->new; > > # Get the template to use >-my ($template, $loggedinuser, $cookie) = get_template_and_user( >+my ( $template, $loggedinuser, $cookie ) = get_template_and_user( > { > template_name => "tools/discrete_calendar.tt", >- type => "intranet", >- query => $input, >- flagsrequired => {tools => 'edit_calendar'}, >+ type => "intranet", >+ query => $input, >+ flagsrequired => { tools => 'edit_calendar' }, > } > ); > >@@ -57,7 +57,7 @@ my $action = $input->param('action') || ''; > # if the url has an invalid date default to 'now.' > # FIXME There is something to improve in the date handling here > my $calendarinput_dt = eval { dt_from_string( scalar $input->param('calendardate') ); } || dt_from_string; >-my $calendardate = output_pref( { dt => $calendarinput_dt, dateonly => 1 } ); >+my $calendardate = output_pref( { dt => $calendarinput_dt, dateonly => 1 } ); > > if ($action eq 'copyBranch') { > my $new_branch = scalar $input->param('newBranch'); >-- >2.43.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 17015
:
53859
|
54318
|
54419
|
59166
|
59167
|
59168
|
59169
|
59170
|
59171
|
59267
|
59268
|
59269
|
59270
|
59271
|
59463
|
59516
|
59517
|
59518
|
59519
|
59520
|
59561
|
59562
|
59586
|
59587
|
59888
|
59889
|
60902
|
60903
|
60904
|
60905
|
60906
|
60986
|
61737
|
62375
|
62376
|
62380
|
63257
|
63282
|
63362
|
63363
|
63364
|
63365
|
63366
|
63367
|
64235
|
65073
|
65074
|
65075
|
65076
|
65077
|
67721
|
67722
|
67723
|
67724
|
67725
|
67879
|
67929
|
67930
|
67931
|
67932
|
67933
|
67934
|
68392
|
68393
|
68394
|
68395
|
68396
|
68397
|
71634
|
71635
|
71636
|
71637
|
71638
|
72890
|
73145
|
74859
|
74860
|
74861
|
74862
|
74863
|
74864
|
74865
|
74866
|
75444
|
75479
|
76594
|
77249
|
77250
|
77607
|
77608
|
77609
|
77610
|
77611
|
77612
|
77613
|
77770
|
77771
|
77772
|
77773
|
77774
|
79035
|
80523
|
80524
|
80525
|
80526
|
80527
|
80528
|
80529
|
80530
|
80531
|
80532
|
80533
|
80534
|
80535
|
83547
|
85394
|
85677
|
85678
|
85679
|
85680
|
85681
|
85682
|
85683
|
85684
|
85685
|
85686
|
85687
|
85688
|
85689
|
85690
|
85691
|
92595
|
92596
|
92597
|
92598
|
100079
|
110383
|
110384
|
110386
|
110387
|
110388
|
110389
|
113541
|
113905
|
115501
|
115502
|
115503
|
115504
|
115505
|
115506
|
115507
|
115508
|
115509
|
115510
|
115511
|
118554
|
118555
|
118556
|
118557
|
118558
|
118559
|
119095
|
119097
|
119099
|
119100
|
119101
|
119102
|
131619
|
131620
|
131621
|
131622
|
131623
|
131624
|
131625
|
131626
|
131634
|
131635
|
131636
|
131637
|
131638
|
131639
|
131640
|
131641
|
131667
|
132199
|
133596
|
133597
|
133598
|
133599
|
133600
|
133601
|
133602
|
133603
|
133604
|
133605
|
133678
|
137219
|
137220
|
137221
|
137222
|
137223
|
137224
|
137225
|
137226
|
137227
|
137228
|
137229
|
139378
|
139379
|
139380
|
139381
|
139382
|
139599
|
139600
|
139601
|
139602
|
139603
|
139851
|
140150
|
141176
|
144257
|
144258
|
144259
|
144260
|
144261
|
144262
|
144264
|
144268
|
144269
|
144270
|
144271
|
144272
|
144273
|
151438
|
151439
|
151440
|
151441
|
151442
|
151443
|
151444
|
151445
|
151446
|
151447
|
151448
|
151449
|
151450
|
156340
|
156341
|
156342
|
156343
|
156344
|
156345
|
156346
|
156347
|
156348
|
156349
|
156350
|
156351
|
156352
|
156353
|
156354
|
156355
|
157656
|
157657
|
157658
|
157659
|
157660
|
157661
|
157662
|
157663
|
157664
|
157665
|
157666
|
157667
|
157668
|
157669
|
157670
|
157671
|
157672
|
167805
|
167806
|
167807
|
167808
|
167809
|
180312
|
180313
|
180314
| 180315 |
180316
|
180552
|
180962
|
181466