mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-06 15:00:27 +00:00
fix: delivery_document_no column issue
This commit is contained in:
@@ -323,9 +323,7 @@ class SalesInvoice(SellingController):
|
|||||||
self.set_against_income_account()
|
self.set_against_income_account()
|
||||||
self.validate_time_sheets_are_submitted()
|
self.validate_time_sheets_are_submitted()
|
||||||
self.validate_multiple_billing("Delivery Note", "dn_detail", "amount")
|
self.validate_multiple_billing("Delivery Note", "dn_detail", "amount")
|
||||||
if not self.is_return:
|
if self.is_return:
|
||||||
self.validate_serial_numbers()
|
|
||||||
else:
|
|
||||||
self.timesheets = []
|
self.timesheets = []
|
||||||
self.update_packing_list()
|
self.update_packing_list()
|
||||||
self.set_billing_hours_and_amount()
|
self.set_billing_hours_and_amount()
|
||||||
@@ -1703,14 +1701,6 @@ class SalesInvoice(SellingController):
|
|||||||
self.set("write_off_amount", reference_doc.get("write_off_amount"))
|
self.set("write_off_amount", reference_doc.get("write_off_amount"))
|
||||||
self.due_date = None
|
self.due_date = None
|
||||||
|
|
||||||
def validate_serial_numbers(self):
|
|
||||||
"""
|
|
||||||
validate serial number agains Delivery Note and Sales Invoice
|
|
||||||
"""
|
|
||||||
for item in self.items:
|
|
||||||
item.set_serial_no_against_delivery_note()
|
|
||||||
item.validate_serial_against_delivery_note()
|
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
unique_projects = list(set([d.project for d in self.get("items") if d.project]))
|
unique_projects = list(set([d.project for d in self.get("items") if d.project]))
|
||||||
if self.project and self.project not in unique_projects:
|
if self.project and self.project not in unique_projects:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from frappe.model.document import Document
|
|||||||
from frappe.utils.data import cint
|
from frappe.utils.data import cint
|
||||||
|
|
||||||
from erpnext.assets.doctype.asset.depreciation import get_disposal_account_and_cost_center
|
from erpnext.assets.doctype.asset.depreciation import get_disposal_account_and_cost_center
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no, get_serial_nos
|
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
|
|
||||||
|
|
||||||
class SalesInvoiceItem(Document):
|
class SalesInvoiceItem(Document):
|
||||||
@@ -128,39 +128,3 @@ class SalesInvoiceItem(Document):
|
|||||||
self.income_account = disposal_account
|
self.income_account = disposal_account
|
||||||
if not self.cost_center:
|
if not self.cost_center:
|
||||||
self.cost_center = depreciation_cost_center
|
self.cost_center = depreciation_cost_center
|
||||||
|
|
||||||
def set_serial_no_against_delivery_note(self):
|
|
||||||
"""Set serial no based on delivery note."""
|
|
||||||
if self.serial_no and self.delivery_note and self.qty != len(get_serial_nos(self.serial_no)):
|
|
||||||
self.serial_no = get_delivery_note_serial_no(self.item_code, self.qty, self.delivery_note)
|
|
||||||
|
|
||||||
def validate_serial_against_delivery_note(self):
|
|
||||||
"""Ensure the serial numbers in this Sales Invoice Item are same as in the linked Delivery Note."""
|
|
||||||
if not self.delivery_note or not self.dn_detail:
|
|
||||||
return
|
|
||||||
|
|
||||||
serial_nos = frappe.db.get_value("Delivery Note Item", self.dn_detail, "serial_no") or ""
|
|
||||||
dn_serial_nos = set(get_serial_nos(serial_nos))
|
|
||||||
|
|
||||||
serial_nos = self.serial_no or ""
|
|
||||||
si_serial_nos = set(get_serial_nos(serial_nos))
|
|
||||||
serial_no_diff = si_serial_nos - dn_serial_nos
|
|
||||||
|
|
||||||
if serial_no_diff:
|
|
||||||
dn_link = frappe.utils.get_link_to_form("Delivery Note", self.delivery_note)
|
|
||||||
msg = (
|
|
||||||
_("Row #{0}: The following serial numbers are not present in Delivery Note {1}:").format(
|
|
||||||
self.idx, dn_link
|
|
||||||
)
|
|
||||||
+ " "
|
|
||||||
+ ", ".join(frappe.bold(d) for d in serial_no_diff)
|
|
||||||
)
|
|
||||||
|
|
||||||
frappe.throw(msg=msg, title=_("Serial Nos Mismatch"))
|
|
||||||
|
|
||||||
if self.serial_no and cint(self.qty) != len(si_serial_nos):
|
|
||||||
frappe.throw(
|
|
||||||
_(
|
|
||||||
"Row #{0}: {1} serial numbers are required for Item {2}. You have provided {3} serial numbers."
|
|
||||||
).format(self.idx, self.qty, self.item_code, len(si_serial_nos))
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ from frappe.utils import cint, flt
|
|||||||
|
|
||||||
from erpnext.controllers.accounts_controller import get_taxes_and_charges, merge_taxes
|
from erpnext.controllers.accounts_controller import get_taxes_and_charges, merge_taxes
|
||||||
from erpnext.controllers.selling_controller import SellingController
|
from erpnext.controllers.selling_controller import SellingController
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no
|
|
||||||
|
|
||||||
form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
|
form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
|
||||||
|
|
||||||
@@ -983,11 +982,6 @@ def make_sales_invoice(source_name, target_doc=None, args=None):
|
|||||||
def update_item(source_doc, target_doc, source_parent):
|
def update_item(source_doc, target_doc, source_parent):
|
||||||
target_doc.qty = to_make_invoice_qty_map[source_doc.name]
|
target_doc.qty = to_make_invoice_qty_map[source_doc.name]
|
||||||
|
|
||||||
if source_doc.serial_no and source_parent.per_billed > 0 and not source_parent.is_return:
|
|
||||||
target_doc.serial_no = get_delivery_note_serial_no(
|
|
||||||
source_doc.item_code, target_doc.qty, source_parent.name
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_pending_qty(item_row):
|
def get_pending_qty(item_row):
|
||||||
pending_qty = item_row.qty - invoiced_qty_map.get(item_row.name, 0)
|
pending_qty = item_row.qty - invoiced_qty_map.get(item_row.name, 0)
|
||||||
|
|
||||||
|
|||||||
@@ -169,21 +169,6 @@ def update_maintenance_status():
|
|||||||
frappe.db.set_value("Serial No", doc.name, "maintenance_status", doc.maintenance_status)
|
frappe.db.set_value("Serial No", doc.name, "maintenance_status", doc.maintenance_status)
|
||||||
|
|
||||||
|
|
||||||
def get_delivery_note_serial_no(item_code, qty, delivery_note):
|
|
||||||
serial_nos = ""
|
|
||||||
dn_serial_nos = frappe.db.sql_list(
|
|
||||||
f""" select name from `tabSerial No`
|
|
||||||
where item_code = %(item_code)s and delivery_document_no = %(delivery_note)s
|
|
||||||
and sales_invoice is null limit {cint(qty)}""",
|
|
||||||
{"item_code": item_code, "delivery_note": delivery_note},
|
|
||||||
)
|
|
||||||
|
|
||||||
if dn_serial_nos and len(dn_serial_nos) > 0:
|
|
||||||
serial_nos = "\n".join(dn_serial_nos)
|
|
||||||
|
|
||||||
return serial_nos
|
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def auto_fetch_serial_number(
|
def auto_fetch_serial_number(
|
||||||
qty: int,
|
qty: int,
|
||||||
|
|||||||
Reference in New Issue
Block a user