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 1029-1034 sub NewOrder { Link Here
1029
    }
1029
    }
1030
1030
1031
    my $ordernumber=InsertInTable("aqorders",$orderinfo);
1031
    my $ordernumber=InsertInTable("aqorders",$orderinfo);
1032
    if (not $orderinfo->{parent_ordernumber}) {
1033
        my $sth = $dbh->prepare("
1034
            UPDATE aqorders
1035
            SET parent_ordernumber = ordernumber
1036
            WHERE ordernumber = ?
1037
        ");
1038
        $sth->execute($ordernumber);
1039
    }
1032
    return ( $orderinfo->{'basketno'}, $ordernumber );
1040
    return ( $orderinfo->{'basketno'}, $ordernumber );
1033
}
1041
}
1034
1042
Lines 1246-1251 sub ModReceiveOrder { Link Here
1246
        $invoiceno, $freight, $rrp, $budget_id, $datereceived, $received_items
1254
        $invoiceno, $freight, $rrp, $budget_id, $datereceived, $received_items
1247
    )
1255
    )
1248
    = @_;
1256
    = @_;
1257
1249
    my $dbh = C4::Context->dbh;
1258
    my $dbh = C4::Context->dbh;
1250
    $datereceived = C4::Dates->output('iso') unless $datereceived;
1259
    $datereceived = C4::Dates->output('iso') unless $datereceived;
1251
    my $suggestionid = GetSuggestionFromBiblionumber( $biblionumber );
1260
    my $suggestionid = GetSuggestionFromBiblionumber( $biblionumber );
