From 70ae5ea8049c0d4fa04e18804ac92f09efba9c74 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Tue, 10 Feb 2026 14:53:13 +0700 Subject: [PATCH] first commit --- __init__.py | 1 + __manifest__.py | 18 ++++ __pycache__/__init__.cpython-312.pyc | Bin 0 -> 209 bytes models/__init__.py | 2 + models/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 267 bytes .../approval_category.cpython-312.pyc | Bin 0 -> 1045 bytes .../approval_request.cpython-312.pyc | Bin 0 -> 5018 bytes models/approval_category.py | 12 +++ models/approval_request.py | 86 ++++++++++++++++++ views/approval_request_views.xml | 26 ++++++ 10 files changed, 145 insertions(+) create mode 100644 __init__.py create mode 100644 __manifest__.py create mode 100644 __pycache__/__init__.cpython-312.pyc create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/approval_category.cpython-312.pyc create mode 100644 models/__pycache__/approval_request.cpython-312.pyc create mode 100644 models/approval_category.py create mode 100644 models/approval_request.py create mode 100644 views/approval_request_views.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/__manifest__.py b/__manifest__.py new file mode 100644 index 0000000..394cd0e --- /dev/null +++ b/__manifest__.py @@ -0,0 +1,18 @@ +{ + 'name': 'Approval Create WH to Prep Move', + 'version': '1.0', + 'category': 'Inventory/Approvals', + 'summary': 'Create Inventory Transfer from Approval Request', + 'description': """ + This module adds a new approval type "Create WH to Prep Move" to the Approvals app. + When approved, it allows users to create an inventory transfer with the operation + "Brigjend Katamso: WH to Prep (Send)" and destination "Physical Locations/Inter-warehouse transit". + """, + 'depends': ['approvals', 'stock'], + 'data': [ + 'views/approval_request_views.xml', + ], + 'installable': True, + 'application': False, + 'license': 'LGPL-3', +} diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73a2a8658cbcb099e5ec168968a99de8bcc3a34a GIT binary patch literal 209 zcmX@j%ge<81e5M`Wr_mn#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r6;%!kUb? z*mCnzQge#^G?{KO6fpzERx*4B>HOuVpOK%Ns$X21ky?~esUJ{Tl98X63{5bWMP@Wp}VqVXmUhJxrHh>6K1!?M%33p?9m&+N(kg0bK?_$~gyp(aLV z!etlP3wj+?R~6NdxA}Y@w4UFex@+xUllZUVkF1ZCynq9TJ$PIoPP|ZFEDD5NR4M2+8q||@nrPWHyL$KhQwq*u-psuDX1|%)_c@y#0F)2k-#G6T zfS=NdMeiEz$7r;G0#z#DDwg7^mg;Jjrhp1hfvTH8HKvtQF|c>;XdTrvT-dEgf&*|QjHj>sAbdb zN2prRfHI!vg(@$`0r((Q8$eFcktgwygb?C{=egX4NO87ScQ~Vl#^uOFx@7yv+@tkk zATrWftJ~GU2|{F>K(;HsteZbsHcOt%Out@YoQCE?7?iwf5f^28)bnoNGmCXU@LcT5 ztNP|?UuWlHcJ|u4j0ZSb3&kaZtf literal 0 HcmV?d00001 diff --git a/models/__pycache__/approval_request.cpython-312.pyc b/models/__pycache__/approval_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..027366790fc6f8a1bf63fd215eedd6280f8a3602 GIT binary patch literal 5018 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 0: + return + + op_type_name = "Brigjend Katamso: WH to Prep (Send)" + dest_loc_name = "Physical Locations/Inter-warehouse transit" + + # Find Operation Type + picking_type = self.env['stock.picking.type'].search([('name', '=', op_type_name)], limit=1) + if not picking_type: + # Fallback: search by display_name if name isn't exact + picking_types = self.env['stock.picking.type'].search([]) + for pt in picking_types: + if op_type_name in pt.display_name: + picking_type = pt + break + + if not picking_type: + raise UserError(_("Operation Type '%s' not found. Please contact administrator.") % op_type_name) + + # Find Destination Location + dest_loc = self.env['stock.location'].search([('complete_name', '=', dest_loc_name)], limit=1) + if not dest_loc: + raise UserError(_("Destination Location '%s' not found. Please contact administrator.") % dest_loc_name) + + if not self.product_line_ids: + raise UserError(_("You must select products to create a transfer.")) + + picking_vals = { + 'picking_type_id': picking_type.id, + 'location_id': picking_type.default_location_src_id.id, + 'location_dest_id': dest_loc.id, + 'origin': self.name, + 'partner_id': self.partner_id.id, + 'move_ids': [], + } + + for line in self.product_line_ids: + move_vals = { + 'description_picking': line.description, + 'product_id': line.product_id.id, + 'product_uom_qty': line.quantity, + 'product_uom': line.product_uom_id.id, + 'location_id': picking_type.default_location_src_id.id, + 'location_dest_id': dest_loc.id, + } + picking_vals['move_ids'].append((0, 0, move_vals)) + + picking = self.env['stock.picking'].create(picking_vals) + picking.action_confirm() # Confirm the picking to reserve stock if possible + + msg = Markup(_("Created Inventory Transfer: %s")) % (picking.id, picking.name) + self.message_post(body=msg) + + def action_open_wh_prep_move(self): + self.ensure_one() + action = { + 'name': _('Transfers'), + 'type': 'ir.actions.act_window', + 'res_model': 'stock.picking', + 'view_mode': 'list,form', + 'domain': [('origin', '=', self.name)], + 'context': clean_context(self.env.context), + } + return action diff --git a/views/approval_request_views.xml b/views/approval_request_views.xml new file mode 100644 index 0000000..ca76e3c --- /dev/null +++ b/views/approval_request_views.xml @@ -0,0 +1,26 @@ + + + + approval.wh.prep.move.request.view.form.inherit + approval.request + + + + + + +