View | Details | Raw Unified | Return to bug 7583
Collapse All | Expand All

(-)a/C4/Acquisition.pm (-29 / +151 lines)
Lines 56-62 BEGIN { Link Here
56
        &NewOrder &DelOrder &ModOrder &GetPendingOrders &GetOrder &GetOrders
56
        &NewOrder &DelOrder &ModOrder &GetPendingOrders &GetOrder &GetOrders
57
        &GetOrderNumber &GetLateOrders &GetOrderFromItemnumber
57
        &GetOrderNumber &GetLateOrders &GetOrderFromItemnumber
58
        &SearchOrder &GetHistory &GetRecentAcqui
58
        &SearchOrder &GetHistory &GetRecentAcqui
59
        &ModReceiveOrder &ModOrderBiblioitemNumber
59
        &ModReceiveOrder &CancelReceipt &ModOrderBiblioitemNumber
60
        &GetCancelledOrders
60
        &GetCancelledOrders
61
61
62
        &NewOrderItem &ModOrderItem &ModItemOrder
62
        &NewOrderItem &ModOrderItem &ModItemOrder
Lines 1042-1047 sub NewOrder { Link Here
1042
    }
1042
    }
1043
1043
1044
    my $ordernumber=InsertInTable("aqorders",$orderinfo);
1044
    my $ordernumber=InsertInTable("aqorders",$orderinfo);
1045
    if (not $orderinfo->{parent_ordernumber}) {
1046
        my $sth = $dbh->prepare("
1047
            UPDATE aqorders
1048
            SET parent_ordernumber = ordernumber
1049
            WHERE ordernumber = ?
1050
        ");
1051
        $sth->execute($ordernumber);
1052
    }
1045
    return ( $orderinfo->{'basketno'}, $ordernumber );
1053
    return ( $orderinfo->{'basketno'}, $ordernumber );
1046
}
1054
}
1047
1055
Lines 1259-1264 sub ModReceiveOrder { Link Here
1259
        $invoiceno, $freight, $rrp, $budget_id, $datereceived, $received_items
1267
        $invoiceno, $freight, $rrp, $budget_id, $datereceived, $received_items
1260
    )
1268
    )
1261
    = @_;
1269
    = @_;
1270
1262
    my $dbh = C4::Context->dbh;
1271
    my $dbh = C4::Context->dbh;
1263
    $datereceived = C4::Dates->output('iso') unless $datereceived;
1272
    $datereceived = C4::Dates->output('iso') unless $datereceived;
1264
    my $suggestionid = GetSuggestionFromBiblionumber( $biblionumber );
1273
    my $suggestionid = GetSuggestionFromBiblionumber( $biblionumber );
