|
Lines 121-158
sub store {
Link Here
|
| 121 |
|
121 |
|
| 122 |
} else { # ModItem |
122 |
} else { # ModItem |
| 123 |
|
123 |
|
| 124 |
{ # Update *_on fields if needed |
124 |
my %updated_columns = $self->_result->get_dirty_columns; |
| 125 |
# Why not for AddItem as well? |
125 |
return $self->SUPER::store unless %updated_columns; |
| 126 |
my @fields = qw( itemlost withdrawn damaged ); |
|
|
| 127 |
|
| 128 |
# Only retrieve the item if we need to set an "on" date field |
| 129 |
if ( $self->itemlost || $self->withdrawn || $self->damaged ) { |
| 130 |
my $pre_mod_item = $self->get_from_storage; |
| 131 |
for my $field (@fields) { |
| 132 |
if ( $self->$field |
| 133 |
and not $pre_mod_item->$field ) |
| 134 |
{ |
| 135 |
my $field_on = "${field}_on"; |
| 136 |
$self->$field_on( |
| 137 |
DateTime::Format::MySQL->format_datetime( dt_from_string() ) |
| 138 |
); |
| 139 |
} |
| 140 |
} |
| 141 |
} |
| 142 |
|
126 |
|
| 143 |
# If the field is defined but empty, we are removing and, |
127 |
# Retreive the item for comparison if we need to |
| 144 |
# and thus need to clear out the 'on' field as well |
128 |
my $pre_mod_item = $self->get_from_storage |
| 145 |
for my $field (@fields) { |
129 |
if ( exists $updated_columns{itemlost} |
| 146 |
if ( defined( $self->$field ) && !$self->$field ) { |
130 |
or exists $updated_columns{withdrawn} |
| 147 |
my $field_on = "${field}_on"; |
131 |
or exists $updated_columns{damaged} ); |
| 148 |
$self->$field_on(undef); |
132 |
|
| 149 |
} |
133 |
# Update *_on fields if needed |
|
|
134 |
# FIXME: Why not for AddItem as well? |
| 135 |
my @fields = qw( itemlost withdrawn damaged ); |
| 136 |
for my $field (@fields) { |
| 137 |
|
| 138 |
# If the field is defined but empty or 0, we are |
| 139 |
# removing/unsetting and thus need to clear out |
| 140 |
# the 'on' field |
| 141 |
if ( exists $updated_columns{$field} |
| 142 |
&& defined( $self->$field ) |
| 143 |
&& !$self->$field ) |
| 144 |
{ |
| 145 |
my $field_on = "${field}_on"; |
| 146 |
$self->$field_on(undef); |
| 147 |
} |
| 148 |
# If the field has changed otherwise, we much update |
| 149 |
# the 'on' field |
| 150 |
elsif (exists $updated_columns{$field} |
| 151 |
&& $updated_columns{$field} |
| 152 |
&& !$pre_mod_item->$field ) |
| 153 |
{ |
| 154 |
my $field_on = "${field}_on"; |
| 155 |
$self->$field_on( |
| 156 |
DateTime::Format::MySQL->format_datetime( |
| 157 |
dt_from_string() |
| 158 |
) |
| 159 |
); |
| 150 |
} |
160 |
} |
| 151 |
} |
161 |
} |
| 152 |
|
162 |
|
| 153 |
my %updated_columns = $self->_result->get_dirty_columns; |
|
|
| 154 |
return $self->SUPER::store unless %updated_columns; |
| 155 |
|
| 156 |
if ( exists $updated_columns{itemcallnumber} |
163 |
if ( exists $updated_columns{itemcallnumber} |
| 157 |
or exists $updated_columns{cn_source} ) |
164 |
or exists $updated_columns{cn_source} ) |
| 158 |
{ |
165 |
{ |
|
Lines 169-181
sub store {
Link Here
|
| 169 |
$self->permanent_location( $self->location ); |
176 |
$self->permanent_location( $self->location ); |
| 170 |
} |
177 |
} |
| 171 |
|
178 |
|
| 172 |
# If item was lost, it has now been found, reverse any list item charges if necessary. |
179 |
# If item was lost and has now been found, |
| 173 |
if ( exists $updated_columns{itemlost} |
180 |
# reverse any list item charges if necessary. |
| 174 |
and $self->itemlost != $updated_columns{itemlost} |
181 |
if ( exists $updated_columns{itemlost} |
| 175 |
and $self->itemlost >= 1 |
182 |
and $updated_columns{itemlost} <= 0 |
| 176 |
and $updated_columns{itemlost} <= 0 |
183 |
and $pre_mod_item->itemlost > 0 ) |
| 177 |
) { |
184 |
{ |
| 178 |
$self->_set_found_trigger; |
185 |
$self->_set_found_trigger($pre_mod_item); |
| 179 |
$self->paidfor(''); |
186 |
$self->paidfor(''); |
| 180 |
} |
187 |
} |
| 181 |
|
188 |
|
|
Lines 786-801
Internal function, not exported, called only by Koha::Item->store.
Link Here
|
| 786 |
=cut |
793 |
=cut |
| 787 |
|
794 |
|
| 788 |
sub _set_found_trigger { |
795 |
sub _set_found_trigger { |
| 789 |
my ( $self, $params ) = @_; |
796 |
my ( $self, $pre_mod_item ) = @_; |
| 790 |
|
797 |
|
| 791 |
## If item was lost, it has now been found, reverse any list item charges if necessary. |
798 |
## If item was lost, it has now been found, reverse any list item charges if necessary. |
| 792 |
my $refund = 1; |
|
|
| 793 |
my $no_refund_after_days = |
799 |
my $no_refund_after_days = |
| 794 |
C4::Context->preference('NoRefundOnLostReturnedItemsAge'); |
800 |
C4::Context->preference('NoRefundOnLostReturnedItemsAge'); |
| 795 |
if ($no_refund_after_days) { |
801 |
if ($no_refund_after_days) { |
| 796 |
my $today = dt_from_string(); |
802 |
my $today = dt_from_string(); |
| 797 |
my $lost_age_in_days = |
803 |
my $lost_age_in_days = |
| 798 |
dt_from_string( $self->itemlost_on )->delta_days($today) |
804 |
dt_from_string( $pre_mod_item->itemlost_on )->delta_days($today) |
| 799 |
->in_units('days'); |
805 |
->in_units('days'); |
| 800 |
|
806 |
|
| 801 |
return $self unless $lost_age_in_days < $no_refund_after_days; |
807 |
return $self unless $lost_age_in_days < $no_refund_after_days; |
|
Lines 879-885
sub _set_found_trigger {
Link Here
|
| 879 |
|
885 |
|
| 880 |
# Update the account status |
886 |
# Update the account status |
| 881 |
$accountline->status('FOUND'); |
887 |
$accountline->status('FOUND'); |
| 882 |
$accountline->store; |
888 |
$accountline->store(); |
| 883 |
|
889 |
|
| 884 |
if ( defined $account and C4::Context->preference('AccountAutoReconcile') ) { |
890 |
if ( defined $account and C4::Context->preference('AccountAutoReconcile') ) { |
| 885 |
$account->reconcile_balance; |
891 |
$account->reconcile_balance; |
| 886 |
- |
|
|