Skip to content

Commit

Permalink
documents: allow delete of documents with orderln.
Browse files Browse the repository at this point in the history
* Closes #3225.
* Allows deletion of documents with acquisition order lines with status
  recieved or cancelled.

Co-Authored-by: Peter Weber <[email protected]>
  • Loading branch information
rerowep committed Jan 29, 2025
1 parent cb518ed commit 2d01ef7
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 21 deletions.
54 changes: 35 additions & 19 deletions rero_ils/modules/acquisition/acq_order_lines/dumpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from rero_ils.modules.acquisition.dumpers import document_acquisition_dumper
from rero_ils.modules.commons.identifiers import IdentifierType
from rero_ils.modules.documents.extensions import TitleExtension
from rero_ils.modules.utils import extracted_data_from_ref


class AcqOrderLineESDumper(InvenioRecordsDumper):
Expand Down Expand Up @@ -58,17 +59,20 @@ def dump(self, record, data):

# Add document information's: pid, formatted title and ISBN
# identifiers (remove None values from document metadata)
document = record.document
identifiers = document.get_identifiers(
filters=[IdentifierType.ISBN], with_alternatives=True
)
identifiers = [identifier.normalize() for identifier in identifiers]
if document := record.document:
identifiers = document.get_identifiers(
filters=[IdentifierType.ISBN], with_alternatives=True
)
identifiers = [identifier.normalize() for identifier in identifiers]

data["document"] = {
"pid": document.pid,
"title": TitleExtension.format_text(document.get("title", [])),
"identifiers": identifiers,
}
data["document"] = {
"pid": document.pid,
"title": TitleExtension.format_text(document.get("title", [])),
"identifiers": identifiers,
}
else:
doc_pid = extracted_data_from_ref(record.get("document"), data="pid")
data["document"] = {"pid": doc_pid, "title": f"pid: {doc_pid}"}
data["document"] = {k: v for k, v in data["document"].items() if v}
return data

Expand All @@ -83,14 +87,26 @@ def dump(self, record, data):
:param data: The initial dump data passed in by ``record.dumps()``.
"""
# Dumps AcqOrderLine acquisition
data.update(
{
"quantity": record.get("quantity"),
"amount": record.get("amount"),
"note": record.get_note(AcqOrderLineNoteType.VENDOR),
"account": record.account.dumps(dumper=AcqAccountGenericDumper()),
"document": record.document.dumps(dumper=document_acquisition_dumper),
}
)
if document := record.document:
data.update(
{
"quantity": record.get("quantity"),
"amount": record.get("amount"),
"note": record.get_note(AcqOrderLineNoteType.VENDOR),
"account": record.account.dumps(dumper=AcqAccountGenericDumper()),
"document": document.dumps(dumper=document_acquisition_dumper),
}
)
else:
doc_pid = extracted_data_from_ref(record.get("document"), data="pid")
data.update(
{
"quantity": record.get("quantity"),
"amount": record.get("amount"),
"note": record.get_note(AcqOrderLineNoteType.VENDOR),
"account": record.account.dumps(dumper=AcqAccountGenericDumper()),
"document": {"pid": doc_pid, "title": f"pid: {doc_pid}"},
}
)
data = {k: v for k, v in data.items() if v}
return data
12 changes: 10 additions & 2 deletions rero_ils/modules/documents/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from jsonschema.exceptions import ValidationError

from rero_ils.modules.acquisition.acq_order_lines.api import AcqOrderLinesSearch
from rero_ils.modules.acquisition.acq_order_lines.models import AcqOrderLineStatus
from rero_ils.modules.api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch
from rero_ils.modules.commons.identifiers import IdentifierFactory, IdentifierType
from rero_ils.modules.fetchers import id_fetcher
Expand Down Expand Up @@ -319,8 +320,15 @@ def get_links_to_me(self, get_pids=False):
exclude_states=[LoanState.CANCELLED, LoanState.ITEM_RETURNED],
)
file_query = self.get_records_files_query().source()
acq_order_lines_query = AcqOrderLinesSearch().filter(
"term", document__pid=self.pid
status_list = [
AcqOrderLineStatus.APPROVED,
AcqOrderLineStatus.ORDERED,
AcqOrderLineStatus.PARTIALLY_RECEIVED,
]
acq_order_lines_query = (
AcqOrderLinesSearch()
.filter("term", document__pid=self.pid)
.filter("terms", status=status_list)
)
local_fields_query = LocalFieldsSearch().get_local_fields(
self.provider.pid_type, self.pid
Expand Down
5 changes: 5 additions & 0 deletions tests/api/acquisition/test_acquisition_reception_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def test_acquisition_reception_workflow(
document,
):
"""Test complete acquisition workflow."""
assert document.get_links_to_me() == {}

def assert_account_data(accounts):
"""assert account informations."""
Expand Down Expand Up @@ -285,6 +286,8 @@ def assert_account_data(accounts):
}
assert_account_data(manual_controls)

assert document.get_links_to_me() == {"acq_order_lines": 6}

# STEP 3 :: UPDATE ORDER LINES
# * Cancel some order lines and change some quantities --> make sure
# calculations still good
Expand Down Expand Up @@ -362,6 +365,8 @@ def assert_account_data(accounts):
assert order_line_1.unreceived_quantity == 5
assert order_line_1.status == AcqOrderLineStatus.APPROVED

assert document.get_links_to_me() == {"acq_order_lines": 4}

# STEP 4 :: SEND THE ORDER
# * Test send order and make sure statuses are up to date.
# - check order lines (status, order-date)
Expand Down

0 comments on commit 2d01ef7

Please sign in to comment.