From db67645436be5bba09c315677a968a2f455c4a6c Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Mon, 2 Mar 2026 08:16:59 +0700 Subject: [PATCH] feat: automatically create quotation for down payment orders and remove user confirmation prompt. --- static/src/overrides/models.js | 95 +++++++++++++++------------------- 1 file changed, 42 insertions(+), 53 deletions(-) diff --git a/static/src/overrides/models.js b/static/src/overrides/models.js index 174a7f5..78ade28 100644 --- a/static/src/overrides/models.js +++ b/static/src/overrides/models.js @@ -31,9 +31,9 @@ patch(Order.prototype, { const standardLines = lines.filter(line => line.product.id !== downPaymentProductId); - // If there is a down payment AND standard products that haven't been zeroed out yet - // we prompt the user to create a quotation. - const needsQuotation = downPaymentLines.length > 0 && standardLines.some(line => line.price > 0 || line.get_unit_price() > 0); + // If there is a down payment, we require a customer and automatically + // create a quotation without prompting. + const needsQuotation = downPaymentLines.length > 0; if (needsQuotation && !this.is_quotation_line_converted) { if (!this.get_partner()) { @@ -44,64 +44,53 @@ patch(Order.prototype, { return; } - const { confirmed } = await this.env.services.popup.add(ConfirmPopup, { - title: _t("Create Quotation?"), - body: _t("This cart contains a down payment and standard products. Do you want to create a backend Quotation for the standard products and proceed to pay only the down payment?"), - confirmText: _t("Yes"), - cancelText: _t("No") - }); + try { + // Prepare data for backend + const linesData = standardLines.map(line => ({ + product_id: line.product.id, + qty: line.get_quantity(), + price_unit: line.get_unit_price(), + discount: line.get_discount(), + tax_ids: line.tax_ids || line.get_product().taxes_id || [], + })); - if (confirmed) { - try { - // Prepare data for backend - const linesData = standardLines.map(line => ({ - product_id: line.product.id, - qty: line.get_quantity(), - price_unit: line.get_unit_price(), - discount: line.get_discount(), - tax_ids: line.tax_ids || line.get_product().taxes_id || [], - })); + // Call backend to create sale.order (removed the first empty array for @api.model) + const saleOrderResult = await this.env.services.orm.call( + "pos.order", + "create_quotation_from_pos_lines", + [this.get_partner().id, linesData, this.pos.config.id] + ); - // Call backend to create sale.order (removed the first empty array for @api.model) - const saleOrderResult = await this.env.services.orm.call( - "pos.order", - "create_quotation_from_pos_lines", - [this.get_partner().id, linesData, this.pos.config.id] - ); - - if (saleOrderResult) { - // Link the down payment line to the newly created sale order - const dpLine = lines.find(line => line.product.id === downPaymentProductId); - if (dpLine) { - dpLine.sale_order_origin_id = { - id: saleOrderResult.id, - name: saleOrderResult.name, - }; - } - - // Zero out the standard lines to not charge the customer twice - for (const line of standardLines) { - line.set_unit_price(0); - // Set a flag to easily skip stock delivery later if needed - line.is_quotation_line = true; - } - this.is_quotation_line_converted = true; - } else { - await this.env.services.popup.add(ErrorPopup, { - title: _t("Error"), - body: _t("Failed to create the quotation."), - }); - return; + if (saleOrderResult) { + // Link the down payment line to the newly created sale order + const dpLine = lines.find(line => line.product.id === downPaymentProductId); + if (dpLine) { + dpLine.sale_order_origin_id = { + id: saleOrderResult.id, + name: saleOrderResult.name, + }; } - } catch (error) { + + // Zero out the standard lines to not charge the customer twice + for (const line of standardLines) { + line.set_unit_price(0); + // Set a flag to easily skip stock delivery later if needed + line.is_quotation_line = true; + } + this.is_quotation_line_converted = true; + } else { await this.env.services.popup.add(ErrorPopup, { title: _t("Error"), - body: _t("An error occurred while creating the quotation: ") + error.message, + body: _t("Failed to create the quotation."), }); return; } - } else { - return; // User cancelled + } catch (error) { + await this.env.services.popup.add(ErrorPopup, { + title: _t("Error"), + body: _t("An error occurred while creating the quotation: ") + error.message, + }); + return; } }