TIP: You can type at any time to perform a new search.
Purchase Request
purchase_request · OCA/purchase-workflow
- Repository
- OCA/purchase-workflow · module folder · Try on Runboat
- Module version
- 1.0.2
- Category
- Purchase Management
- Folder size
- 4.09 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://github.com/OCA/purchase-workflow
- Last tracking update
- 2026-08-17 18:05:56
- Authors
- Odoo Community Association (OCA), ForgeFlow
- Maintainers
- Odoo Community Association (OCA), ForgeFlow
- Committers
- David Vidal, Weblate, OCA-git-bot, oca-ci, Hector Vior, Bhavesh Heliconia, mav-adhoc
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- purchase_request_tier_validation
- Description
You use this module if you wish to give notification of requirements of materials and/or external services and keep track of such requirements. Requests can be created either directly or indirectly. "Directly" means that someone from the requesting department enters a purchase request manually. The person creating the request determines what and how much to order, and the requested date. "Indirectly" means that the purchase request initiated by the application automatically, for example, from procurement orders (MO, SO). A purchase request is an instruction to Purchasing to procure a certain quantity of materials services, so that they are available at a certain point in time. A line of a request contains the quantity and requested date of the material to be supplied or the quantity of the service to be performed. You can indicate the service specifications if needed. Once request is approved go to the Purchase Request Lines from the menu entry 'Purchase Requests', and also from the 'Purchase' menu. Select the lines that you wish to initiate the RFQ for, then go to 'More' and press 'Create RFQ'. You can choose to select an existing RFQ or create a new one. In the later, you have to choose a supplier. In case that you chose to select an existing RFQ, the application will search for existing lines matching the request line, and will add the extra quantity to them, recalculating the minimum order quantity, if it exists for the supplier of that RFQ. In case that you create a new RFQ, the request lines will also be consolidated into as few as possible lines in the RFQ.
Code Analysis ⓘ
Views touched (20)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_template_form_view_inherit |
product.template.form.inherit | product.template | form | Inherits stock.view_template_property_form |
purchase_order_form |
purchase.order.form | purchase.order | form | Inherits purchase.purchase_order_form |
purchase_order_line_form2 |
purchase.order.line.form2 | purchase.order.line | Inherits purchase.purchase_order_line_form2 | |
purchase_order_line_form2_sub |
purchase.order.line.form2 | purchase.order.line | form | New |
purchase_order_line_search_sub |
purchase.order.line.search | purchase.order.line | search | New |
purchase_order_line_tree |
purchase.order.line.list | purchase.order.line | list | Inherits purchase.purchase_order_line_tree |
purchase_order_line_tree_sub |
purchase.order.line.list | purchase.order.line | list | New |
purchase_request_allocation |
purchase.request.allocation | purchase.request.allocation | list | New |
purchase_request_line_form |
purchase.request.line.form | purchase.request.line | form | New |
purchase_request_line_search |
purchase.request.line.search | purchase.request.line | search | New |
purchase_request_line_tree |
purchase.request.line.list | purchase.request.line | list | New |
report_purchase_request |
report_purchase_request | ir.ui.view | qweb | New |
view_move_form |
stock.move.form | stock.move | form | Inherits stock.view_move_form |
view_purchase_request_form |
purchase.request.form | purchase.request | form | New |
view_purchase_request_kanban |
purchase.request.kanban | purchase.request | kanban | New |
view_purchase_request_line_details |
purchase.request.line.details.form | purchase.request.line | form | New |
view_purchase_request_line_make_purchase_order |
Purchase Request Line Make Purchase Order | purchase.request.line.make.purchase.order | form | New |
view_purchase_request_search |
purchase.request.list.select | purchase.request | search | New |
view_purchase_request_tree |
purchase.request.list | purchase.request | list | New |
view_stock_move_operations |
stock.move.operations.form | stock.move | form | Inherits stock.view_stock_move_operations |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (12)
New fields (1)
-
purchase_requestBooleancompany_dependent=Truehelp='Check this box to generate Purchase Request instead of generating Requests For Quotation from procurement.'
No public methods.
New fields (0)
No new fields.
Public methods (2)-
button_confirm(self) -
unlink(self)
New fields (2)
-
purchase_request_allocation_idsOne2many → purchase.request.allocationcomodel_name='purchase.request.allocation'copy=Falseinverse_name='purchase_line_id' -
purchase_request_linesMany2many → purchase.request.linecolumn1='purchase_order_line_id'column2='purchase_request_line_id'comodel_name='purchase.request.line'copy=Falsereadonly=Truerelation='purchase_request_purchase_order_line_rel'
-
action_open_request_line_tree_view(self):return dict: dictionary value for created view -
update_service_allocations(self, prev_qty_received) -
write(self, vals)
New fields (19)
-
assigned_toMany2one → res.userscomodel_name='res.users'domain=<expr>index=Truestring='Approver'tracking=True -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=Falsetracking=True -
currency_idMany2onereadonly=Truerelated='company_id.currency_id' -
date_startDatedefault=fields.Date.context_todayhelp='Date when the user initiated the request.'string='Creation date'tracking=True -
descriptionText -
estimated_costMonetarycompute='_compute_estimated_cost'store=Truestring='Total Estimated Cost' -
is_editableBooleancompute='_compute_is_editable'readonly=True -
is_name_editableBooleandefault=<expr> -
line_countIntegercompute='_compute_line_count'readonly=Truestring='Purchase Request Line count' -
line_idsOne2many → purchase.request.linecomodel_name='purchase.request.line'copy=Trueinverse_name='request_id'readonly=Falsestring='Products to Purchase'tracking=True -
move_countIntegercompute='_compute_move_count'readonly=Truestring='Stock Move count' -
nameChardefault=<expr>required=Truestring='Request Reference'tracking=True -
originCharstring='Source Document' -
picking_type_idMany2one → stock.picking.typecomodel_name='stock.picking.type'default=<expr>required=True -
product_idMany2one → product.productcomodel_name='product.product'readonly=Truerelated='line_ids.product_id'string='Product' -
purchase_countIntegercompute='_compute_purchase_count'readonly=Truestring='Purchases count' -
requested_byMany2one → res.userscomodel_name='res.users'copy=Falsedefault=<expr>index=Truerequired=Truetracking=True -
stateSelectioncopy=Falsedefault='draft'index=Truerequired=Trueselection=_STATESstring='Status'tracking=True -
to_approve_allowedBooleancompute='_compute_to_approve_allowed'
-
action_view_purchase_order(self) -
action_view_purchase_request_line(self) -
action_view_stock_picking(self) -
button_approved(self) -
button_done(self) -
button_draft(self) -
button_in_progress(self) -
button_rejected(self) -
button_to_approve(self) -
check_auto_reject(self)When all lines are cancelled the purchase request should be auto-rejected. -
copy(self, default=None) -
create(self, vals_list)@api.model_create_multi -
to_approve_allowed_check(self) -
write(self, vals)
New fields (10)
-
allocated_product_qtyFloatcopy=Falsehelp='Quantity of the purchase request line allocated to the stockmove, in the default UoM of the product'string='Allocated Quantity' -
company_idMany2one → res.companycomodel_name='res.company'index=Truereadonly=Truerelated='purchase_request_line_id.request_id.company_id'store=True -
open_product_qtyFloatcompute='_compute_open_product_qty'string='Open Quantity' -
product_idMany2one → product.productcomodel_name='product.product'readonly=Truerelated='purchase_request_line_id.product_id'string='Product' -
product_uom_idMany2one → uom.uomcomodel_name='uom.uom'readonly=Truerelated='purchase_request_line_id.product_uom_id'required=Truestring='UoM' -
purchase_line_idMany2one → purchase.order.linecomodel_name='purchase.order.line'copy=Truehelp='Service Purchase Order Line'index=Trueondelete='cascade' -
purchase_request_line_idMany2one → purchase.request.linecomodel_name='purchase.request.line'copy=Trueindex=Trueondelete='cascade'required=True -
purchase_stateSelectionrelated='purchase_line_id.state' -
requested_product_uom_qtyFloathelp='Quantity of the purchase request line allocated to thestock move, in the UoM of the Purchase Request Line'string='Requested Quantity' -
stock_move_idMany2one → stock.movecomodel_name='stock.move'index=Trueondelete='cascade'
No public methods.
New fields (30)
-
assigned_toMany2one → res.userscomodel_name='res.users'related='request_id.assigned_to'store=Truestring='Assigned to' -
cancelledBooleancopy=Falsedefault=Falsereadonly=True -
company_idMany2one → res.companycomodel_name='res.company'index=Truerelated='request_id.company_id'store=Truestring='Company' -
currency_idMany2onereadonly=Truerelated='company_id.currency_id' -
date_requiredDatedefault=fields.Date.context_todayrequired=Truestring='Request Date'tracking=True -
date_startDaterelated='request_id.date_start'store=True -
descriptionTextreadonly=Falserelated='request_id.description'store=Truestring='PR Description' -
estimated_costMonetarycurrency_field='currency_id'default=0.0help='Estimated cost of Purchase Request Line, not propagated to PO.' -
is_editableBooleancompute='_compute_is_editable'readonly=True -
move_dest_idsOne2many → stock.movecomodel_name='stock.move'inverse_name='created_purchase_request_line_id'string='Downstream Moves' -
nameCharstring='Description'tracking=True -
orderpoint_idMany2one → stock.warehouse.orderpointcomodel_name='stock.warehouse.orderpoint' -
originCharrelated='request_id.origin'store=Truestring='Source Document' -
pending_qty_to_receiveFloatcompute='_compute_qty_to_buy'copy=Falsedigits='Product Unit of Measure'store=Truestring='Pending Qty to Receive' -
product_idMany2one → product.productcomodel_name='product.product'domain=[('purchase_ok', '=', True)]tracking=True -
product_qtyFloatdigits='Product Unit of Measure'string='Quantity'tracking=True -
product_uom_idMany2one → uom.uomcomodel_name='uom.uom'string='UoM'tracking=True -
purchase_linesMany2many → purchase.order.linecolumn1='purchase_request_line_id'column2='purchase_order_line_id'comodel_name='purchase.order.line'copy=Falsereadonly=Truerelation='purchase_request_purchase_order_line_rel'string='Purchase Order Lines' -
purchase_request_allocation_idsOne2many → purchase.request.allocationcomodel_name='purchase.request.allocation'inverse_name='purchase_request_line_id' -
purchase_stateSelectioncompute='_compute_purchase_state'selection=<expr>store=Truestring='Purchase Status' -
purchased_qtyFloatcompute='_compute_purchased_qty'digits='Product Unit of Measure'string='RFQ/PO Qty' -
qty_cancelledFloatcompute='_compute_qty_cancelled'digits='Product Unit of Measure'help='Quantity cancelled'readonly=Truestore=True -
qty_doneFloatcompute='_compute_qty'digits='Product Unit of Measure'help='Quantity completed'readonly=Truestore=True -
qty_in_progressFloatcompute='_compute_qty'digits='Product Unit of Measure'help='Quantity in progress.'readonly=Truestore=True -
qty_to_buyBooleancompute='_compute_qty_to_buy'store=Truestring='There is some pending qty to buy' -
request_idMany2one → purchase.requestcomodel_name='purchase.request'index=Trueondelete='cascade'readonly=Truestring='Purchase Request' -
request_stateSelectionrelated='request_id.state'store=Truestring='Request state' -
requested_byMany2one → res.userscomodel_name='res.users'related='request_id.requested_by'store=Truestring='Requested by' -
specificationsText -
supplier_idMany2one → res.partnercomodel_name='res.partner'compute='_compute_supplier_id'compute_sudo=Truestore=Truestring='Preferred supplier'
-
action_show_details(self) -
do_cancel(self)Actions to perform when cancelling a purchase request line. -
do_uncancel(self)Actions to perform when uncancelling a purchase request line. -
onchange_product_id(self)@api.onchange('product_id') -
write(self, vals)
New fields (4)
-
item_idsOne2many → purchase.request.line.make.purchase.order.itemcomodel_name='purchase.request.line.make.purchase.order.item'inverse_name='wiz_id' -
purchase_order_idMany2one → purchase.ordercomodel_name='purchase.order'domain=[('state', '=', 'draft')] -
supplier_idMany2one → res.partnercomodel_name='res.partner'context={'res_partner_search_mode': 'supplier'}required=True -
sync_data_plannedBooleanhelp='When checked, PO lines on the selected purchase order are only reused if the scheduled date matches as well.'string='Match existing PO lines by Scheduled Date'
-
create_allocation(self, po_line, pr_line, new_qty, alloc_uom) -
default_get(self, fields)@api.model -
get_items(self, request_line_ids)@api.model -
make_purchase_order(self)
New fields (8)
-
keep_descriptionBooleanhelp='Set true if you want to keep the descriptions provided in the wizard in the new PO.'string='Copy descriptions to new PO' -
line_idMany2one → purchase.request.linecomodel_name='purchase.request.line'string='Purchase Request Line' -
nameCharrequired=Truestring='Description' -
product_idMany2one → product.productcomodel_name='product.product'readonly=Falserelated='line_id.product_id'string='Product' -
product_qtyFloatdigits='Product Unit of Measure'string='Quantity to purchase' -
product_uom_idMany2one → uom.uomcomodel_name='uom.uom'required=Truestring='UoM' -
request_idMany2one → purchase.requestcomodel_name='purchase.request'readonly=Falserelated='line_id.request_id'string='Purchase Request' -
wiz_idMany2one → purchase.request.line.make.purchase.ordercomodel_name='purchase.request.line.make.purchase.order'ondelete='cascade'readonly=Truerequired=Truestring='Wizard'
-
onchange_product_id(self)@api.onchange('product_id')
New fields (3)
-
created_purchase_request_line_idMany2one → purchase.request.linecomodel_name='purchase.request.line'copy=Falseindex=Trueondelete='set null'readonly=True -
purchase_request_allocation_idsOne2many → purchase.request.allocationcomodel_name='purchase.request.allocation'copy=Falseinverse_name='stock_move_id' -
purchase_request_idsOne2many → purchase.requestcomodel_name='purchase.request'compute='_compute_purchase_request_ids'
-
copy_data(self, default=None)Propagate request allocation on copy. If this move is being split, or if this move is processed and there is a remaining allocation, move the appropriate quantity over to the new move.
New fields (0)
No new fields.
Public methods (1)-
allocate(self)
New fields (0)
No new fields.
Public methods (2)-
create_purchase_request(self, procurement_group)Create a purchase request containing procurement order product. -
is_create_purchase_request_allowed(self, procurement)Tell if current procurement order should create a purchase request or not. :return: boolean
New fields (0)
No new fields.
Public methods (0)No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…