Bug 12601: Add a foreign key for aqorders.budget_id
When creating an order, the fund value is mandatory but the DB structure does not show this constraint. The aqorders.budget_id field should be linked to aqbudgets.budget_id. The updatedatabase.pl (entry 3.01.00.077) commented this constraint, certainly for a retro compatibility reason. Actually I found some cases (in production) where aqorders.budget_id is set to "0". To add this constraint, we should add a temporary fund to linked orphan orders. Test plan: 0/ Verify it is not possible to create an order not linked to a fund via the Koha interface. 1/ Using your SQL CLI (or equivalent), create or update 1+ orders and set "0" in the budget_id field. 2/ Execute the updatedabase script. 3/ Verify that your order is linked to a new fund (which is linked to a new budget). 4/ Verify the constraint has correctly been added (show create table aqorders). Signed-off-by: Paola Rossi <paola.rossi@cineca.it> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
parent
6fd9c90901
commit
135f98ee62
|
|
@ -3080,6 +3080,7 @@ CREATE TABLE `aqorders` ( -- information related to the basket line items
|
|||
KEY `basketno` (`basketno`),
|
||||
KEY `biblionumber` (`biblionumber`),
|
||||
KEY `budget_id` (`budget_id`),
|
||||
CONSTRAINT `aqorders_budget_id_fk` FOREIGN KEY (`budget_id`) REFERENCES `aqbudgets` (`budget_id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `aqorders_ibfk_1` FOREIGN KEY (`basketno`) REFERENCES `aqbasket` (`basketno`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `aqorders_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT aqorders_ibfk_3 FOREIGN KEY (invoiceid) REFERENCES aqinvoices (invoiceid) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
|
|
|
|||
|
|
@ -9691,6 +9691,49 @@ if ( CheckVersion($DBversion) ) {
|
|||
SetVersion($DBversion);
|
||||
}
|
||||
|
||||
|
||||
|
||||
$DBversion = "3.17.00.XXX";
|
||||
if ( CheckVersion($DBversion) ) {
|
||||
my $number_of_orders_not_linked = $dbh->selectcol_arrayref(q|
|
||||
SELECT COUNT(*)
|
||||
FROM aqorders o
|
||||
WHERE NOT EXISTS (
|
||||
SELECT NULL
|
||||
FROM aqbudgets b
|
||||
WHERE b.budget_id = o.budget_id
|
||||
);
|
||||
|);
|
||||
|
||||
if ( $number_of_orders_not_linked->[0] > 0 ) {
|
||||
$dbh->do(q|
|
||||
INSERT INTO aqbudgetperiods(budget_period_startdate, budget_period_enddate, budget_period_active, budget_period_description, budget_period_total) VALUES ( CAST(NOW() AS date), CAST(NOW() AS date), 0, "WARNING: This budget has been automatically created by the updatedatabase script, please see bug 12601 for more information", 0)
|
||||
|);
|
||||
my $budget_period_id = $dbh->last_insert_id( undef, undef, 'aqbudgetperiods', undef );
|
||||
$dbh->do(qq|
|
||||
INSERT INTO aqbudgets(budget_code, budget_name, budget_amount, budget_period_id) VALUES ( "BACKUP_TMP", "WARNING: fund created by the updatedatabase script, please see bug 12601", 0, $budget_period_id );
|
||||
|);
|
||||
my $budget_id = $dbh->last_insert_id( undef, undef, 'aqbudgets', undef );
|
||||
$dbh->do(qq|
|
||||
UPDATE aqorders o
|
||||
SET budget_id = $budget_id
|
||||
WHERE NOT EXISTS (
|
||||
SELECT NULL
|
||||
FROM aqbudgets b
|
||||
WHERE b.budget_id = o.budget_id
|
||||
)
|
||||
|);
|
||||
}
|
||||
|
||||
$dbh->do(q|
|
||||
ALTER TABLE aqorders
|
||||
ADD CONSTRAINT aqorders_budget_id_fk FOREIGN KEY (budget_id) REFERENCES aqbudgets(budget_id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
|);
|
||||
|
||||
print "Upgrade to $DBversion done (Bug 12601 - Add new foreign key aqorders.budget_id" . ( ( $number_of_orders_not_linked->[0] > 0 ) ? ' WARNING: temporary budget and fund have been created (search for "BACKUP_TMP"). At least one of your order was not linked to a budget' : '' ) . ")\n";
|
||||
SetVersion($DBversion);
|
||||
}
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=head2 TableExists($table)
|
||||
|
|
|
|||
|
|
@ -620,6 +620,7 @@ var MSG_PARENT_BENEATH_BUDGET = "- " + _("New budget-parent is beneath budget")
|
|||
|
||||
[% IF op == 'delete_confirm' %]
|
||||
<div class="dialog alert"> <h3>Delete fund [% budget_name %]?</h3>
|
||||
If you delete this fund, all orders linked to this fund will be deleted!
|
||||
<table>
|
||||
<tr>
|
||||
<th scope="row">Fund amount:</th>
|
||||
|
|
|
|||
Loading…
Reference in New Issue