Lines 1264-1303 sub ModReceiveOrder { Link Here
1264
    my $order = $sth->fetchrow_hashref();
1273
    my $order = $sth->fetchrow_hashref();
1265
    $sth->finish();
1274
    $sth->finish();
1266
1275
1276
    my $new_ordernumber = $ordernumber;
1267
    if ( $order->{quantity} > $quantrec ) {
1277
    if ( $order->{quantity} > $quantrec ) {
1278
        # Split order line in two parts: the first is the original order line
1279
        # without received items (the quantity is decreased),
1280
        # the second part is a new order line with quantity=quantityrec
1281
        # (entirely received)
1268
        $sth=$dbh->prepare("
1282
        $sth=$dbh->prepare("
1269
            UPDATE aqorders
1283
            UPDATE aqorders
1270
            SET quantityreceived=?
1284
            SET quantity = ?
1271
                , datereceived=?
1285
            WHERE ordernumber = ?
1272
                , booksellerinvoicenumber=?
1286
        ");
1273
                , unitprice=?
1287
1274
                , freight=?
1288
        $sth->execute($order->{quantity} - $quantrec, $ordernumber);
1275
                , rrp=?
1276
                , quantity=?
1277
            WHERE biblionumber=? AND ordernumber=?");
1278
1279
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordernumber);
1280
        $sth->finish;
1289
        $sth->finish;
1281
1290
1282
        # create a new order for the remaining items, and set its bookfund.
1291
        delete $order->{'ordernumber'};
1283
        foreach my $orderkey ( "linenumber", "allocation" ) {
1292
        $order->{'quantity'} = $quantrec;
1284
            delete($order->{'$orderkey'});
1293
        $order->{'quantityreceived'} = $quantrec;
1285
        }
1294
        $order->{'datereceived'} = $datereceived;
1286
        $order->{'quantity'} -= $quantrec;
1295
        $order->{'booksellerinvoicenumber'} = $invoiceno;
1287
        $order->{'quantityreceived'} = 0;
1296
        $order->{'unitprice'} = $cost;
1288
        my $newOrder = NewOrder($order);
1297
        $order->{'freight'} = $freight;
1289
        # Change ordernumber in aqorders_items for items not received
1298
        $order->{'rrp'} = $rrp;
1290
        my @orderitems = GetItemnumbersFromOrder( $order->{'ordernumber'} );
1299
        $order->{'orderstatus'} = 3;    # totally received
1291
        my $count = scalar @orderitems;
1300
        $new_ordernumber = NewOrder($order);
1292
1301
1293
        for (my $i=0; $i<$count; $i++){
1302
        if ($received_items) {
1294
            foreach (@$received_items){
1303
            foreach my $itemnumber (@$received_items) {
1295
                splice (@orderitems, $i, 1) if ($orderitems[$i] == $_);
1304
                ModItemOrder($itemnumber, $new_ordernumber);
1296
            }
1305
            }
1297
        }
1306
        }
1298
        foreach (@orderitems) {
1299
            ModItemOrder($_, $newOrder);
1300
        }
1301
    } else {
1307
    } else {
1302
        $sth=$dbh->prepare("update aqorders
1308
        $sth=$dbh->prepare("update aqorders
1303
                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
1309
                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
Lines 1306-1313 sub ModReceiveOrder { Link Here
1306
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
1312
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
1307
        $sth->finish;
1313
        $sth->finish;
1308
    }
1314
    }
1309
    return $datereceived;
1315
    return ($datereceived, $new_ordernumber);
1310
}
1316
}
1317
1318
=head3 CancelReceipt
1319
1320
    my $parent_ordernumber = CancelReceipt($ordernumber);
1321
1322
    Cancel an order line receipt and update the parent order line, as if no
1323
    receipt was made.
1324
    If items are created at receipt (AcqCreateItem = receiving) then delete
1325
    these items.
1326
1327
=cut
1328
1329
sub CancelReceipt {
1330
    my $ordernumber = shift;
1331
1332
    return unless $ordernumber;
1333
1334
    my $dbh = C4::Context->dbh;
1335
    my $query = qq{
1336
        SELECT datereceived, parent_ordernumber, quantity
1337
        FROM aqorders
1338
        WHERE ordernumber = ?
1339
    };
1340
    my $sth = $dbh->prepare($query);
1341
    $sth->execute($ordernumber);
1342
    my $order = $sth->fetchrow_hashref;
1343
    unless($order) {
1344
        warn "CancelReceipt: order $ordernumber does not exist";
1345
        return;
1346
    }
1347
    unless($order->{'datereceived'}) {
1348
        warn "CancelReceipt: order $ordernumber is not received";
1349
        return;
1350
    }
1351
1352
    my $parent_ordernumber = $order->{'parent_ordernumber'};
1353
1354
    if($parent_ordernumber == $ordernumber || not $parent_ordernumber) {
1355
        # The order line has no parent, just mark it as not received
1356
        $query = qq{
1357
            UPDATE aqorders
1358
            SET quantityreceived = ?,
1359
                datereceived = ?,
1360
                booksellerinvoicenumber = ?
1361
            WHERE ordernumber = ?
1362
        };
1363
        $sth = $dbh->prepare($query);
1364
        $sth->execute(0, undef, undef, $ordernumber);
1365
    } else {
1366
        # The order line has a parent, increase parent quantity and delete
1367
        # the order line.
1368
        $query = qq{
1369
            SELECT quantity, datereceived
1370
            FROM aqorders
1371
            WHERE ordernumber = ?
1372
        };
1373
        $sth = $dbh->prepare($query);
1374
        $sth->execute($parent_ordernumber);
1375
        my $parent_order = $sth->fetchrow_hashref;
1376
        unless($parent_order) {
1377
            warn "Parent order $parent_ordernumber does not exist.";
1378
            return;
1379
        }
1380
        if($parent_order->{'datereceived'}) {
1381
            warn "CancelReceipt: parent order is received.".
1382
                " Can't cancel receipt.";
1383
            return;
1384
        }
1385
        $query = qq{
1386
            UPDATE aqorders
1387
            SET quantity = ?
1388
            WHERE ordernumber = ?
1389
        };
1390
        $sth = $dbh->prepare($query);
1391
        my $rv = $sth->execute(
1392
            $order->{'quantity'} + $parent_order->{'quantity'},
1393
            $parent_ordernumber
1394
        );
1395
        unless($rv) {
1396
            warn "Cannot update parent order line, so do not cancel".
1397
                " receipt";
1398
            return;
1399
        }
1400
        if(C4::Context->preference('AcqCreateItem') eq 'receiving') {
1401
            # Remove items that were created at receipt
1402
            $query = qq{
1403
                DELETE FROM items, aqorders_items
1404
                USING items, aqorders_items
1405
                WHERE items.itemnumber = ? AND aqorders_items.itemnumber = ?
1406
            };
1407
            $sth = $dbh->prepare($query);
1408
            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
1409
            foreach my $itemnumber (@itemnumbers) {
1410
                $sth->execute($itemnumber, $itemnumber);
1411
            }
1412
        } else {
1413
            # Update items
1414
            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
1415
            foreach my $itemnumber (@itemnumbers) {
1416
                ModItemOrder($itemnumber, $parent_ordernumber);
1417
            }
1418
        }
1419
        # Delete order line
1420
        $query = qq{
1421
            DELETE FROM aqorders
1422
            WHERE ordernumber = ?
1423
        };
1424
        $sth = $dbh->prepare($query);
1425
        $sth->execute($ordernumber);
1426
1427
    }
1428
1429
    return $parent_ordernumber;
1430
}
1431
1311
#------------------------------------------------------------#
1432
#------------------------------------------------------------#
1312
1433
1313
=head3 SearchOrder
1434
=head3 SearchOrder
Lines 1451-1456 sub GetParcel { Link Here
1451
                firstname,
1572
                firstname,
1452
                aqorders.biblionumber,
1573
                aqorders.biblionumber,
1453
                aqorders.ordernumber,
1574
                aqorders.ordernumber,
1575
                aqorders.parent_ordernumber,
1454
                aqorders.quantity,
1576
                aqorders.quantity,
1455
                aqorders.quantityreceived,
1577
                aqorders.quantityreceived,
1456
                aqorders.unitprice,
1578
                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') ? 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')
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 142-147 my ($template, $loggedinuser, $cookie) Link Here
142
                 debug => 1,
144
                 debug => 1,
143
});
145
});
144
146
147
if($op eq 'cancelreceipt') {
148
    my $ordernumber = $input->param('ordernumber');
149
    my $parent_ordernumber = CancelReceipt($ordernumber);
150
    unless($parent_ordernumber) {
151
        $template->param(error_cancelling_receipt => 1);
152
    }
153
}
154
145
# If receiving error, report the error (coming from finishrecieve.pl(sic)).
155
# If receiving error, report the error (coming from finishrecieve.pl(sic)).
146
if( scalar(@rcv_err) ) {
156
if( scalar(@rcv_err) ) {
147
	my $cnt=0;
157
	my $cnt=0;
(-)a/installer/data/mysql/kohastructure.sql (+1 lines)
Lines 2771-2776 CREATE TABLE `aqorders` ( -- information related to the basket line items Link Here
2771
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2771
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2772
  `claims_count` int(11) default 0, -- count of claim letters generated
2772
  `claims_count` int(11) default 0, -- count of claim letters generated
2773
  `claimed_date` date default NULL, -- last date a claim was generated
2773
  `claimed_date` date default NULL, -- last date a claim was generated
2774
  parent_ordernumber int(11) default NULL, -- ordernumber of parent order line, or same as ordernumber if no parent
2774
  PRIMARY KEY  (`ordernumber`),
2775
  PRIMARY KEY  (`ordernumber`),
2775
  KEY `basketno` (`basketno`),
2776
  KEY `basketno` (`basketno`),
2776
  KEY `biblionumber` (`biblionumber`),
2777
  KEY `biblionumber` (`biblionumber`),
(-)a/installer/data/mysql/updatedatabase.pl (+15 lines)
Lines 5635-5640 if(C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
5635
    SetVersion($DBversion);
5635
    SetVersion($DBversion);
5636
}
5636
}
5637
5637
5638
$DBversion = "XXX";
5639
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5640
    $dbh->do("
5641
        ALTER TABLE aqorders
5642
        ADD parent_ordernumber int(11) DEFAULT NULL
5643
    ");
5644
    $dbh->do("
5645
        UPDATE aqorders
5646
        SET parent_ordernumber = ordernumber;
5647
    ");
5648
    print "Upgrade to $DBversion done (Adding parent_ordernumber in aqorders)\n";
5649
    SetVersion($DBversion);
5650
}
5651
5652
5638
=head1 FUNCTIONS
5653
=head1 FUNCTIONS
5639
5654
5640
=head2 TableExists($table)
5655
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt (-1 / +19 lines)
Lines 224-229 Link Here
224
	[% END %]
224
	[% END %]
225
    [% END %]
225
    [% END %]
226
226
227
    [% IF (error_cancelling_receipt) %]
228
      <div class="error">
229
      Cannot cancel receipt. Possible reasons :
230
      <ul>
231
        <li>
232
          You are trying to cancel the receipt of an order line whose parent
233
          order line is already received. Cancel this parent order line and
234
          retry.
235
        </li>
236
        <li>Parent order line has been deleted.</li>
237
      </ul>
238
      </div>
239
    [% END %]
240
227
<div id="acqui_receive_summary">
241
<div id="acqui_receive_summary">
228
<p><strong>Invoice number:</strong> [% invoice %] <strong>Received by:</strong> [% loggedinusername %] <strong>On:</strong> [% formatteddatereceived %]</p>
242
<p><strong>Invoice number:</strong> [% invoice %] <strong>Received by:</strong> [% loggedinusername %] <strong>On:</strong> [% formatteddatereceived %]</p>
229
	<!-- TODO: Add date picker, change rcv date. -->
243
	<!-- TODO: Add date picker, change rcv date. -->
Lines 332-337 Link Here
332
<div id="acqui_receive_receivelist">
346
<div id="acqui_receive_receivelist">
333
    <h3>Already received</h3>
347
    <h3>Already received</h3>
334
348
349
335
   [% IF ( loop_received ) %]
350
   [% IF ( loop_received ) %]
336
   <form action="/cgi-bin/koha/acqui/parcel.pl" method="get" name="orderform">
351
   <form action="/cgi-bin/koha/acqui/parcel.pl" method="get" name="orderform">
337
    <table id="receivedt">
352
    <table id="receivedt">
Lines 345-350 Link Here
345
		<th>Est cost</th>
360
		<th>Est cost</th>
346
		<th>Actual cost</th>
361
		<th>Actual cost</th>
347
		<th>TOTAL</th>
362
		<th>TOTAL</th>
363
        <th></th>
348
	    </tr>
364
	    </tr>
349
    </thead>
365
    </thead>
350
    <tfoot>
366
    <tfoot>
Lines 353-358 Link Here
353
		<td colspan="2">&nbsp;</td>
369
		<td colspan="2">&nbsp;</td>
354
		<td>[% totalprice %]</td>
370
		<td>[% totalprice %]</td>
355
		<td>[% tototal %]</td>
371
		<td>[% tototal %]</td>
372
        <td></td>
356
	    </tr>
373
	    </tr>
357
	      
374
	      
358
	      [% IF ( totalfreight ) %]
375
	      [% IF ( totalfreight ) %]
Lines 380-385 Link Here
380
		<td>[% totalquantity %]</td>
397
		<td>[% totalquantity %]</td>
381
		<td colspan="2">&nbsp;</td>
398
		<td colspan="2">&nbsp;</td>
382
		<td>[% grandtot %]</td>
399
		<td>[% grandtot %]</td>
400
        <td></td>
383
	    </tr>
401
	    </tr>
384
    </tfoot>
402
    </tfoot>
385
	<tbody class="filterclass">
403
	<tbody class="filterclass">
Lines 402-407 Link Here
402
                <td>[% loop_receive.ecost %]</td>
420
                <td>[% loop_receive.ecost %]</td>
403
                <td>[% loop_receive.unitprice %]</td>
421
                <td>[% loop_receive.unitprice %]</td>
404
                <td>[% loop_receive.total %]</td>
422
                <td>[% loop_receive.total %]</td>
423
                <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>
405
            </tr>
424
            </tr>
406
	    [% END %]
425
	    [% END %]
407
	</tbody>
426
	</tbody>
408
- 

Return to bug 7583