From 5e6ed6ffaeacfbb7aadd7cf0ae11b496ad40196d Mon Sep 17 00:00:00 2001 From: Bertrand Chenal Date: Fri, 27 Mar 2009 17:11:46 +0100 Subject: [PATCH] Added restocking reports --- customer_return_restocking_list.odt | Bin 0 -> 9265 bytes packing.py | 100 ++++++++++++++++++++++++++++ packing.xml | 28 ++++++++ supplier_restocking_list.odt | Bin 0 -> 9257 bytes 4 files changed, 128 insertions(+) create mode 100644 customer_return_restocking_list.odt create mode 100644 supplier_restocking_list.odt diff --git a/customer_return_restocking_list.odt b/customer_return_restocking_list.odt new file mode 100644 index 0000000000000000000000000000000000000000..88db4a027270e2914caba3329fd810682e658965 GIT binary patch literal 9265 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 literal 0 HcmV?d00001 diff --git a/packing.py b/packing.py index 1852828732..001796ab06 100644 --- a/packing.py +++ b/packing.py @@ -1593,3 +1593,103 @@ class PickingList(CompanyReport): to_location_ids.index(move.to_location.id)] PickingList() + + +class SupplierRestockingList(CompanyReport): + _name = 'stock.packing.in.restocking_list' + + def parse(self, cursor, user, report, objects, datas, context): + move_obj = self.pool.get('stock.move') + packing_in_obj = self.pool.get('stock.packing.in') + + compare_context = self.get_compare_context( + cursor, user, report, objects, datas, context) + + sorted_moves = {} + for packing in objects: + sorted_moves[packing.id] = sorted( + packing.inventory_moves, + lambda x,y: cmp(self.get_compare_key(x, compare_context), + self.get_compare_key(y, compare_context)) + ) + + context['moves'] = sorted_moves + + return super(SupplierRestockingList, self).parse(cursor, user, report, + objects, datas, context) + + def get_compare_context(self, cursor, user, report, objects, datas, context): + location_obj = self.pool.get('stock.location') + from_location_ids = set() + to_location_ids = set() + for obj in objects: + for move in obj.inventory_moves: + from_location_ids.add(move.from_location.id) + to_location_ids.add(move.to_location.id) + + from_location_ids = location_obj.search( + cursor, user, list(from_location_ids), context=context) + to_location_ids = location_obj.search( + cursor, user, list(to_location_ids), context=context) + + return {'from_location_ids' : from_location_ids, + 'to_location_ids' : to_location_ids} + + + def get_compare_key(self, move, compare_context): + from_location_ids = compare_context['from_location_ids'] + to_location_ids = compare_context['to_location_ids'] + return [from_location_ids.index(move.from_location.id), + to_location_ids.index(move.to_location.id)] + +SupplierRestockingList() + + +class CustomerReturnRestockingList(CompanyReport): + _name = 'stock.packing.out.return.restocking_list' + + def parse(self, cursor, user, report, objects, datas, context): + move_obj = self.pool.get('stock.move') + packing_in_obj = self.pool.get('stock.packing.out.return') + + compare_context = self.get_compare_context( + cursor, user, report, objects, datas, context) + + sorted_moves = {} + for packing in objects: + sorted_moves[packing.id] = sorted( + packing.inventory_moves, + lambda x,y: cmp(self.get_compare_key(x, compare_context), + self.get_compare_key(y, compare_context)) + ) + + context['moves'] = sorted_moves + + return super(CustomerReturnRestockingList, self).parse( + cursor, user, report, objects, datas, context) + + def get_compare_context(self, cursor, user, report, objects, datas, context): + location_obj = self.pool.get('stock.location') + from_location_ids = set() + to_location_ids = set() + for obj in objects: + for move in obj.inventory_moves: + from_location_ids.add(move.from_location.id) + to_location_ids.add(move.to_location.id) + + from_location_ids = location_obj.search( + cursor, user, list(from_location_ids), context=context) + to_location_ids = location_obj.search( + cursor, user, list(to_location_ids), context=context) + + return {'from_location_ids' : from_location_ids, + 'to_location_ids' : to_location_ids} + + + def get_compare_key(self, move, compare_context): + from_location_ids = compare_context['from_location_ids'] + to_location_ids = compare_context['to_location_ids'] + return [from_location_ids.index(move.from_location.id), + to_location_ids.index(move.to_location.id)] + +CustomerReturnRestockingList() diff --git a/packing.xml b/packing.xml index db87cb4bf0..8c815b39d7 100644 --- a/packing.xml +++ b/packing.xml @@ -1043,6 +1043,34 @@ this repository contains the full copyright notices and license terms. --> + + Restocking List + stock.packing.in + stock.packing.in.restocking_list + stock/supplier_restocking_list.odt + company/header_A4.odt + + + form_print + stock.packing.in,0 + + + + + Restocking List + stock.packing.out.return + stock.packing.out.return.restocking_list + stock/customer_return_restocking_list.odt + company/header_A4.odt + + + form_print + stock.packing.out.return,0 + + + diff --git a/supplier_restocking_list.odt b/supplier_restocking_list.odt new file mode 100644 index 0000000000000000000000000000000000000000..2912be482179d446fe3b74ca1ffb8dceacd81375 GIT binary patch literal 9257 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 k