Factorizer/Cluster ERP WikiCluster ERP Türkçe
Home / Business modules

Reference

Customer RFQs

Reference for rfqs, rfq_line_items, and rfq_line_materials in crm, with RFQ fields, the status machine, completeness check, line items, materials, and packages.

This page describes three sub-modules of src/cluster_erp/modules/crm/: rfqs/, rfq_line_items/, and rfq_line_materials/. A customer RFQ (Rfq) records what a customer asks the company to quote: its lines, the materials of each line, and a package of drawings and files. A quote in the quotations module answers it. The purchasing RFQ that the company sends to its own vendors is a different record; see purchasing RFQs.

Scope and source

  • Defined in: rfqs/models.py (Rfq, RfqPackage), rfqs/services.py (RfqService, _ACTION_RULES), the same files of rfq_line_items and rfq_line_materials, and their routes.py and metadata.py.
  • Count: 4 tables; 18 RFQ routes, 6 line item routes, and 6 material routes (@router. decorators); 8 ActionMeta entries.

RFQ fields

Group Fields Source
Identity code (yearly sequence request_for_quotation), customer_id, subject, source (default manual) src/cluster_erp/modules/crm/rfqs/models.py:21-34, src/cluster_erp/modules/crm/rfqs/services.py:173
Timing received_at, due_date, priority (default normal) src/cluster_erp/modules/crm/rfqs/models.py:35-48
Status status (default new) src/cluster_erp/modules/crm/rfqs/models.py:49-55
Lifecycle record assigned_to, assigned_at, assigned_by, quoted_at, quoted_by, won_at, won_by, lost_at, lost_by, lost_reason, expired_at, expired_by, declined_reason, declined_at, declined_by src/cluster_erp/modules/crm/rfqs/models.py:56-80
Portal reference ariba_event_id src/cluster_erp/modules/crm/rfqs/models.py:81

Child records

Entity Table Key fields Source
RfqPackage crm_rfq_packages code (yearly sequence rfq_package), rfq_id, name, folder_path, package_complete src/cluster_erp/modules/crm/rfqs/models.py:87-104, src/cluster_erp/modules/crm/rfqs/services.py:583
RfqLineItem crm_rfq_line_items rfq_id, line_no, part_no_customer, customer_part_id, description, qty (integer), uom, material_spec, drawing_attachment_id, notes src/cluster_erp/modules/crm/rfq_line_items/models.py:12-42
RfqLineMaterial crm_rfq_line_materials rfq_line_item_id, seq, component_description, material_spec, notes src/cluster_erp/modules/crm/rfq_line_materials/models.py:12-30

Statuses and actions

_ACTION_RULES names, for each action, the target status, the allowed source statuses, and whether a reason is required (src/cluster_erp/modules/crm/rfqs/services.py:60-72).

stateDiagram-v2
 [*] --> new
 new --> in_review: assign
 in_review --> in_review: assign
 in_review --> quoted: quote
 new --> declined: decline
 in_review --> declined: decline
 new --> expired: expire
 in_review --> expired: expire
 quoted --> expired: expire
 quoted --> won: win
 quoted --> lost: lose
 declined --> in_review: reopen
 expired --> in_review: reopen
 lost --> in_review: reopen

In prose: a new RFQ is assigned and reviewed, then marked quoted. A quoted RFQ is won, lost, or expires. A new or reviewed RFQ can be declined or expire. A declined, expired, or lost RFQ can be reopened. decline and lose need a reason. Every transition checks the record version (src/cluster_erp/modules/crm/rfqs/services.py:278-304).

