From 7bf20bafa863de4d44933f81ad2989174734cc13 Mon Sep 17 00:00:00 2001 From: Julien Aldon Date: Mon, 9 Mar 2026 09:32:56 +0100 Subject: [PATCH] fix sort order for contract recap --- backend/src/contracts/contracts.py | 5 ++++- backend/src/contracts/generate_contract.py | 26 +++++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/backend/src/contracts/contracts.py b/backend/src/contracts/contracts.py index a7cedad..ddc4ca0 100644 --- a/backend/src/contracts/contracts.py +++ b/backend/src/contracts/contracts.py @@ -268,8 +268,11 @@ def get_contract_recap( form = form_service.get_one(session, form_id=form_id) contracts = service.get_all(session, user, forms=[form.name]) filename = f'{form.name}_recapitulatif_contrats.ods' + recap = generate_recap(contracts, form) + if recap is None: + raise HTTPException(status_code=404) return StreamingResponse( - io.BytesIO(generate_recap(contracts, form)), + io.BytesIO(recap), media_type='application/vnd.oasis.opendocument.spreadsheet', headers={ 'Content-Disposition': ( diff --git a/backend/src/contracts/generate_contract.py b/backend/src/contracts/generate_contract.py index 6da025d..c499941 100644 --- a/backend/src/contracts/generate_contract.py +++ b/backend/src/contracts/generate_contract.py @@ -412,20 +412,34 @@ def generate_recap( '2': 'Kg', '3': 'Piece' } + if len(contracts) <= 0: + # TODO: raise correct exception + return None + first_contract = contracts[0] + reccurents_sorted = sorted( + [ + product for product in first_contract.products + if product.product.type == models.ProductType.RECCURENT + ], + key=lambda x: x.product.name + ) recurrents = [ f'{pr.name}{f' - {pr.quantity}{pr.quantity_unit}' if pr.quantity else ''} ({product_unit_map[pr.unit]})' - for pr in form.productor.products - if pr.type == models.ProductType.RECCURENT + for pr in reccurents_sorted ] - recurrents.sort() + occasionnals_sorted = sorted( + [ + product for product in first_contract.products + if product.product.type == models.ProductType.OCCASIONAL + ], + key=lambda x: (x.shipment.name, x.product.name) + ) occasionnals = [ f'{pr.name}{f' - {pr.quantity}{pr.quantity_unit}' if pr.quantity else ''} ({product_unit_map[pr.unit]})' - for pr in form.productor.products - if pr.type == models.ProductType.OCCASIONAL + for pr in occasionnals_sorted ] - occasionnals.sort() shipments = form.shipments occasionnals_header = [ occ for shipment in shipments for occ in occasionnals