Lines 1277-1316 sub ModReceiveOrder { Link Here
1277
    my $order = $sth->fetchrow_hashref();
1286
    my $order = $sth->fetchrow_hashref();
1278
    $sth->finish();
1287
    $sth->finish();
1279
1288
1289
    my $new_ordernumber = $ordernumber;
1280
    if ( $order->{quantity} > $quantrec ) {
1290
    if ( $order->{quantity} > $quantrec ) {
1291
        # Split order line in two parts: the first is the original order line
1292
        # without received items (the quantity is decreased),
1293
        # the second part is a new order line with quantity=quantityrec
1294
        # (entirely received)
1281
        $sth=$dbh->prepare("
1295
        $sth=$dbh->prepare("
1282
            UPDATE aqorders
1296
            UPDATE aqorders
1283
            SET quantityreceived=?
1297
            SET quantity = ?
1284
                , datereceived=?
1298
            WHERE ordernumber = ?
1285
                , booksellerinvoicenumber=?
1299
        ");
1286
                , unitprice=?
1300
1287
                , freight=?
1301
        $sth->execute($order->{quantity} - $quantrec, $ordernumber);
1288
                , rrp=?
1289
                , quantity=?
1290
            WHERE biblionumber=? AND ordernumber=?");
1291
1292
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordernumber);
1293
        $sth->finish;
1302
        $sth->finish;
1294
1303
1295
        # create a new order for the remaining items, and set its bookfund.
1304
        delete $order->{'ordernumber'};
1296
        foreach my $orderkey ( "linenumber", "allocation" ) {
1305
        $order->{'quantity'} = $quantrec;
1297
            delete($order->{'$orderkey'});
1306
        $order->{'quantityreceived'} = $quantrec;
1298
        }
1307
        $order->{'datereceived'} = $datereceived;
1299
        $order->{'quantity'} -= $quantrec;
1308
        $order->{'booksellerinvoicenumber'} = $invoiceno;
1300
        $order->{'quantityreceived'} = 0;
1309
        $order->{'unitprice'} = $cost;
1301
        my $newOrder = NewOrder($order);
1310
        $order->{'freight'} = $freight;
1302
        # Change ordernumber in aqorders_items for items not received
1311
        $order->{'rrp'} = $rrp;
1303
        my @orderitems = GetItemnumbersFromOrder( $order->{'ordernumber'} );
1312
        $order->{'orderstatus'} = 3;    # totally received
1304
        my $count = scalar @orderitems;
1313
        $new_ordernumber = NewOrder($order);
1305
1314
1306
        for (my $i=0; $i<$count; $i++){
1315
        if ($received_items) {
1307
            foreach (@$received_items){
1316
            foreach my $itemnumber (@$received_items) {
1308
                splice (@orderitems, $i, 1) if ($orderitems[$i] == $_);
1317
                ModItemOrder($itemnumber, $new_ordernumber);
1309
            }
1318
            }
1310
        }
1319
        }
1311
        foreach (@orderitems) {
1312
            ModItemOrder($_, $newOrder);
1313
        }
1314
    } else {
1320
    } else {
1315
        $sth=$dbh->prepare("update aqorders
1321
        $sth=$dbh->prepare("update aqorders
1316
                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
1322
                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
Lines 1319-1326 sub ModReceiveOrder { Link Here
1319
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
1325
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
1320
        $sth->finish;
1326
        $sth->finish;
1321
    }
1327
    }
1322
    return $datereceived;
1328
    return ($datereceived, $new_ordernumber);
1323
}
1329
}
1330
1331
=head3 CancelReceipt
1332
1333
    my $parent_ordernumber = CancelReceipt($ordernumber);
1334
1335
    Cancel an order line receipt and update the parent order line, as if no
1336
    receipt was made.
1337
    If items are created at receipt (AcqCreateItem = receiving) then delete
1338
    these items.
1339
1340
=cut
1341
1342
sub CancelReceipt {
1343
    my $ordernumber = shift;
1344
1345
    return unless $ordernumber;
1346
1347
    my $dbh = C4::Context->dbh;
1348
    my $query = qq{
1349
        SELECT datereceived, parent_ordernumber, quantity
1350
        FROM aqorders
1351
        WHERE ordernumber = ?
1352
    };
1353
    my $sth = $dbh->prepare($query);
1354
    $sth->execute($ordernumber);
1355
    my $order = $sth->fetchrow_hashref;
1356
    unless($order) {
1357
        warn "CancelReceipt: order $ordernumber does not exist";
1358
        return;
1359
    }
1360
    unless($order->{'datereceived'}) {
1361
        warn "CancelReceipt: order $ordernumber is not received";
1362
        return;
1363
    }
1364
1365
    my $parent_ordernumber = $order->{'parent_ordernumber'};
1366
1367
    if($parent_ordernumber == $ordernumber || not $parent_ordernumber) {
1368
        # The order line has no parent, just mark it as not received
1369
        $query = qq{
1370
            UPDATE aqorders
1371
            SET quantityreceived = ?,
1372
                datereceived = ?,
1373
                booksellerinvoicenumber = ?
1374
            WHERE ordernumber = ?
1375
        };
1376
        $sth = $dbh->prepare($query);
1377
        $sth->execute(0, undef, undef, $ordernumber);
1378
    } else {
1379
        # The order line has a parent, increase parent quantity and delete
1380
        # the order line.
1381
        $query = qq{
1382
            SELECT quantity, datereceived
1383
            FROM aqorders
1384
            WHERE ordernumber = ?
1385
        };
1386
        $sth = $dbh->prepare($query);
1387
        $sth->execute($parent_ordernumber);
1388
        my $parent_order = $sth->fetchrow_hashref;
1389
        unless($parent_order) {
1390
            warn "Parent order $parent_ordernumber does not exist.";
1391
            return;
1392
        }
1393
        if($parent_order->{'datereceived'}) {
1394
            warn "CancelReceipt: parent order is received.".
1395
                " Can't cancel receipt.";
1396
            return;
1397
        }
1398
        $query = qq{
1399
            UPDATE aqorders
1400
            SET quantity = ?
1401
            WHERE ordernumber = ?
1402
        };
1403
        $sth = $dbh->prepare($query);
1404
        my $rv = $sth->execute(
1405
            $order->{'quantity'} + $parent_order->{'quantity'},
1406
            $parent_ordernumber
1407
        );
1408
        unless($rv) {
1409
            warn "Cannot update parent order line, so do not cancel".
1410
                " receipt";
1411
            return;
1412
        }
1413
        if(C4::Context->preference('AcqCreateItem') eq 'receiving') {
1414
            # Remove items that were created at receipt
1415
            $query = qq{
1416
                DELETE FROM items, aqorders_items
1417
                USING items, aqorders_items
1418
                WHERE items.itemnumber = ? AND aqorders_items.itemnumber = ?
1419
            };
1420
            $sth = $dbh->prepare($query);
1421
            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
1422
            foreach my $itemnumber (@itemnumbers) {
1423
                $sth->execute($itemnumber, $itemnumber);
1424
            }
1425
        } else {
1426
            # Update items
1427
            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
1428
            foreach my $itemnumber (@itemnumbers) {
1429
                ModItemOrder($itemnumber, $parent_ordernumber);
1430
            }
1431
        }
1432
        # Delete order line
1433
        $query = qq{
1434
            DELETE FROM aqorders
1435
            WHERE ordernumber = ?
1436
        };
1437
        $sth = $dbh->prepare($query);
1438
        $sth->execute($ordernumber);
1439
1440
    }
1441
1442
    return $parent_ordernumber;
1443
}
1444
1324
#------------------------------------------------------------#
1445
#------------------------------------------------------------#
1325
1446
1326
=head3 SearchOrder
1447
=head3 SearchOrder
Lines 1464-1469 sub GetParcel { Link Here
1464
                firstname,
1585
                firstname,
1465
                aqorders.biblionumber,
1586
                aqorders.biblionumber,
1466
                aqorders.ordernumber,
1587
                aqorders.ordernumber,
1588
                aqorders.parent_ordernumber,
1467
                aqorders.quantity,
1589
                aqorders.quantity,
1468
                aqorders.quantityreceived,
1590
                aqorders.quantityreceived,
1469
                aqorders.unitprice,
1591
                aqorders.unitprice,
(-)a/acqui/finishreceive.pl (-9 / +15 lines)
Lines 58-63 my $note = $input->param("note"); Link Here
58
58
59
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
59
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
60
if ($quantityrec > $origquantityrec ) {
60
if ($quantityrec > $origquantityrec ) {
61
    my @received_items = ();
62
    if(C4::Context->preference('AcqCreateItem') eq 'ordering') {
63
        @received_items = $input->param('items_to_receive');
64
    }
65
66
    my $new_ordernumber = $ordernumber;
67
    # save the quantity received.
68
    if ( $quantityrec > 0 ) {
69
        ($datereceived, $new_ordernumber) = ModReceiveOrder(
70
            $biblionumber, $ordernumber, $quantityrec, $user, $unitprice,
71
            $invoiceno, $freight, $replacement, undef, $datereceived,
72
            \@received_items);
73
    }
74
61
    # now, add items if applicable
75
    # now, add items if applicable
62
    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
76
    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
63
77
Lines 91-107 if ($quantityrec > $origquantityrec ) { Link Here
91
                                          $itemhash{$item}->{'indicator'},'ITEM');
105
                                          $itemhash{$item}->{'indicator'},'ITEM');
92
            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
106
            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
93
            my (undef,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber);
107
            my (undef,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber);
94
            NewOrderItem($itemnumber, $ordernumber);
108
            NewOrderItem($itemnumber, $new_ordernumber);
95
        }
109
        }
96
    }
110
    }
97
98
    my @received_items = ();
99
    if(C4::Context->preference('AcqCreateItem') eq 'ordering') {
100
        @received_items = $input->param('items_to_receive');
101
    }
102
103
    # save the quantity received.
104
    $datereceived = ModReceiveOrder($biblionumber,$ordernumber, $quantityrec ,$user,$unitprice,$invoiceno,$freight,$replacement,undef,$datereceived, \@received_items);
105
}
111
}
106
112
107
update_item( $_ ) foreach GetItemnumbersFromOrder( $ordernumber );
113
update_item( $_ ) foreach GetItemnumbersFromOrder( $ordernumber );
(-)a/acqui/parcel.pl (-2 / +12 lines)
Lines 78-85 my $invoice=$input->param('invoice') || ''; Link Here
78
my $freight=$input->param('freight');
78
my $freight=$input->param('freight');
79
my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
79
my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
80
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
80
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
81
my $datereceived =  ($input->param('op') eq ('new' or "search")) ? C4::Dates->new($input->param('datereceived'))
81
my $op = $input->param('op') // '';
82
                    :  C4::Dates->new($input->param('datereceived'), 'iso');
82
my $datereceived = ($op eq ('new' or 'search' )
83
    ? C4::Dates->new($input->param('datereceived'))
84
    :  C4::Dates->new($input->param('datereceived'), 'iso');
83
$datereceived = C4::Dates->new() unless $datereceived;
85
$datereceived = C4::Dates->new() unless $datereceived;
84
my $code            = $input->param('code');
86
my $code            = $input->param('code');
85
my @rcv_err         = $input->param('error');
87
my @rcv_err         = $input->param('error');
Lines 98-103 my ($template, $loggedinuser, $cookie) Link Here
98
                 debug => 1,
100
                 debug => 1,
99
});
101
});
100
102
103
if($op eq 'cancelreceipt') {
104
    my $ordernumber = $input->param('ordernumber');
105
    my $parent_ordernumber = CancelReceipt($ordernumber);
106
    unless($parent_ordernumber) {
107
        $template->param(error_cancelling_receipt => 1);
108
    }
109
}
110
101
# If receiving error, report the error (coming from finishrecieve.pl(sic)).
111
# If receiving error, report the error (coming from finishrecieve.pl(sic)).
102
if( scalar(@rcv_err) ) {
112
if( scalar(@rcv_err) ) {
103
	my $cnt=0;
113
	my $cnt=0;
(-)a/installer/data/mysql/kohastructure.sql (+1 lines)
Lines 2773-2778 CREATE TABLE `aqorders` ( -- information related to the basket line items Link Here
2773
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2773
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2774
  `claims_count` int(11) default 0, -- count of claim letters generated
2774
  `claims_count` int(11) default 0, -- count of claim letters generated
2775
  `claimed_date` date default NULL, -- last date a claim was generated
2775
  `claimed_date` date default NULL, -- last date a claim was generated
2776
  parent_ordernumber int(11) default NULL, -- ordernumber of parent order line, or same as ordernumber if no parent
2776
  PRIMARY KEY  (`ordernumber`),
2777
  PRIMARY KEY  (`ordernumber`),
2777
  KEY `basketno` (`basketno`),
2778
  KEY `basketno` (`basketno`),
2778
  KEY `biblionumber` (`biblionumber`),
2779
  KEY `biblionumber` (`biblionumber`),
(-)a/installer/data/mysql/updatedatabase.pl (+15 lines)
Lines 5696-5701 if (C4::Context->preference("Version") < TransformToNum($DBversion)) { Link Here
5696
    SetVersion($DBversion);
5696
    SetVersion($DBversion);
5697
}
5697
}
5698
5698
5699
$DBversion = "XXX";
5700
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5701
    $dbh->do("
5702
        ALTER TABLE aqorders
5703
        ADD parent_ordernumber int(11) DEFAULT NULL
5704
    ");
5705
    $dbh->do("
5706
        UPDATE aqorders
5707
        SET parent_ordernumber = ordernumber;
5708
    ");
5709
    print "Upgrade to $DBversion done (Adding parent_ordernumber in aqorders)\n";
5710
    SetVersion($DBversion);
5711
}
5712
5713
5699
=head1 FUNCTIONS
5714
=head1 FUNCTIONS
5700
5715
5701
=head2 TableExists($table)
5716
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt (-1 / +19 lines)
Lines 161-166 Link Here
161
	[% END %]
161
	[% END %]
162
    [% END %]
162
    [% END %]
163
163
164
    [% IF (error_cancelling_receipt) %]
165
      <div class="error">
166
      Cannot cancel receipt. Possible reasons :
167
      <ul>
168
        <li>
169
          You are trying to cancel the receipt of an order line whose parent
170
          order line is already received. Cancel this parent order line and
171
          retry.
172
        </li>
173
        <li>Parent order line has been deleted.</li>
174
      </ul>
175
      </div>
176
    [% END %]
177
164
<div id="acqui_receive_summary">
178
<div id="acqui_receive_summary">
165
<p><strong>Invoice number:</strong> [% invoice %] <strong>Received by:</strong> [% loggedinusername %] <strong>On:</strong> [% formatteddatereceived %]</p>
179
<p><strong>Invoice number:</strong> [% invoice %] <strong>Received by:</strong> [% loggedinusername %] <strong>On:</strong> [% formatteddatereceived %]</p>
166
	<!-- TODO: Add date picker, change rcv date. -->
180
	<!-- TODO: Add date picker, change rcv date. -->
Lines 269-274 Link Here
269
<div id="acqui_receive_receivelist">
283
<div id="acqui_receive_receivelist">
270
    <h3>Already received</h3>
284
    <h3>Already received</h3>
271
285
286
272
   [% IF ( loop_received ) %]
287
   [% IF ( loop_received ) %]
273
   <form action="/cgi-bin/koha/acqui/parcel.pl" method="get" name="orderform">
288
   <form action="/cgi-bin/koha/acqui/parcel.pl" method="get" name="orderform">
274
    <table id="receivedt">
289
    <table id="receivedt">
Lines 282-287 Link Here
282
		<th>Est cost</th>
297
		<th>Est cost</th>
283
		<th>Actual cost</th>
298
		<th>Actual cost</th>
284
		<th>TOTAL</th>
299
		<th>TOTAL</th>
300
        <th></th>
285
	    </tr>
301
	    </tr>
286
    </thead>
302
    </thead>
287
    <tfoot>
303
    <tfoot>
Lines 290-295 Link Here
290
		<td colspan="2">&nbsp;</td>
306
		<td colspan="2">&nbsp;</td>
291
		<td>[% totalprice %]</td>
307
		<td>[% totalprice %]</td>
292
		<td>[% tototal %]</td>
308
		<td>[% tototal %]</td>
309
        <td></td>
293
	    </tr>
310
	    </tr>
294
	      
311
	      
295
	      [% IF ( totalfreight ) %]
312
	      [% IF ( totalfreight ) %]
Lines 317-322 Link Here
317
		<td>[% totalquantity %]</td>
334
		<td>[% totalquantity %]</td>
318
		<td colspan="2">&nbsp;</td>
335
		<td colspan="2">&nbsp;</td>
319
		<td>[% grandtot %]</td>
336
		<td>[% grandtot %]</td>
337
        <td></td>
320
	    </tr>
338
	    </tr>
321
    </tfoot>
339
    </tfoot>
322
	<tbody class="filterclass">
340
	<tbody class="filterclass">
Lines 339-344 Link Here
339
                <td>[% loop_receive.ecost %]</td>
357
                <td>[% loop_receive.ecost %]</td>
340
                <td>[% loop_receive.unitprice %]</td>
358
                <td>[% loop_receive.unitprice %]</td>
341
                <td>[% loop_receive.total %]</td>
359
                <td>[% loop_receive.total %]</td>
360
                <td><a href="/cgi-bin/koha/acqui/parcel.pl?invoice=[% loop_receive.invoice %]&booksellerid=[% booksellerid %]&datereceived=[% datereceived %]&op=cancelreceipt&ordernumber=[% loop_receive.ordernumber %]">Cancel receipt</a></td>
342
            </tr>
361
            </tr>
343
	    [% END %]
362
	    [% END %]
344
	</tbody>
363
	</tbody>
345
- 

Return to bug 7583