From 03b7aa00ee0b8207af12635aea3ce4315ebefa24 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Fri, 9 Jan 2026 17:43:55 +0530 Subject: [PATCH] fix: add validation for duplication (cherry picked from commit cda8a97f4a0344f7e8de04dc52305709fffc14fc) --- .../accounts/doctype/sales_invoice/sales_invoice.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index d3d540758fb..622879d860b 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -800,6 +800,16 @@ class SalesInvoice(SellingController): if status not in ["Submitted", "Payslip", "Partially Billed"]: frappe.throw(_("Timesheet {0} is already completed or cancelled").format(data.time_sheet)) + if data.time_sheet and data.timesheet_detail: + if sales_invoice := frappe.db.get_value( + "Timesheet Detail", data.timesheet_detail, "sales_invoice" + ): + frappe.throw( + _("Row {0}: Sales Invoice {1} is already created for {2}").format( + data.idx, frappe.bold(sales_invoice), frappe.bold(data.time_sheet) + ) + ) + def set_pos_fields(self, for_validate=False): """Set retail related fields from POS Profiles""" if cint(self.is_pos) != 1: