Fixed merge conflict
This commit is contained in:
commit
80499bb657
@ -171,7 +171,7 @@ class Account(Document):
|
|||||||
|
|
||||||
old_warehouse = cstr(frappe.db.get_value("Account", self.name, "warehouse"))
|
old_warehouse = cstr(frappe.db.get_value("Account", self.name, "warehouse"))
|
||||||
if old_warehouse != cstr(self.warehouse):
|
if old_warehouse != cstr(self.warehouse):
|
||||||
if old_warehouse:
|
if old_warehouse and frappe.db.exists("Warehouse", old_warehouse):
|
||||||
self.validate_warehouse(old_warehouse)
|
self.validate_warehouse(old_warehouse)
|
||||||
if self.warehouse:
|
if self.warehouse:
|
||||||
self.validate_warehouse(self.warehouse)
|
self.validate_warehouse(self.warehouse)
|
||||||
|
@ -504,6 +504,18 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
allocate_payment_amount: function(frm) {
|
||||||
|
if(frm.doc.payment_type == 'Internal Transfer'){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(frm.doc.references.length == 0){
|
||||||
|
frm.events.get_outstanding_documents(frm);
|
||||||
|
}
|
||||||
|
|
||||||
|
frm.events.allocate_party_amount_against_ref_docs(frm, frm.doc.received_amount);
|
||||||
|
},
|
||||||
|
|
||||||
allocate_party_amount_against_ref_docs: function(frm, paid_amount) {
|
allocate_party_amount_against_ref_docs: function(frm, paid_amount) {
|
||||||
var total_positive_outstanding_including_order = 0;
|
var total_positive_outstanding_including_order = 0;
|
||||||
var total_negative_outstanding = 0;
|
var total_negative_outstanding = 0;
|
||||||
@ -545,22 +557,24 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$.each(frm.doc.references || [], function(i, row) {
|
$.each(frm.doc.references || [], function(i, row) {
|
||||||
row.allocated_amount = 0
|
row.allocated_amount = 0 //If allocate payment amount checkbox is unchecked, set zero to allocate amount
|
||||||
|
if(frm.doc.allocate_payment_amount){
|
||||||
|
if(row.outstanding_amount > 0 && allocated_positive_outstanding > 0) {
|
||||||
|
if(row.outstanding_amount >= allocated_positive_outstanding)
|
||||||
|
row.allocated_amount = allocated_positive_outstanding;
|
||||||
|
else row.allocated_amount = row.outstanding_amount;
|
||||||
|
|
||||||
if(row.outstanding_amount > 0 && allocated_positive_outstanding > 0) {
|
allocated_positive_outstanding -= flt(row.allocated_amount);
|
||||||
if(row.outstanding_amount >= allocated_positive_outstanding)
|
} else if (row.outstanding_amount < 0 && allocated_negative_outstanding) {
|
||||||
row.allocated_amount = allocated_positive_outstanding;
|
if(Math.abs(row.outstanding_amount) >= allocated_negative_outstanding)
|
||||||
else row.allocated_amount = row.outstanding_amount;
|
row.allocated_amount = -1*allocated_negative_outstanding;
|
||||||
|
else row.allocated_amount = row.outstanding_amount;
|
||||||
|
|
||||||
allocated_positive_outstanding -= flt(row.allocated_amount);
|
allocated_negative_outstanding -= Math.abs(flt(row.allocated_amount));
|
||||||
} else if (row.outstanding_amount < 0 && allocated_negative_outstanding) {
|
}
|
||||||
if(Math.abs(row.outstanding_amount) >= allocated_negative_outstanding)
|
|
||||||
row.allocated_amount = -1*allocated_negative_outstanding;
|
|
||||||
else row.allocated_amount = row.outstanding_amount;
|
|
||||||
|
|
||||||
allocated_negative_outstanding -= Math.abs(flt(row.allocated_amount));
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
frm.refresh_fields()
|
frm.refresh_fields()
|
||||||
frm.events.set_total_allocated_amount(frm);
|
frm.events.set_total_allocated_amount(frm);
|
||||||
},
|
},
|
||||||
|
@ -772,6 +772,34 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "1",
|
||||||
|
"depends_on": "eval:in_list(['Pay', 'Receive'], doc.payment_type)",
|
||||||
|
"fieldname": "allocate_payment_amount",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"label": "Allocate Payment Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
@ -1426,7 +1454,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2016-09-05 11:06:18.183458",
|
"modified": "2016-09-28 18:20:47.625383",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Entry",
|
"name": "Payment Entry",
|
||||||
|
@ -669,6 +669,7 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=
|
|||||||
pe.paid_to_account_currency = party_account_currency if payment_type=="Pay" else bank.account_currency
|
pe.paid_to_account_currency = party_account_currency if payment_type=="Pay" else bank.account_currency
|
||||||
pe.paid_amount = paid_amount
|
pe.paid_amount = paid_amount
|
||||||
pe.received_amount = received_amount
|
pe.received_amount = received_amount
|
||||||
|
pe.allocate_payment_amount = 1
|
||||||
|
|
||||||
pe.append("references", {
|
pe.append("references", {
|
||||||
"reference_doctype": dt,
|
"reference_doctype": dt,
|
||||||
|
@ -218,14 +218,16 @@ class ReceivablePayableReport(object):
|
|||||||
conditions, values = self.prepare_conditions(party_type)
|
conditions, values = self.prepare_conditions(party_type)
|
||||||
|
|
||||||
if self.filters.get(scrub(party_type)):
|
if self.filters.get(scrub(party_type)):
|
||||||
select_fields = "debit_in_account_currency as debit, credit_in_account_currency as credit"
|
select_fields = "sum(debit_in_account_currency) as debit, sum(credit_in_account_currency) as credit"
|
||||||
else:
|
else:
|
||||||
select_fields = "debit, credit"
|
select_fields = "sum(debit) as debit, sum(credit) as credit"
|
||||||
|
|
||||||
self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party,
|
self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party,
|
||||||
voucher_type, voucher_no, against_voucher_type, against_voucher, account_currency, remarks, {0}
|
voucher_type, voucher_no, against_voucher_type, against_voucher,
|
||||||
|
account_currency, remarks, {0}
|
||||||
from `tabGL Entry`
|
from `tabGL Entry`
|
||||||
where docstatus < 2 and party_type=%s and (party is not null and party != '') {1}
|
where docstatus < 2 and party_type=%s and (party is not null and party != '') {1}
|
||||||
|
group by voucher_type, voucher_no, against_voucher_type, against_voucher
|
||||||
order by posting_date, party"""
|
order by posting_date, party"""
|
||||||
.format(select_fields, conditions), values, as_dict=True)
|
.format(select_fields, conditions), values, as_dict=True)
|
||||||
|
|
||||||
|
@ -60,7 +60,6 @@ def execute(filters=None):
|
|||||||
company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
|
company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
|
||||||
|
|
||||||
for cash_flow_account in cash_flow_accounts:
|
for cash_flow_account in cash_flow_accounts:
|
||||||
|
|
||||||
section_data = []
|
section_data = []
|
||||||
data.append({
|
data.append({
|
||||||
"account_name": cash_flow_account['section_header'],
|
"account_name": cash_flow_account['section_header'],
|
||||||
@ -84,6 +83,7 @@ def execute(filters=None):
|
|||||||
account['account_type'], period_list, filters.accumulated_values)
|
account['account_type'], period_list, filters.accumulated_values)
|
||||||
account_data.update({
|
account_data.update({
|
||||||
"account_name": account['label'],
|
"account_name": account['label'],
|
||||||
|
"account": account['label'],
|
||||||
"indent": 1,
|
"indent": 1,
|
||||||
"parent_account": cash_flow_account['section_header'],
|
"parent_account": cash_flow_account['section_header'],
|
||||||
"currency": company_currency
|
"currency": company_currency
|
||||||
@ -136,7 +136,7 @@ def get_start_date(period, accumulated_values):
|
|||||||
def add_total_row_account(out, data, label, period_list, currency):
|
def add_total_row_account(out, data, label, period_list, currency):
|
||||||
total_row = {
|
total_row = {
|
||||||
"account_name": "'" + _("{0}").format(label) + "'",
|
"account_name": "'" + _("{0}").format(label) + "'",
|
||||||
"account": None,
|
"account": "'" + _("{0}").format(label) + "'",
|
||||||
"currency": currency
|
"currency": currency
|
||||||
}
|
}
|
||||||
for row in data:
|
for row in data:
|
||||||
|
@ -34,7 +34,7 @@ def get_net_profit_loss(income, expense, period_list, company):
|
|||||||
total = 0
|
total = 0
|
||||||
net_profit_loss = {
|
net_profit_loss = {
|
||||||
"account_name": "'" + _("Net Profit / Loss") + "'",
|
"account_name": "'" + _("Net Profit / Loss") + "'",
|
||||||
"account": None,
|
"account": "'" + _("Net Profit / Loss") + "'",
|
||||||
"warn_if_negative": True,
|
"warn_if_negative": True,
|
||||||
"currency": frappe.db.get_value("Company", company, "default_currency")
|
"currency": frappe.db.get_value("Company", company, "default_currency")
|
||||||
}
|
}
|
||||||
|
@ -97,12 +97,19 @@ class LeaveApplication(Document):
|
|||||||
.format(formatdate(future_allocation[0].from_date), future_allocation[0].name))
|
.format(formatdate(future_allocation[0].from_date), future_allocation[0].name))
|
||||||
|
|
||||||
def validate_salary_processed_days(self):
|
def validate_salary_processed_days(self):
|
||||||
last_processed_pay_slip = frappe.db.sql("""select start_date, end_date from `tabSalary Slip`
|
if not frappe.db.get_value("Leave Type", self.leave_type, "is_lwp"):
|
||||||
where docstatus != 2 and employee = %s and ((%s between start_date and end_date) or (%s between start_date and end_date)) order by modified desc limit 1""",(self.employee, self.to_date, self.from_date))
|
return
|
||||||
|
|
||||||
|
last_processed_pay_slip = frappe.db.sql("""
|
||||||
|
select start_date, end_date from `tabSalary Slip`
|
||||||
|
where docstatus != 2 and employee = %s
|
||||||
|
and ((%s between start_date and end_date) or (%s between start_date and end_date))
|
||||||
|
order by modified desc limit 1
|
||||||
|
""",(self.employee, self.to_date, self.from_date))
|
||||||
|
|
||||||
if last_processed_pay_slip:
|
if last_processed_pay_slip:
|
||||||
frappe.throw(_("Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range.").
|
frappe.throw(_("Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range.").format(formatdate(last_processed_pay_slip[0][0]),
|
||||||
format(formatdate(last_processed_pay_slip[0][0]), formatdate(last_processed_pay_slip[0][1])))
|
formatdate(last_processed_pay_slip[0][1])))
|
||||||
|
|
||||||
|
|
||||||
def show_block_day_warning(self):
|
def show_block_day_warning(self):
|
||||||
|
@ -282,7 +282,7 @@ execute:frappe.reload_doc('projects', 'doctype', 'project_user')
|
|||||||
erpnext.patches.v7_0.convert_timelogbatch_to_timesheet
|
erpnext.patches.v7_0.convert_timelogbatch_to_timesheet
|
||||||
erpnext.patches.v7_0.convert_timelog_to_timesheet
|
erpnext.patches.v7_0.convert_timelog_to_timesheet
|
||||||
erpnext.patches.v7_0.move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet
|
erpnext.patches.v7_0.move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet
|
||||||
erpnext.patches.v7_0.remove_doctypes_and_reports
|
erpnext.patches.v7_0.remove_doctypes_and_reports #2016-10-29
|
||||||
erpnext.patches.v7_0.update_maintenance_module_in_doctype
|
erpnext.patches.v7_0.update_maintenance_module_in_doctype
|
||||||
erpnext.patches.v7_0.update_prevdoc_values_for_supplier_quotation_item
|
erpnext.patches.v7_0.update_prevdoc_values_for_supplier_quotation_item
|
||||||
erpnext.patches.v7_0.rename_advance_table_fields
|
erpnext.patches.v7_0.rename_advance_table_fields
|
||||||
@ -309,6 +309,7 @@ erpnext.patches.v7_0.update_refdoc_in_landed_cost_voucher
|
|||||||
erpnext.patches.v7_0.set_material_request_type_in_item
|
erpnext.patches.v7_0.set_material_request_type_in_item
|
||||||
erpnext.patches.v7_0.rename_examination_to_assessment
|
erpnext.patches.v7_0.rename_examination_to_assessment
|
||||||
erpnext.patches.v7_0.set_portal_settings
|
erpnext.patches.v7_0.set_portal_settings
|
||||||
|
erpnext.patches.v7_0.update_change_amount_account
|
||||||
erpnext.patches.v7_0.repost_future_gle_for_purchase_invoice
|
erpnext.patches.v7_0.repost_future_gle_for_purchase_invoice
|
||||||
erpnext.patches.v7_0.fix_duplicate_icons
|
erpnext.patches.v7_0.fix_duplicate_icons
|
||||||
erpnext.patches.v7_0.move_employee_parent_to_child_in_salary_structure
|
erpnext.patches.v7_0.move_employee_parent_to_child_in_salary_structure
|
||||||
@ -325,6 +326,7 @@ erpnext.patches.v7_1.move_sales_invoice_from_parent_to_child_timesheet
|
|||||||
execute:frappe.db.sql("update `tabTimesheet` ts, `tabEmployee` emp set ts.employee_name = emp.employee_name where emp.name = ts.employee and ts.employee_name is null and ts.employee is not null")
|
execute:frappe.db.sql("update `tabTimesheet` ts, `tabEmployee` emp set ts.employee_name = emp.employee_name where emp.name = ts.employee and ts.employee_name is null and ts.employee is not null")
|
||||||
erpnext.patches.v7_1.update_lead_source
|
erpnext.patches.v7_1.update_lead_source
|
||||||
erpnext.patches.v7_1.fix_link_for_customer_from_lead
|
erpnext.patches.v7_1.fix_link_for_customer_from_lead
|
||||||
|
execute:frappe.db.sql("delete from `tabTimesheet Detail` where NOT EXISTS (select name from `tabTimesheet` where name = `tabTimesheet Detail`.parent)")
|
||||||
erpnext.patches.v7_0.update_mode_of_payment_type
|
erpnext.patches.v7_0.update_mode_of_payment_type
|
||||||
execute:frappe.reload_doctype("Salary Slip")
|
execute:frappe.reload_doctype("Salary Slip")
|
||||||
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
||||||
|
@ -5,6 +5,21 @@ def execute():
|
|||||||
frappe.db.sql("""delete from `tabDocType`
|
frappe.db.sql("""delete from `tabDocType`
|
||||||
where name in('Time Log Batch', 'Time Log Batch Detail', 'Time Log')""")
|
where name in('Time Log Batch', 'Time Log Batch Detail', 'Time Log')""")
|
||||||
|
|
||||||
|
frappe.db.sql("""delete from `tabDocField` where parent in ('Time Log', 'Time Log Batch')""")
|
||||||
|
frappe.db.sql("""update `tabCustom Script` set dt = 'Timesheet' where dt = 'Time Log'""")
|
||||||
|
|
||||||
|
for data in frappe.db.sql(""" select label, fieldname from `tabCustom Field` where dt = 'Time Log'""", as_dict=1):
|
||||||
|
custom_field = frappe.get_doc({
|
||||||
|
'doctype': 'Custom Field',
|
||||||
|
'label': data.label,
|
||||||
|
'dt': 'Timesheet Detail',
|
||||||
|
'fieldname': data.fieldname
|
||||||
|
}).insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
frappe.db.sql("""delete from `tabCustom Field` where dt = 'Time Log'""")
|
||||||
|
frappe.reload_doc('projects', 'doctype', 'timesheet')
|
||||||
|
frappe.reload_doc('projects', 'doctype', 'timesheet_detail')
|
||||||
|
|
||||||
report = "Daily Time Log Summary"
|
report = "Daily Time Log Summary"
|
||||||
if frappe.db.exists("Report", report):
|
if frappe.db.exists("Report", report):
|
||||||
frappe.delete_doc('Report', report)
|
frappe.delete_doc('Report', report)
|
19
erpnext/patches/v7_0/update_change_amount_account.py
Normal file
19
erpnext/patches/v7_0/update_change_amount_account.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
|
||||||
|
|
||||||
|
for company in frappe.db.sql("""select company from `tabSales Invoice`
|
||||||
|
where change_amount <> 0 and account_for_change_amount is null group by company""", as_list = 1):
|
||||||
|
cash_account = get_default_bank_cash_account(company[0], 'Cash').get('account')
|
||||||
|
if not cash_account:
|
||||||
|
bank_account = get_default_bank_cash_account(company[0], 'Bank').get('account')
|
||||||
|
cash_account = bank_account
|
||||||
|
|
||||||
|
if cash_account:
|
||||||
|
frappe.db.sql("""update `tabSales Invoice`
|
||||||
|
set account_for_change_amount = %(cash_account)s where change_amount <> 0
|
||||||
|
and company = %(company)s and account_for_change_amount is null""",
|
||||||
|
{'cash_account': cash_account, 'company': company[0]})
|
@ -2,6 +2,14 @@
|
|||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
frappe.ui.form.on('Homepage', {
|
frappe.ui.form.on('Homepage', {
|
||||||
|
setup: function(frm) {
|
||||||
|
frm.fields_dict["products"].grid.get_field("item_code").get_query = function(){
|
||||||
|
return {
|
||||||
|
filters: {'show_in_website': 1}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
|
|
||||||
},
|
},
|
||||||
@ -35,5 +43,12 @@ frappe.ui.form.on('Homepage Featured Product', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
view: function(frm, cdt, cdn){
|
||||||
|
var child= locals[cdt][cdn]
|
||||||
|
if(child.item_code && frm.doc.products_url){
|
||||||
|
window.location.href = frm.doc.products_url + '/' + encodeURIComponent(child.item_code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -18,7 +18,6 @@ def delete_company_transactions(company_name):
|
|||||||
frappe.PermissionError)
|
frappe.PermissionError)
|
||||||
|
|
||||||
delete_bins(company_name)
|
delete_bins(company_name)
|
||||||
delete_time_sheets(company_name)
|
|
||||||
delete_lead_addresses(company_name)
|
delete_lead_addresses(company_name)
|
||||||
|
|
||||||
for doctype in frappe.db.sql_list("""select parent from
|
for doctype in frappe.db.sql_list("""select parent from
|
||||||
@ -70,14 +69,6 @@ def delete_bins(company_name):
|
|||||||
frappe.db.sql("""delete from tabBin where warehouse in
|
frappe.db.sql("""delete from tabBin where warehouse in
|
||||||
(select name from tabWarehouse where company=%s)""", company_name)
|
(select name from tabWarehouse where company=%s)""", company_name)
|
||||||
|
|
||||||
def delete_time_sheets(company_name):
|
|
||||||
# Delete Time Logs as it is linked to Production Order / Project / Task, which are linked to company
|
|
||||||
frappe.db.sql("""
|
|
||||||
delete from `tabTimesheet`
|
|
||||||
where
|
|
||||||
company=%(company)s
|
|
||||||
""", {"company": company_name})
|
|
||||||
|
|
||||||
def delete_lead_addresses(company_name):
|
def delete_lead_addresses(company_name):
|
||||||
"""Delete addresses to which leads are linked"""
|
"""Delete addresses to which leads are linked"""
|
||||||
for lead in frappe.get_all("Lead", filters={"company": company_name}):
|
for lead in frappe.get_all("Lead", filters={"company": company_name}):
|
||||||
|
@ -230,7 +230,7 @@ def reset_serial_no_status_and_warehouse(serial_nos=None):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def repost_all_stock_vouchers():
|
def repost_all_stock_vouchers():
|
||||||
warehouses_with_account = frappe.db.sql_list("""select master_name from tabAccount
|
warehouses_with_account = frappe.db.sql_list("""select warehouse from tabAccount
|
||||||
where ifnull(account_type, '') = 'Stock' and (warehouse is not null and warehouse != '')
|
where ifnull(account_type, '') = 'Stock' and (warehouse is not null and warehouse != '')
|
||||||
and is_group=0""")
|
and is_group=0""")
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ def repost_all_stock_vouchers():
|
|||||||
i = 0
|
i = 0
|
||||||
for voucher_type, voucher_no in vouchers:
|
for voucher_type, voucher_no in vouchers:
|
||||||
i+=1
|
i+=1
|
||||||
print i, "/", len(vouchers)
|
print i, "/", len(vouchers), voucher_type, voucher_no
|
||||||
try:
|
try:
|
||||||
for dt in ["Stock Ledger Entry", "GL Entry"]:
|
for dt in ["Stock Ledger Entry", "GL Entry"]:
|
||||||
frappe.db.sql("""delete from `tab%s` where voucher_type=%s and voucher_no=%s"""%
|
frappe.db.sql("""delete from `tab%s` where voucher_type=%s and voucher_no=%s"""%
|
||||||
|
Loading…
Reference in New Issue
Block a user