Action Label Condition Endpoint Permission Source
assign Assign status is new or in_review POST /rfqs/{id}/assign rfq.assign src/cluster_erp/modules/crm/rfqs/metadata.py:80-103, src/cluster_erp/modules/crm/rfqs/routes.py:170
quote Mark as Quoted status is in_review POST /rfqs/{id}/quote rfq.quote src/cluster_erp/modules/crm/rfqs/metadata.py:104-114, src/cluster_erp/modules/crm/rfqs/routes.py:188
decline Decline status is new or in_review POST /rfqs/{id}/decline rfq.decline src/cluster_erp/modules/crm/rfqs/metadata.py:115-134, src/cluster_erp/modules/crm/rfqs/routes.py:201
expire Mark as Expired status is new, in_review, or quoted POST /rfqs/{id}/expire rfq.expire src/cluster_erp/modules/crm/rfqs/metadata.py:135-145, src/cluster_erp/modules/crm/rfqs/routes.py:214
win Mark as Won status is quoted POST /rfqs/{id}/win rfq.win src/cluster_erp/modules/crm/rfqs/metadata.py:146-156, src/cluster_erp/modules/crm/rfqs/routes.py:227
lose Mark as Lost status is quoted POST /rfqs/{id}/lose rfq.lose src/cluster_erp/modules/crm/rfqs/metadata.py:157-176, src/cluster_erp/modules/crm/rfqs/routes.py:240
reopen Reopen status is declined, expired, or lost POST /rfqs/{id}/reopen rfq.reopen src/cluster_erp/modules/crm/rfqs/metadata.py:177-187, src/cluster_erp/modules/crm/rfqs/routes.py:253
from_bom (material) Fetch from BOM on a line item POST /line-items/{parent_id}/materials/from-bom rfq_line_material.create src/cluster_erp/modules/crm/rfq_line_materials/metadata.py:43-52, src/cluster_erp/modules/crm/rfq_line_materials/routes.py:65

Routes

Method and path Permission Source
GET, POST /rfqs/; GET, PUT, DELETE /rfqs/{rfq_id}; POST /rfqs/bulk-delete rfq.read, .create, .update, .delete, .bulk_delete src/cluster_erp/modules/crm/rfqs/routes.py:51-138
GET /rfqs/{rfq_id}/completeness rfq.read src/cluster_erp/modules/crm/rfqs/routes.py:153
GET, POST /rfqs/{rfq_id}/rfq-package; PUT, DELETE /rfq-packages/{package_id} rfq_package.read, .create, .update, .delete src/cluster_erp/modules/crm/rfqs/routes.py:269-318
GET, POST /rfqs/{rfq_id}/line-items; GET, PUT, DELETE /line-items/{line_item_id}; POST /line-items/bulk-delete rfq_line_item.read, .create, .update, .delete, .bulk_delete src/cluster_erp/modules/crm/rfq_line_items/routes.py:23-103
GET, POST /line-items/{line_item_id}/materials; PUT, DELETE /line-materials/{material_id}; POST /line-materials/bulk-delete rfq_line_material.read, .create, .update, .delete src/cluster_erp/modules/crm/rfq_line_materials/routes.py:29-123

Constraints and validation

  • Create needs an existing customer. An RFQ with the same subject for the same customer within 7 days is refused (src/cluster_erp/modules/crm/rfqs/services.py:147-160, src/cluster_erp/modules/crm/rfqs/services.py:506-527).
  • A normal RFQ due within PRIORITY_THRESHOLD_HOURS (48) becomes high (src/cluster_erp/modules/crm/rfqs/services.py:82, src/cluster_erp/modules/crm/rfqs/services.py:165-172).
  • quote is blocked while the completeness log has unmet items: a due date, at least one line item, and an e-mail or communication channel of the customer, counted with CountPartyChannels (src/cluster_erp/modules/crm/rfqs/services.py:326-417).
  • When a package becomes complete, RfqPackageCompleted is emitted (src/cluster_erp/modules/crm/rfqs/services.py:593-620).
  • from-bom takes the product of the line's customer part and asks GetBomMaterials for the distinct leaf materials (src/cluster_erp/modules/crm/rfq_line_materials/services.py:95-130).
  • Events: RfqReceived, RfqUpdated, RfqAssigned, RfqDeclined, RfqExpired, RfqWon, RfqLost (src/cluster_erp/modules/crm/rfqs/services.py:193, src/cluster_erp/modules/crm/rfqs/services.py:254, src/cluster_erp/modules/crm/rfqs/services.py:322, src/cluster_erp/modules/crm/rfqs/services.py:434, src/cluster_erp/modules/crm/rfqs/services.py:468, src/cluster_erp/modules/crm/rfqs/services.py:487).
  • Delete sets deleted_at (src/cluster_erp/modules/crm/rfqs/services.py:263-269).

Discrepancies

Terms introduced

Term Code identifier Definition Turkish term Source
RFQ package RfqPackage The folder of drawings and files that comes with a customer RFQ. Teklif talebi paketi src/cluster_erp/modules/crm/rfqs/models.py:87
RFQ line material RfqLineMaterial A material component listed for one RFQ line. Teklif talebi kalem malzemesi src/cluster_erp/modules/crm/rfq_line_materials/models.py:12

Verified against commit 92f8051 on 2026-11-13.

Verified against commit 92f8051 · 2026-11-13