Merge branch 'develop' into lms-fixes-1
This commit is contained in:
commit
377b230e41
@ -285,6 +285,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
|
|||||||
is_paid: function() {
|
is_paid: function() {
|
||||||
hide_fields(this.frm.doc);
|
hide_fields(this.frm.doc);
|
||||||
if(cint(this.frm.doc.is_paid)) {
|
if(cint(this.frm.doc.is_paid)) {
|
||||||
|
this.frm.set_value("allocate_advances_automatically", 0);
|
||||||
if(!this.frm.doc.company) {
|
if(!this.frm.doc.company) {
|
||||||
this.frm.set_value("is_paid", 0)
|
this.frm.set_value("is_paid", 0)
|
||||||
frappe.msgprint(__("Please specify Company to proceed"));
|
frappe.msgprint(__("Please specify Company to proceed"));
|
||||||
|
|||||||
@ -21,8 +21,8 @@ from erpnext.accounts.general_ledger import get_round_off_account_and_cost_cente
|
|||||||
from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled
|
from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_doc,\
|
||||||
unlink_inter_company_invoice
|
unlink_inter_company_doc
|
||||||
from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category import get_party_tax_withholding_details
|
from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category import get_party_tax_withholding_details
|
||||||
from erpnext.accounts.deferred_revenue import validate_service_stop_date
|
from erpnext.accounts.deferred_revenue import validate_service_stop_date
|
||||||
|
|
||||||
@ -348,7 +348,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
|
|
||||||
self.update_project()
|
self.update_project()
|
||||||
update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
update_linked_doc(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False):
|
def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False):
|
||||||
if not self.grand_total:
|
if not self.grand_total:
|
||||||
@ -778,7 +778,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
self.update_project()
|
self.update_project()
|
||||||
frappe.db.set(self, 'status', 'Cancelled')
|
frappe.db.set(self, 'status', 'Cancelled')
|
||||||
|
|
||||||
unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
unlink_inter_company_doc(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
project_list = []
|
project_list = []
|
||||||
@ -917,5 +917,5 @@ def block_invoice(name, hold_comment):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_inter_company_sales_invoice(source_name, target_doc=None):
|
def make_inter_company_sales_invoice(source_name, target_doc=None):
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_invoice
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||||
return make_inter_company_invoice("Purchase Invoice", source_name, target_doc)
|
return make_inter_company_transaction("Purchase Invoice", source_name, target_doc)
|
||||||
|
|||||||
@ -369,7 +369,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
|
|
||||||
set_pos_data: function() {
|
set_pos_data: function() {
|
||||||
if(this.frm.doc.is_pos) {
|
if(this.frm.doc.is_pos) {
|
||||||
this.frm.set_value("allocate_advances_automatically", this.frm.doc.is_pos ? 0 : 1);
|
this.frm.set_value("allocate_advances_automatically", 0);
|
||||||
if(!this.frm.doc.company) {
|
if(!this.frm.doc.company) {
|
||||||
this.frm.set_value("is_pos", 0);
|
this.frm.set_value("is_pos", 0);
|
||||||
frappe.msgprint(__("Please specify Company to proceed"));
|
frappe.msgprint(__("Please specify Company to proceed"));
|
||||||
|
|||||||
@ -179,7 +179,7 @@ class SalesInvoice(SellingController):
|
|||||||
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
|
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
|
||||||
update_company_current_month_sales(self.company)
|
update_company_current_month_sales(self.company)
|
||||||
self.update_project()
|
self.update_project()
|
||||||
update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
update_linked_doc(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
# create the loyalty point ledger entry if the customer is enrolled in any loyalty program
|
# create the loyalty point ledger entry if the customer is enrolled in any loyalty program
|
||||||
if not self.is_return and self.loyalty_program:
|
if not self.is_return and self.loyalty_program:
|
||||||
@ -243,7 +243,7 @@ class SalesInvoice(SellingController):
|
|||||||
against_si_doc.delete_loyalty_point_entry()
|
against_si_doc.delete_loyalty_point_entry()
|
||||||
against_si_doc.make_loyalty_point_entry()
|
against_si_doc.make_loyalty_point_entry()
|
||||||
|
|
||||||
unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
unlink_inter_company_doc(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
# Healthcare Service Invoice.
|
# Healthcare Service Invoice.
|
||||||
domain_settings = frappe.get_doc('Domain Settings')
|
domain_settings = frappe.get_doc('Domain Settings')
|
||||||
@ -1165,21 +1165,29 @@ class SalesInvoice(SellingController):
|
|||||||
|
|
||||||
self.set_missing_values(for_validate = True)
|
self.set_missing_values(for_validate = True)
|
||||||
|
|
||||||
def validate_inter_company_party(doctype, party, company, inter_company_invoice_reference):
|
def validate_inter_company_party(doctype, party, company, inter_company_reference):
|
||||||
if doctype == "Sales Invoice":
|
if doctype in ["Sales Invoice", "Sales Order"]:
|
||||||
partytype, ref_partytype, internal = "Customer", "Supplier", "is_internal_customer"
|
partytype, ref_partytype, internal = "Customer", "Supplier", "is_internal_customer"
|
||||||
ref_doc = "Purchase Invoice"
|
|
||||||
|
if doctype == "Sales Invoice":
|
||||||
|
ref_doc = "Purchase Invoice"
|
||||||
|
else:
|
||||||
|
ref_doc = "Purchase Order"
|
||||||
else:
|
else:
|
||||||
partytype, ref_partytype, internal = "Supplier", "Customer", "is_internal_supplier"
|
partytype, ref_partytype, internal = "Supplier", "Customer", "is_internal_supplier"
|
||||||
ref_doc = "Sales Invoice"
|
|
||||||
|
|
||||||
if inter_company_invoice_reference:
|
if doctype == "Purchase Invoice":
|
||||||
doc = frappe.get_doc(ref_doc, inter_company_invoice_reference)
|
ref_doc = "Sales Invoice"
|
||||||
ref_party = doc.supplier if doctype == "Sales Invoice" else doc.customer
|
else:
|
||||||
|
ref_doc = "Sales Order"
|
||||||
|
|
||||||
|
if inter_company_reference:
|
||||||
|
doc = frappe.get_doc(ref_doc, inter_company_reference)
|
||||||
|
ref_party = doc.supplier if doctype in ["Sales Invoice", "Sales Order"] else doc.customer
|
||||||
if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
|
if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
|
||||||
frappe.throw(_("Invalid {0} for Inter Company Invoice.").format(partytype))
|
frappe.throw(_("Invalid {0} for Inter Company Transaction.").format(partytype))
|
||||||
if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company:
|
if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company:
|
||||||
frappe.throw(_("Invalid Company for Inter Company Invoice."))
|
frappe.throw(_("Invalid Company for Inter Company Transaction."))
|
||||||
|
|
||||||
elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
|
elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
|
||||||
companies = frappe.db.sql("""select company from `tabAllowed To Transact With`
|
companies = frappe.db.sql("""select company from `tabAllowed To Transact With`
|
||||||
@ -1188,18 +1196,29 @@ def validate_inter_company_party(doctype, party, company, inter_company_invoice_
|
|||||||
if not company in companies:
|
if not company in companies:
|
||||||
frappe.throw(_("{0} not allowed to transact with {1}. Please change the Company.").format(partytype, company))
|
frappe.throw(_("{0} not allowed to transact with {1}. Please change the Company.").format(partytype, company))
|
||||||
|
|
||||||
def update_linked_invoice(doctype, name, inter_company_invoice_reference):
|
def update_linked_doc(doctype, name, inter_company_reference):
|
||||||
if inter_company_invoice_reference:
|
|
||||||
frappe.db.set_value(doctype, inter_company_invoice_reference,\
|
|
||||||
"inter_company_invoice_reference", name)
|
|
||||||
|
|
||||||
def unlink_inter_company_invoice(doctype, name, inter_company_invoice_reference):
|
if doctype in ["Sales Invoice", "Purchase Invoice"]:
|
||||||
ref_doc = "Purchase Invoice" if doctype == "Sales Invoice" else "Sales Invoice"
|
ref_field = "inter_company_invoice_reference"
|
||||||
if inter_company_invoice_reference:
|
else:
|
||||||
frappe.db.set_value(doctype, name,\
|
ref_field = "inter_company_order_reference"
|
||||||
"inter_company_invoice_reference", "")
|
|
||||||
frappe.db.set_value(ref_doc, inter_company_invoice_reference,\
|
if inter_company_reference:
|
||||||
"inter_company_invoice_reference", "")
|
frappe.db.set_value(doctype, inter_company_reference,\
|
||||||
|
ref_field, name)
|
||||||
|
|
||||||
|
def unlink_inter_company_doc(doctype, name, inter_company_reference):
|
||||||
|
|
||||||
|
if doctype in ["Sales Invoice", "Purchase Invoice"]:
|
||||||
|
ref_doc = "Purchase Invoice" if doctype == "Sales Invoice" else "Sales Invoice"
|
||||||
|
ref_field = "inter_company_invoice_reference"
|
||||||
|
else:
|
||||||
|
ref_doc = "Purchase Order" if doctype == "Sales Order" else "Sales Order"
|
||||||
|
ref_field = "inter_company_order_reference"
|
||||||
|
|
||||||
|
if inter_company_reference:
|
||||||
|
frappe.db.set_value(doctype, name, ref_field, "")
|
||||||
|
frappe.db.set_value(ref_doc, inter_company_reference, ref_field, "")
|
||||||
|
|
||||||
def get_list_context(context=None):
|
def get_list_context(context=None):
|
||||||
from erpnext.controllers.website_list_for_contact import get_list_context
|
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||||
@ -1299,7 +1318,7 @@ def set_account_for_mode_of_payment(self):
|
|||||||
data.account = get_bank_cash_account(data.mode_of_payment, self.company).get("account")
|
data.account = get_bank_cash_account(data.mode_of_payment, self.company).get("account")
|
||||||
|
|
||||||
def get_inter_company_details(doc, doctype):
|
def get_inter_company_details(doc, doctype):
|
||||||
if doctype == "Sales Invoice":
|
if doctype in ["Sales Invoice", "Sales Order"]:
|
||||||
party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name")
|
party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name")
|
||||||
company = frappe.get_cached_value("Customer", doc.customer, "represents_company")
|
company = frappe.get_cached_value("Customer", doc.customer, "represents_company")
|
||||||
else:
|
else:
|
||||||
@ -1312,21 +1331,21 @@ def get_inter_company_details(doc, doctype):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def validate_inter_company_invoice(doc, doctype):
|
def validate_inter_company_transaction(doc, doctype):
|
||||||
|
|
||||||
details = get_inter_company_details(doc, doctype)
|
details = get_inter_company_details(doc, doctype)
|
||||||
price_list = doc.selling_price_list if doctype == "Sales Invoice" else doc.buying_price_list
|
price_list = doc.selling_price_list if doctype in ["Sales Invoice", "Sales Order"] else doc.buying_price_list
|
||||||
valid_price_list = frappe.db.get_value("Price List", {"name": price_list, "buying": 1, "selling": 1})
|
valid_price_list = frappe.db.get_value("Price List", {"name": price_list, "buying": 1, "selling": 1})
|
||||||
if not valid_price_list:
|
if not valid_price_list:
|
||||||
frappe.throw(_("Selected Price List should have buying and selling fields checked."))
|
frappe.throw(_("Selected Price List should have buying and selling fields checked."))
|
||||||
|
|
||||||
party = details.get("party")
|
party = details.get("party")
|
||||||
if not party:
|
if not party:
|
||||||
partytype = "Supplier" if doctype == "Sales Invoice" else "Customer"
|
partytype = "Supplier" if doctype in ["Sales Invoice", "Sales Order"] else "Customer"
|
||||||
frappe.throw(_("No {0} found for Inter Company Transactions.").format(partytype))
|
frappe.throw(_("No {0} found for Inter Company Transactions.").format(partytype))
|
||||||
|
|
||||||
company = details.get("company")
|
company = details.get("company")
|
||||||
default_currency = frappe.get_cached_value('Company', company, "default_currency")
|
default_currency = frappe.get_cached_value('Company', company, "default_currency")
|
||||||
if default_currency != doc.currency:
|
if default_currency != doc.currency:
|
||||||
frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
|
frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
|
||||||
|
|
||||||
@ -1334,17 +1353,17 @@ def validate_inter_company_invoice(doc, doctype):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_inter_company_purchase_invoice(source_name, target_doc=None):
|
def make_inter_company_purchase_invoice(source_name, target_doc=None):
|
||||||
return make_inter_company_invoice("Sales Invoice", source_name, target_doc)
|
return make_inter_company_transaction("Sales Invoice", source_name, target_doc)
|
||||||
|
|
||||||
def make_inter_company_invoice(doctype, source_name, target_doc=None):
|
def make_inter_company_transaction(doctype, source_name, target_doc=None):
|
||||||
if doctype == "Sales Invoice":
|
if doctype in ["Sales Invoice", "Sales Order"]:
|
||||||
source_doc = frappe.get_doc("Sales Invoice", source_name)
|
source_doc = frappe.get_doc(doctype, source_name)
|
||||||
target_doctype = "Purchase Invoice"
|
target_doctype = "Purchase Invoice" if doctype == "Sales Invoice" else "Purchase Order"
|
||||||
else:
|
else:
|
||||||
source_doc = frappe.get_doc("Purchase Invoice", source_name)
|
source_doc = frappe.get_doc(doctype, source_name)
|
||||||
target_doctype = "Sales Invoice"
|
target_doctype = "Sales Invoice" if doctype == "Purchase Invoice" else "Sales Order"
|
||||||
|
|
||||||
validate_inter_company_invoice(source_doc, doctype)
|
validate_inter_company_transaction(source_doc, doctype)
|
||||||
details = get_inter_company_details(source_doc, doctype)
|
details = get_inter_company_details(source_doc, doctype)
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
@ -1352,7 +1371,7 @@ def make_inter_company_invoice(doctype, source_name, target_doc=None):
|
|||||||
|
|
||||||
def update_details(source_doc, target_doc, source_parent):
|
def update_details(source_doc, target_doc, source_parent):
|
||||||
target_doc.inter_company_invoice_reference = source_doc.name
|
target_doc.inter_company_invoice_reference = source_doc.name
|
||||||
if target_doc.doctype == "Purchase Invoice":
|
if target_doc.doctype in ["Purchase Invoice", "Purchase Order"]:
|
||||||
target_doc.company = details.get("company")
|
target_doc.company = details.get("company")
|
||||||
target_doc.supplier = details.get("party")
|
target_doc.supplier = details.get("party")
|
||||||
target_doc.buying_price_list = source_doc.selling_price_list
|
target_doc.buying_price_list = source_doc.selling_price_list
|
||||||
|
|||||||
@ -18,6 +18,7 @@ from erpnext.accounts.doctype.account.test_account import get_inventory_account,
|
|||||||
from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data
|
from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data
|
||||||
from erpnext.stock.doctype.item.test_item import create_item
|
from erpnext.stock.doctype.item.test_item import create_item
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||||
class TestSalesInvoice(unittest.TestCase):
|
class TestSalesInvoice(unittest.TestCase):
|
||||||
def make(self):
|
def make(self):
|
||||||
w = frappe.copy_doc(test_records[0])
|
w = frappe.copy_doc(test_records[0])
|
||||||
@ -1625,6 +1626,61 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
self.assertEqual(expected_gle[i][2], gle.credit)
|
self.assertEqual(expected_gle[i][2], gle.credit)
|
||||||
self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
|
self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
|
||||||
|
|
||||||
|
def test_inter_company_transaction(self):
|
||||||
|
|
||||||
|
if not frappe.db.exists("Customer", "_Test Internal Customer"):
|
||||||
|
customer = frappe.get_doc({
|
||||||
|
"customer_group": "_Test Customer Group",
|
||||||
|
"customer_name": "_Test Internal Customer",
|
||||||
|
"customer_type": "Individual",
|
||||||
|
"doctype": "Customer",
|
||||||
|
"territory": "_Test Territory",
|
||||||
|
"is_internal_customer": 1,
|
||||||
|
"represents_company": "_Test Company 1"
|
||||||
|
})
|
||||||
|
|
||||||
|
customer.append("companies", {
|
||||||
|
"company": "Wind Power LLC"
|
||||||
|
})
|
||||||
|
|
||||||
|
customer.insert()
|
||||||
|
|
||||||
|
if not frappe.db.exists("Supplier", "_Test Internal Supplier"):
|
||||||
|
supplier = frappe.get_doc({
|
||||||
|
"supplier_group": "_Test Supplier Group",
|
||||||
|
"supplier_name": "_Test Internal Supplier",
|
||||||
|
"doctype": "Supplier",
|
||||||
|
"is_internal_supplier": 1,
|
||||||
|
"represents_company": "Wind Power LLC"
|
||||||
|
})
|
||||||
|
|
||||||
|
supplier.append("companies", {
|
||||||
|
"company": "_Test Company 1"
|
||||||
|
})
|
||||||
|
|
||||||
|
supplier.insert()
|
||||||
|
|
||||||
|
si = create_sales_invoice(
|
||||||
|
company = "Wind Power LLC",
|
||||||
|
customer = "_Test Internal Customer",
|
||||||
|
debit_to = "Debtors - WP",
|
||||||
|
warehouse = "Stores - WP",
|
||||||
|
income_account = "Sales - WP",
|
||||||
|
expense_account = "Cost of Goods Sold - WP",
|
||||||
|
cost_center = "Main - WP",
|
||||||
|
currency = "USD",
|
||||||
|
do_not_save = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
si.selling_price_list = "_Test Price List Rest of the World"
|
||||||
|
si.submit()
|
||||||
|
|
||||||
|
target_doc = make_inter_company_transaction("Sales Invoice", si.name)
|
||||||
|
target_doc.submit()
|
||||||
|
|
||||||
|
self.assertEqual(target_doc.company, "_Test Company 1")
|
||||||
|
self.assertEqual(target_doc.supplier, "_Test Internal Supplier")
|
||||||
|
|
||||||
def create_sales_invoice(**args):
|
def create_sales_invoice(**args):
|
||||||
si = frappe.new_doc("Sales Invoice")
|
si = frappe.new_doc("Sales Invoice")
|
||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
|||||||
@ -359,7 +359,8 @@ def set_gl_entries_by_account(
|
|||||||
"from_date": from_date,
|
"from_date": from_date,
|
||||||
"to_date": to_date,
|
"to_date": to_date,
|
||||||
"cost_center": filters.cost_center,
|
"cost_center": filters.cost_center,
|
||||||
"project": filters.project
|
"project": filters.project,
|
||||||
|
"finance_book": filters.get("finance_book")
|
||||||
},
|
},
|
||||||
as_dict=True)
|
as_dict=True)
|
||||||
|
|
||||||
|
|||||||
@ -138,6 +138,20 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
erpnext.utils.make_subscription(doc.doctype, doc.name)
|
erpnext.utils.make_subscription(doc.doctype, doc.name)
|
||||||
}, __('Create'))
|
}, __('Create'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (doc.docstatus === 1 && !doc.inter_company_order_reference) {
|
||||||
|
let me = this;
|
||||||
|
frappe.model.with_doc("Supplier", me.frm.doc.supplier, () => {
|
||||||
|
let supplier = frappe.model.get_doc("Supplier", me.frm.doc.supplier);
|
||||||
|
let internal = supplier.is_internal_supplier;
|
||||||
|
let disabled = supplier.disabled;
|
||||||
|
if (internal === 1 && disabled === 0) {
|
||||||
|
me.frm.add_custom_button("Inter Company Order", function() {
|
||||||
|
me.make_inter_company_order(me.frm);
|
||||||
|
}, __('Create'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(flt(doc.per_billed)==0) {
|
if(flt(doc.per_billed)==0) {
|
||||||
this.frm.add_custom_button(__('Payment Request'),
|
this.frm.add_custom_button(__('Payment Request'),
|
||||||
@ -296,6 +310,13 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
make_inter_company_order: function(frm) {
|
||||||
|
frappe.model.open_mapped_doc({
|
||||||
|
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order",
|
||||||
|
frm: frm
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
make_purchase_receipt: function() {
|
make_purchase_receipt: function() {
|
||||||
frappe.model.open_mapped_doc({
|
frappe.model.open_mapped_doc({
|
||||||
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_receipt",
|
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_receipt",
|
||||||
|
|||||||
@ -298,6 +298,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"default": "Today",
|
"default": "Today",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "transaction_date",
|
"fieldname": "transaction_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -332,6 +333,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"default": "",
|
"default": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "schedule_date",
|
"fieldname": "schedule_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -365,6 +367,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "eval:doc.docstatus===1",
|
"depends_on": "eval:doc.docstatus===1",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "order_confirmation_no",
|
"fieldname": "order_confirmation_no",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -398,6 +401,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "eval:doc.order_confirmation_no",
|
"depends_on": "eval:doc.order_confirmation_no",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "order_confirmation_date",
|
"fieldname": "order_confirmation_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -430,6 +434,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "amended_from",
|
"fieldname": "amended_from",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -465,6 +470,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"collapsible_depends_on": "",
|
"collapsible_depends_on": "",
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "drop_ship",
|
"fieldname": "drop_ship",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -498,6 +504,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer",
|
"fieldname": "customer",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -532,6 +539,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer_name",
|
"fieldname": "customer_name",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -564,6 +572,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_19",
|
"fieldname": "column_break_19",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -596,6 +605,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer_contact_person",
|
"fieldname": "customer_contact_person",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -629,6 +639,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer_contact_display",
|
"fieldname": "customer_contact_display",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -661,6 +672,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer_contact_mobile",
|
"fieldname": "customer_contact_mobile",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -693,6 +705,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "customer_contact_email",
|
"fieldname": "customer_contact_email",
|
||||||
"fieldtype": "Code",
|
"fieldtype": "Code",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -726,6 +739,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "section_addresses",
|
"fieldname": "section_addresses",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -758,6 +772,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "supplier_address",
|
"fieldname": "supplier_address",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -790,6 +805,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "contact_person",
|
"fieldname": "contact_person",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -823,6 +839,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "address_display",
|
"fieldname": "address_display",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -854,6 +871,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "contact_display",
|
"fieldname": "contact_display",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -885,6 +903,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "contact_mobile",
|
"fieldname": "contact_mobile",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -916,6 +935,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "contact_email",
|
"fieldname": "contact_email",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -947,6 +967,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "col_break_address",
|
"fieldname": "col_break_address",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -979,6 +1000,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "shipping_address",
|
"fieldname": "shipping_address",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1012,6 +1034,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "shipping_address_display",
|
"fieldname": "shipping_address_display",
|
||||||
"fieldtype": "Small Text",
|
"fieldtype": "Small Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1044,6 +1067,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "currency_and_price_list",
|
"fieldname": "currency_and_price_list",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1076,6 +1100,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "currency",
|
"fieldname": "currency",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1111,6 +1136,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "",
|
"description": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "conversion_rate",
|
"fieldname": "conversion_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1145,6 +1171,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "cb_price_list",
|
"fieldname": "cb_price_list",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1175,6 +1202,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "buying_price_list",
|
"fieldname": "buying_price_list",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1207,6 +1235,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "price_list_currency",
|
"fieldname": "price_list_currency",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1239,6 +1268,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "plc_conversion_rate",
|
"fieldname": "plc_conversion_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1271,6 +1301,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "ignore_pricing_rule",
|
"fieldname": "ignore_pricing_rule",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1302,6 +1333,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "sec_warehouse",
|
"fieldname": "sec_warehouse",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1333,6 +1365,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "set_warehouse",
|
"fieldname": "set_warehouse",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1366,6 +1399,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "col_break_warehouse",
|
"fieldname": "col_break_warehouse",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1398,6 +1432,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"default": "No",
|
"default": "No",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "is_subcontracted",
|
"fieldname": "is_subcontracted",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1431,6 +1466,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "eval:doc.is_subcontracted==\"Yes\"",
|
"depends_on": "eval:doc.is_subcontracted==\"Yes\"",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "supplier_warehouse",
|
"fieldname": "supplier_warehouse",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1464,6 +1500,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "items_section",
|
"fieldname": "items_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1497,6 +1534,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "scan_barcode",
|
"fieldname": "scan_barcode",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1529,6 +1567,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "items",
|
"fieldname": "items",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1563,6 +1602,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "section_break_48",
|
"fieldname": "section_break_48",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1596,6 +1636,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"collapsible_depends_on": "",
|
"collapsible_depends_on": "",
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "pricing_rules",
|
"fieldname": "pricing_rules",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1630,6 +1671,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"collapsible_depends_on": "supplied_items",
|
"collapsible_depends_on": "supplied_items",
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "raw_material_details",
|
"fieldname": "raw_material_details",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1663,6 +1705,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "",
|
"depends_on": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "supplied_items",
|
"fieldname": "supplied_items",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1697,6 +1740,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "sb_last_purchase",
|
"fieldname": "sb_last_purchase",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1727,6 +1771,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "total_qty",
|
"fieldname": "total_qty",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1759,6 +1804,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_total",
|
"fieldname": "base_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1792,6 +1838,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_net_total",
|
"fieldname": "base_net_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1826,6 +1873,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_26",
|
"fieldname": "column_break_26",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1856,6 +1904,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "total",
|
"fieldname": "total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1889,6 +1938,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "net_total",
|
"fieldname": "net_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1923,6 +1973,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "total_net_weight",
|
"fieldname": "total_net_weight",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1955,6 +2006,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "taxes_section",
|
"fieldname": "taxes_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1989,6 +2041,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "",
|
"description": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "taxes_and_charges",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2023,6 +2076,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_50",
|
"fieldname": "column_break_50",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2054,6 +2108,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "shipping_rule",
|
"fieldname": "shipping_rule",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2087,6 +2142,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "section_break_52",
|
"fieldname": "section_break_52",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2118,6 +2174,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2152,6 +2209,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "sec_tax_breakup",
|
"fieldname": "sec_tax_breakup",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2184,6 +2242,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "other_charges_calculation",
|
"fieldname": "other_charges_calculation",
|
||||||
"fieldtype": "Text",
|
"fieldtype": "Text",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2216,6 +2275,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "totals",
|
"fieldname": "totals",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2249,6 +2309,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_taxes_and_charges_added",
|
"fieldname": "base_taxes_and_charges_added",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2283,6 +2344,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_taxes_and_charges_deducted",
|
"fieldname": "base_taxes_and_charges_deducted",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2317,6 +2379,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_total_taxes_and_charges",
|
"fieldname": "base_total_taxes_and_charges",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2351,6 +2414,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_39",
|
"fieldname": "column_break_39",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2382,6 +2446,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "taxes_and_charges_added",
|
"fieldname": "taxes_and_charges_added",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2416,6 +2481,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "taxes_and_charges_deducted",
|
"fieldname": "taxes_and_charges_deducted",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2450,6 +2516,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "total_taxes_and_charges",
|
"fieldname": "total_taxes_and_charges",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2484,6 +2551,7 @@
|
|||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"collapsible_depends_on": "discount_amount",
|
"collapsible_depends_on": "discount_amount",
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "discount_section",
|
"fieldname": "discount_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2517,6 +2585,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"default": "Grand Total",
|
"default": "Grand Total",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "apply_discount_on",
|
"fieldname": "apply_discount_on",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2550,6 +2619,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_discount_amount",
|
"fieldname": "base_discount_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2583,6 +2653,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_45",
|
"fieldname": "column_break_45",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2614,6 +2685,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "additional_discount_percentage",
|
"fieldname": "additional_discount_percentage",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2646,6 +2718,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "discount_amount",
|
"fieldname": "discount_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2679,6 +2752,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "totals_section",
|
"fieldname": "totals_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2710,6 +2784,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_grand_total",
|
"fieldname": "base_grand_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2744,6 +2819,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_rounding_adjustment",
|
"fieldname": "base_rounding_adjustment",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2778,6 +2854,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "In Words will be visible once you save the Purchase Order.",
|
"description": "In Words will be visible once you save the Purchase Order.",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_in_words",
|
"fieldname": "base_in_words",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2811,6 +2888,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "base_rounded_total",
|
"fieldname": "base_rounded_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2845,6 +2923,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break4",
|
"fieldname": "column_break4",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2876,6 +2955,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "grand_total",
|
"fieldname": "grand_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2910,6 +2990,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "rounding_adjustment",
|
"fieldname": "rounding_adjustment",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2943,6 +3024,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "rounded_total",
|
"fieldname": "rounded_total",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -2975,6 +3057,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "disable_rounded_total",
|
"fieldname": "disable_rounded_total",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3007,6 +3090,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "in_words",
|
"fieldname": "in_words",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3040,6 +3124,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "advance_paid",
|
"fieldname": "advance_paid",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3072,6 +3157,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "payment_schedule_section",
|
"fieldname": "payment_schedule_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3104,6 +3190,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "payment_terms_template",
|
"fieldname": "payment_terms_template",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3137,6 +3224,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "payment_schedule",
|
"fieldname": "payment_schedule",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3171,6 +3259,7 @@
|
|||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"collapsible_depends_on": "terms",
|
"collapsible_depends_on": "terms",
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "terms_section_break",
|
"fieldname": "terms_section_break",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3204,6 +3293,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "tc_name",
|
"fieldname": "tc_name",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3238,6 +3328,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "terms",
|
"fieldname": "terms",
|
||||||
"fieldtype": "Text Editor",
|
"fieldtype": "Text Editor",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3271,6 +3362,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "more_info",
|
"fieldname": "more_info",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3304,6 +3396,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"default": "Draft",
|
"default": "Draft",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "status",
|
"fieldname": "status",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3338,6 +3431,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "ref_sq",
|
"fieldname": "ref_sq",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -3371,6 +3465,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "party_account_currency",
|
"fieldname": "party_account_currency",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -3404,6 +3499,41 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "inter_company_order_reference",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Inter Company Order Reference",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Sales Order",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break_74",
|
"fieldname": "column_break_74",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3437,6 +3567,7 @@
|
|||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "eval:!doc.__islocal",
|
"depends_on": "eval:!doc.__islocal",
|
||||||
"description": "",
|
"description": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "per_received",
|
"fieldname": "per_received",
|
||||||
"fieldtype": "Percent",
|
"fieldtype": "Percent",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3472,6 +3603,7 @@
|
|||||||
"columns": 0,
|
"columns": 0,
|
||||||
"depends_on": "eval:!doc.__islocal",
|
"depends_on": "eval:!doc.__islocal",
|
||||||
"description": "",
|
"description": "",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "per_billed",
|
"fieldname": "per_billed",
|
||||||
"fieldtype": "Percent",
|
"fieldtype": "Percent",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3505,6 +3637,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "column_break5",
|
"fieldname": "column_break5",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3906,17 +4039,15 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 105,
|
"idx": 105,
|
||||||
"image_view": 0,
|
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2019-02-14 19:36:49.390935",
|
"modified": "2019-04-18 19:43:17.239390",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order",
|
"name": "Purchase Order",
|
||||||
@ -4001,7 +4132,6 @@
|
|||||||
],
|
],
|
||||||
"quick_entry": 0,
|
"quick_entry": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 1,
|
|
||||||
"search_fields": "status, transaction_date, supplier,grand_total",
|
"search_fields": "status, transaction_date, supplier,grand_total",
|
||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
|
|||||||
@ -17,6 +17,8 @@ from erpnext.accounts.party import get_party_account_currency
|
|||||||
from six import string_types
|
from six import string_types
|
||||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_doc,\
|
||||||
|
unlink_inter_company_doc
|
||||||
|
|
||||||
form_grid_templates = {
|
form_grid_templates = {
|
||||||
"items": "templates/form_grid/item_grid.html"
|
"items": "templates/form_grid/item_grid.html"
|
||||||
@ -56,6 +58,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
self.validate_bom_for_subcontracting_items()
|
self.validate_bom_for_subcontracting_items()
|
||||||
self.create_raw_materials_supplied("supplied_items")
|
self.create_raw_materials_supplied("supplied_items")
|
||||||
self.set_received_qty_for_drop_ship_items()
|
self.set_received_qty_for_drop_ship_items()
|
||||||
|
validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_order_reference)
|
||||||
|
|
||||||
def validate_with_previous_doc(self):
|
def validate_with_previous_doc(self):
|
||||||
super(PurchaseOrder, self).validate_with_previous_doc({
|
super(PurchaseOrder, self).validate_with_previous_doc({
|
||||||
@ -219,6 +222,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
|
|
||||||
self.update_blanket_order()
|
self.update_blanket_order()
|
||||||
|
|
||||||
|
update_linked_doc(self.doctype, self.name, self.inter_company_order_reference)
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
super(PurchaseOrder, self).on_cancel()
|
super(PurchaseOrder, self).on_cancel()
|
||||||
@ -244,6 +248,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
|
|
||||||
self.update_blanket_order()
|
self.update_blanket_order()
|
||||||
|
|
||||||
|
unlink_inter_company_doc(self.doctype, self.name, self.inter_company_order_reference)
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
pass
|
pass
|
||||||
@ -490,3 +495,9 @@ def update_status(status, name):
|
|||||||
po = frappe.get_doc("Purchase Order", name)
|
po = frappe.get_doc("Purchase Order", name)
|
||||||
po.update_status(status)
|
po.update_status(status)
|
||||||
po.update_delivered_qty_in_sales_order()
|
po.update_delivered_qty_in_sales_order()
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_inter_company_sales_order(source_name, target_doc=None):
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||||
|
return make_inter_company_transaction("Purchase Order", source_name, target_doc)
|
||||||
|
|
||||||
|
|||||||
@ -89,7 +89,8 @@ class AccountsController(TransactionBase):
|
|||||||
self.validate_paid_amount()
|
self.validate_paid_amount()
|
||||||
|
|
||||||
if self.doctype in ['Purchase Invoice', 'Sales Invoice']:
|
if self.doctype in ['Purchase Invoice', 'Sales Invoice']:
|
||||||
if cint(self.allocate_advances_automatically) and not cint(self.is_pos):
|
pos_check_field = "is_pos" if self.doctype=="Sales Invoice" else "is_paid"
|
||||||
|
if cint(self.allocate_advances_automatically) and not cint(self.get(pos_check_field)):
|
||||||
self.set_advances()
|
self.set_advances()
|
||||||
|
|
||||||
if self.is_return:
|
if self.is_return:
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 1,
|
"allow_rename": 1,
|
||||||
@ -20,6 +21,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "max_amount",
|
"fieldname": "max_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -29,7 +31,7 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Max Amount",
|
"label": "Max Exemption Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -39,7 +41,7 @@
|
|||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
@ -52,6 +54,8 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"default": "1",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "is_active",
|
"fieldname": "is_active",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -88,7 +92,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-06-19 16:33:48.419267",
|
"modified": "2019-04-25 13:20:31.367158",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Category",
|
"name": "Employee Tax Exemption Category",
|
||||||
@ -159,6 +163,7 @@
|
|||||||
"show_name_in_global_search": 0,
|
"show_name_in_global_search": 0,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 0,
|
||||||
"track_seen": 0
|
"track_seen": 0,
|
||||||
|
"track_views": 0
|
||||||
}
|
}
|
||||||
@ -10,6 +10,7 @@ frappe.ui.form.on('Employee Tax Exemption Declaration', {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query('payroll_period', function() {
|
frm.set_query('payroll_period', function() {
|
||||||
const fields = {'employee': 'Employee', 'company': 'Company'};
|
const fields = {'employee': 'Employee', 'company': 'Company'};
|
||||||
|
|
||||||
@ -27,6 +28,7 @@ frappe.ui.form.on('Employee Tax Exemption Declaration', {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query('exemption_sub_category', 'declarations', function() {
|
frm.set_query('exemption_sub_category', 'declarations', function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
@ -34,5 +36,16 @@ frappe.ui.form.on('Employee Tax Exemption Declaration', {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh: function(frm) {
|
||||||
|
if(frm.doc.docstatus==1) {
|
||||||
|
frm.add_custom_button(__('Submit Proof'), function() {
|
||||||
|
frappe.model.open_mapped_doc({
|
||||||
|
method: "erpnext.hr.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission",
|
||||||
|
frm: frm
|
||||||
|
});
|
||||||
|
}).addClass("btn-primary");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -55,9 +55,43 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fetch_from": "employee.company",
|
"fetch_from": "employee.employee_name",
|
||||||
"fetch_if_empty": 0,
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "company",
|
"fieldname": "employee_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Employee Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_from": "employee.department",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "department",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@ -66,15 +100,15 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Company",
|
"label": "Department",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Company",
|
"options": "Department",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 1,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -156,42 +190,9 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_from": "employee.company",
|
||||||
"fetch_if_empty": 0,
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "total_exemption_amount",
|
"fieldname": "company",
|
||||||
"fieldtype": "Currency",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Total Exemption Amount",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "employee.department",
|
|
||||||
"fetch_if_empty": 0,
|
|
||||||
"fieldname": "department",
|
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@ -200,15 +201,15 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Department",
|
"label": "Company",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Department",
|
"options": "Company",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -315,6 +316,136 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "section_break_10",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "total_declared_amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Total Declared Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "column_break_12",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "total_exemption_amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Total Exemption Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"has_web_view": 0,
|
||||||
@ -327,7 +458,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2019-04-23 15:50:48.693555",
|
"modified": "2019-04-25 16:38:05.847925",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Declaration",
|
"name": "Employee Tax Exemption Declaration",
|
||||||
|
|||||||
@ -6,28 +6,61 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from erpnext.hr.utils import validate_tax_declaration, calculate_annual_eligible_hra_exemption
|
from frappe.utils import flt
|
||||||
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
from erpnext.hr.utils import validate_tax_declaration, get_total_exemption_amount, calculate_annual_eligible_hra_exemption
|
||||||
|
|
||||||
|
class DuplicateDeclarationError(frappe.ValidationError): pass
|
||||||
|
|
||||||
class EmployeeTaxExemptionDeclaration(Document):
|
class EmployeeTaxExemptionDeclaration(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
validate_tax_declaration(self.declarations)
|
validate_tax_declaration(self.declarations)
|
||||||
self.total_exemption_amount = 0
|
self.validate_duplicate()
|
||||||
|
self.set_total_declared_amount()
|
||||||
|
self.set_total_exemption_amount()
|
||||||
self.calculate_hra_exemption()
|
self.calculate_hra_exemption()
|
||||||
for item in self.declarations:
|
|
||||||
self.total_exemption_amount += item.amount
|
|
||||||
|
|
||||||
def before_submit(self):
|
def validate_duplicate(self):
|
||||||
if frappe.db.exists({"doctype": "Employee Tax Exemption Declaration",
|
duplicate = frappe.db.get_value("Employee Tax Exemption Declaration",
|
||||||
"employee": self.employee,
|
filters = {
|
||||||
"payroll_period": self.payroll_period,
|
"employee": self.employee,
|
||||||
"docstatus": 1}):
|
"payroll_period": self.payroll_period,
|
||||||
frappe.throw(_("Tax Declaration of {0} for period {1} already submitted.")\
|
"name": ["!=", self.name]
|
||||||
.format(self.employee, self.payroll_period), frappe.DocstatusTransitionError)
|
}
|
||||||
|
)
|
||||||
|
if duplicate:
|
||||||
|
frappe.throw(_("Duplicate Tax Declaration of {0} for period {1}")
|
||||||
|
.format(self.employee, self.payroll_period), DuplicateDeclarationError)
|
||||||
|
|
||||||
|
def set_total_declared_amount(self):
|
||||||
|
self.total_declared_amount = 0.0
|
||||||
|
for d in self.declarations:
|
||||||
|
self.total_declared_amount += flt(d.amount)
|
||||||
|
|
||||||
|
def set_total_exemption_amount(self):
|
||||||
|
self.total_exemption_amount = get_total_exemption_amount(self.declarations)
|
||||||
|
|
||||||
def calculate_hra_exemption(self):
|
def calculate_hra_exemption(self):
|
||||||
hra_exemption = calculate_annual_eligible_hra_exemption(self)
|
self.salary_structure_hra, self.annual_hra_exemption, self.monthly_hra_exemption = 0, 0, 0
|
||||||
if hra_exemption:
|
if self.get("monthly_house_rent"):
|
||||||
self.total_exemption_amount += hra_exemption["annual_exemption"]
|
hra_exemption = calculate_annual_eligible_hra_exemption(self)
|
||||||
self.salary_structure_hra = hra_exemption["hra_amount"]
|
if hra_exemption:
|
||||||
self.annual_hra_exemption = hra_exemption["annual_exemption"]
|
self.total_exemption_amount += hra_exemption["annual_exemption"]
|
||||||
self.monthly_hra_exemption = hra_exemption["monthly_exemption"]
|
self.salary_structure_hra = hra_exemption["hra_amount"]
|
||||||
|
self.annual_hra_exemption = hra_exemption["annual_exemption"]
|
||||||
|
self.monthly_hra_exemption = hra_exemption["monthly_exemption"]
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_proof_submission(source_name, target_doc=None):
|
||||||
|
doclist = get_mapped_doc("Employee Tax Exemption Declaration", source_name, {
|
||||||
|
"Employee Tax Exemption Declaration": {
|
||||||
|
"doctype": "Employee Tax Exemption Proof Submission",
|
||||||
|
"field_no_map": ["monthly_house_rent", "monthly_hra_exemption"]
|
||||||
|
},
|
||||||
|
"Employee Tax Exemption Declaration Category": {
|
||||||
|
"doctype": "Employee Tax Exemption Proof Submission Detail",
|
||||||
|
"add_if_empty": True
|
||||||
|
}
|
||||||
|
}, target_doc)
|
||||||
|
|
||||||
|
return doclist
|
||||||
|
|||||||
@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe, erpnext
|
import frappe, erpnext
|
||||||
import unittest
|
import unittest
|
||||||
from erpnext.hr.doctype.employee.test_employee import make_employee
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
|
from erpnext.hr.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration import DuplicateDeclarationError
|
||||||
|
|
||||||
class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -15,71 +16,71 @@ class TestEmployeeTaxExemptionDeclaration(unittest.TestCase):
|
|||||||
create_exemption_category()
|
create_exemption_category()
|
||||||
frappe.db.sql("""delete from `tabEmployee Tax Exemption Declaration`""")
|
frappe.db.sql("""delete from `tabEmployee Tax Exemption Declaration`""")
|
||||||
|
|
||||||
def test_exemption_amount_greater_than_category_max(self):
|
|
||||||
declaration = frappe.get_doc({
|
|
||||||
"doctype": "Employee Tax Exemption Declaration",
|
|
||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
|
||||||
"payroll_period": "_Test Payroll Period",
|
|
||||||
"declarations": [dict(exemption_sub_category = "_Test Sub Category",
|
|
||||||
exemption_category = "_Test Category",
|
|
||||||
amount = 150000)]
|
|
||||||
})
|
|
||||||
self.assertRaises(frappe.ValidationError, declaration.save)
|
|
||||||
declaration = frappe.get_doc({
|
|
||||||
"doctype": "Employee Tax Exemption Declaration",
|
|
||||||
"payroll_period": "_Test Payroll Period",
|
|
||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
|
||||||
"declarations": [dict(exemption_sub_category = "_Test Sub Category",
|
|
||||||
exemption_category = "_Test Category",
|
|
||||||
amount = 90000)]
|
|
||||||
})
|
|
||||||
self.assertTrue(declaration.save)
|
|
||||||
|
|
||||||
def test_duplicate_category_in_declaration(self):
|
def test_duplicate_category_in_declaration(self):
|
||||||
declaration = frappe.get_doc({
|
declaration = frappe.get_doc({
|
||||||
"doctype": "Employee Tax Exemption Declaration",
|
"doctype": "Employee Tax Exemption Declaration",
|
||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
"declarations": [dict(exemption_sub_category = "_Test Sub Category",
|
"declarations": [
|
||||||
exemption_category = "_Test Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
amount = 100000),
|
exemption_category = "_Test Category",
|
||||||
dict(exemption_sub_category = "_Test Sub Category",
|
amount = 100000),
|
||||||
exemption_category = "_Test Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
amount = 50000),
|
exemption_category = "_Test Category",
|
||||||
]
|
amount = 50000)
|
||||||
|
]
|
||||||
})
|
})
|
||||||
self.assertRaises(frappe.ValidationError, declaration.save)
|
self.assertRaises(frappe.ValidationError, declaration.save)
|
||||||
|
|
||||||
def test_duplicate_submission_for_payroll_period(self):
|
def test_duplicate_entry_for_payroll_period(self):
|
||||||
declaration = frappe.get_doc({
|
declaration = frappe.get_doc({
|
||||||
"doctype": "Employee Tax Exemption Declaration",
|
"doctype": "Employee Tax Exemption Declaration",
|
||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
"declarations": [dict(exemption_sub_category = "_Test Sub Category",
|
"declarations": [
|
||||||
exemption_category = "_Test Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
amount = 100000),
|
exemption_category = "_Test Category",
|
||||||
dict(exemption_sub_category = "_Test1 Sub Category",
|
amount = 100000),
|
||||||
exemption_category = "_Test Category",
|
dict(exemption_sub_category = "_Test1 Sub Category",
|
||||||
amount = 50000),
|
exemption_category = "_Test Category",
|
||||||
]
|
amount = 50000),
|
||||||
|
]
|
||||||
}).insert()
|
}).insert()
|
||||||
declaration.submit()
|
|
||||||
self.assertEquals(declaration.docstatus, 1)
|
|
||||||
duplicate_declaration = frappe.get_doc({
|
duplicate_declaration = frappe.get_doc({
|
||||||
"doctype": "Employee Tax Exemption Declaration",
|
"doctype": "Employee Tax Exemption Declaration",
|
||||||
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
"company": erpnext.get_default_company(),
|
"company": erpnext.get_default_company(),
|
||||||
"payroll_period": "_Test Payroll Period",
|
"payroll_period": "_Test Payroll Period",
|
||||||
"declarations": [dict(exemption_sub_category = "_Test Sub Category",
|
"declarations": [
|
||||||
exemption_category = "_Test Category",
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
amount = 100000)
|
exemption_category = "_Test Category",
|
||||||
]
|
amount = 100000)
|
||||||
}).insert()
|
]
|
||||||
self.assertRaises(frappe.DocstatusTransitionError, duplicate_declaration.submit)
|
})
|
||||||
|
self.assertRaises(DuplicateDeclarationError, duplicate_declaration.insert)
|
||||||
duplicate_declaration.employee = frappe.get_value("Employee", {"user_id":"employee1@taxexepmtion.com"}, "name")
|
duplicate_declaration.employee = frappe.get_value("Employee", {"user_id":"employee1@taxexepmtion.com"}, "name")
|
||||||
self.assertTrue(duplicate_declaration.submit)
|
self.assertTrue(duplicate_declaration.insert)
|
||||||
|
|
||||||
|
def test_exemption_amount(self):
|
||||||
|
declaration = frappe.get_doc({
|
||||||
|
"doctype": "Employee Tax Exemption Declaration",
|
||||||
|
"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
|
||||||
|
"company": erpnext.get_default_company(),
|
||||||
|
"payroll_period": "_Test Payroll Period",
|
||||||
|
"declarations": [
|
||||||
|
dict(exemption_sub_category = "_Test Sub Category",
|
||||||
|
exemption_category = "_Test Category",
|
||||||
|
amount = 80000),
|
||||||
|
dict(exemption_sub_category = "_Test1 Sub Category",
|
||||||
|
exemption_category = "_Test Category",
|
||||||
|
amount = 60000),
|
||||||
|
]
|
||||||
|
}).insert()
|
||||||
|
|
||||||
|
self.assertEqual(declaration.total_exemption_amount, 100000)
|
||||||
|
|
||||||
def create_payroll_period():
|
def create_payroll_period():
|
||||||
if not frappe.db.exists("Payroll Period", "_Test Payroll Period"):
|
if not frappe.db.exists("Payroll Period", "_Test Payroll Period"):
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
@ -19,6 +20,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_sub_category",
|
"fieldname": "exemption_sub_category",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -53,6 +55,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fetch_from": "exemption_sub_category.exemption_category",
|
"fetch_from": "exemption_sub_category.exemption_category",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_category",
|
"fieldname": "exemption_category",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -70,7 +73,7 @@
|
|||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 1,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -86,7 +89,9 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "amount",
|
"fetch_from": "exemption_sub_category.max_amount",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "max_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@ -95,7 +100,40 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Amount",
|
"label": "Maximum Exemption Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "amount",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Declared Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -122,7 +160,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-05-29 15:58:05.779031",
|
"modified": "2019-04-25 15:45:11.279158",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Declaration Category",
|
"name": "Employee Tax Exemption Declaration Category",
|
||||||
@ -136,5 +174,6 @@
|
|||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 1,
|
||||||
"track_seen": 0
|
"track_seen": 0,
|
||||||
|
"track_views": 0
|
||||||
}
|
}
|
||||||
@ -10,6 +10,7 @@ frappe.ui.form.on('Employee Tax Exemption Proof Submission', {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query('payroll_period', function() {
|
frm.set_query('payroll_period', function() {
|
||||||
if(frm.doc.employee && frm.doc.company){
|
if(frm.doc.employee && frm.doc.company){
|
||||||
return {
|
return {
|
||||||
@ -21,6 +22,7 @@ frappe.ui.form.on('Employee Tax Exemption Proof Submission', {
|
|||||||
frappe.msgprint(__("Please select Employee"));
|
frappe.msgprint(__("Please select Employee"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frm.set_query('exemption_sub_category', 'tax_exemption_proofs', function() {
|
frm.set_query('exemption_sub_category', 'tax_exemption_proofs', function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
@ -29,11 +31,28 @@ frappe.ui.form.on('Employee Tax Exemption Proof Submission', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
employee: function(frm){
|
|
||||||
if(frm.doc.employee){
|
refresh: function(frm) {
|
||||||
frm.add_fetch('employee', 'company', 'company');
|
if(frm.doc.docstatus === 0) {
|
||||||
}else{
|
let filters = {
|
||||||
frm.set_value('company', '');
|
docstatus: 1,
|
||||||
|
company: frm.doc.company
|
||||||
|
};
|
||||||
|
if(frm.doc.employee) filters["employee"] = frm.doc.employee;
|
||||||
|
if(frm.doc.payroll_period) filters["payroll_period"] = frm.doc.payroll_period;
|
||||||
|
|
||||||
|
frm.add_custom_button(__('Get Details From Declaration'), function() {
|
||||||
|
erpnext.utils.map_current_doc({
|
||||||
|
method: "erpnext.hr.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission",
|
||||||
|
source_doctype: "Employee Tax Exemption Declaration",
|
||||||
|
target: frm,
|
||||||
|
date_field: "creation",
|
||||||
|
setters: {
|
||||||
|
employee: frm.doc.employee || undefined
|
||||||
|
},
|
||||||
|
get_query_filters: filters
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 1,
|
||||||
"allow_rename": 0,
|
"allow_rename": 1,
|
||||||
"autoname": "HR-TAX-PRF-.YYYY.-.#####",
|
"autoname": "HR-TAX-PRF-.YYYY.-.#####",
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
"creation": "2018-04-13 17:24:11.456132",
|
"creation": "2018-04-13 17:24:11.456132",
|
||||||
@ -20,6 +21,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "employee",
|
"fieldname": "employee",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -53,8 +55,10 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "company",
|
"fetch_from": "employee.employee_name",
|
||||||
"fieldtype": "Link",
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "employee_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@ -62,10 +66,9 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Company",
|
"label": "Employee Name",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Company",
|
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -79,70 +82,6 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_2",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "payroll_period",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Payroll Period",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Payroll Period",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
@ -151,6 +90,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fetch_from": "employee.department",
|
"fetch_from": "employee.department",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "department",
|
"fieldname": "department",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -184,8 +124,9 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "submission_date",
|
"fetch_if_empty": 0,
|
||||||
"fieldtype": "Date",
|
"fieldname": "column_break_2",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@ -193,7 +134,6 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Submission Date",
|
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -216,6 +156,273 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"default": "Today",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "submission_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Submission Date",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "payroll_period",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Payroll Period",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Payroll Period",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_from": "employee.company",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "company",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Company",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Company",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "section_break_5",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "tax_exemption_proofs",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Tax Exemption Proofs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Employee Tax Exemption Proof Submission Detail",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "section_break_10",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "total_actual_amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Total Actual Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "column_break_12",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_amount",
|
"fieldname": "exemption_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -248,70 +455,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "section_break_5",
|
"fetch_if_empty": 0,
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "tax_exemption_proofs",
|
|
||||||
"fieldtype": "Table",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Tax Exemption Proofs",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee Tax Exemption Proof Submission Detail",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "attachment_section",
|
"fieldname": "attachment_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -344,6 +488,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "attachments",
|
"fieldname": "attachments",
|
||||||
"fieldtype": "Attach",
|
"fieldtype": "Attach",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -376,6 +521,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "amended_from",
|
"fieldname": "amended_from",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -412,7 +558,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-08-21 16:15:38.096846",
|
"modified": "2019-04-25 17:06:36.569549",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Proof Submission",
|
"name": "Employee Tax Exemption Proof Submission",
|
||||||
|
|||||||
@ -6,20 +6,30 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from erpnext.hr.utils import validate_tax_declaration, calculate_hra_exemption_for_period
|
from frappe.utils import flt
|
||||||
|
from erpnext.hr.utils import validate_tax_declaration, get_total_exemption_amount, calculate_hra_exemption_for_period
|
||||||
|
|
||||||
class EmployeeTaxExemptionProofSubmission(Document):
|
class EmployeeTaxExemptionProofSubmission(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
validate_tax_declaration(self.tax_exemption_proofs)
|
validate_tax_declaration(self.tax_exemption_proofs)
|
||||||
self.exemption_amount = 0
|
self.set_total_actual_amount()
|
||||||
|
self.set_total_exemption_amount()
|
||||||
self.calculate_hra_exemption()
|
self.calculate_hra_exemption()
|
||||||
for proof in self.tax_exemption_proofs:
|
|
||||||
self.exemption_amount += proof.amount
|
def set_total_actual_amount(self):
|
||||||
|
self.total_actual_amount = flt(self.get("house_rent_payment_amount"))
|
||||||
|
for d in self.tax_exemption_proofs:
|
||||||
|
self.total_actual_amount += flt(d.amount)
|
||||||
|
|
||||||
|
def set_total_exemption_amount(self):
|
||||||
|
self.exemption_amount = get_total_exemption_amount(self.tax_exemption_proofs)
|
||||||
|
|
||||||
def calculate_hra_exemption(self):
|
def calculate_hra_exemption(self):
|
||||||
hra_exemption = calculate_hra_exemption_for_period(self)
|
self.monthly_hra_exemption, self.monthly_house_rent, self.total_eligible_hra_exemption = 0, 0, 0
|
||||||
if hra_exemption:
|
if self.get("house_rent_payment_amount"):
|
||||||
self.exemption_amount += hra_exemption["total_eligible_hra_exemption"]
|
hra_exemption = calculate_hra_exemption_for_period(self)
|
||||||
self.monthly_hra_exemption = hra_exemption["monthly_exemption"]
|
if hra_exemption:
|
||||||
self.monthly_house_rent = hra_exemption["monthly_house_rent"]
|
self.exemption_amount += hra_exemption["total_eligible_hra_exemption"]
|
||||||
self.total_eligible_hra_exemption = hra_exemption["total_eligible_hra_exemption"]
|
self.monthly_hra_exemption = hra_exemption["monthly_exemption"]
|
||||||
|
self.monthly_house_rent = hra_exemption["monthly_house_rent"]
|
||||||
|
self.total_eligible_hra_exemption = hra_exemption["total_eligible_hra_exemption"]
|
||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
@ -14,10 +15,12 @@
|
|||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_sub_category",
|
"fieldname": "exemption_sub_category",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -46,11 +49,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fetch_from": "exemption_sub_category.exemption_category",
|
"fetch_from": "exemption_sub_category.exemption_category",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_category",
|
"fieldname": "exemption_category",
|
||||||
"fieldtype": "Read Only",
|
"fieldtype": "Read Only",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -79,10 +84,46 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_from": "exemption_sub_category.max_amount",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "max_amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Maximum Exemption Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "type_of_proof",
|
"fieldname": "type_of_proof",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -111,10 +152,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "amount",
|
"fieldname": "amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -124,7 +167,7 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Amount",
|
"label": "Actual Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -134,7 +177,7 @@
|
|||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
@ -151,7 +194,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-05-16 22:42:59.750733",
|
"modified": "2019-04-25 15:45:03.154904",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Proof Submission Detail",
|
"name": "Employee Tax Exemption Proof Submission Detail",
|
||||||
@ -165,5 +208,6 @@
|
|||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 1,
|
||||||
"track_seen": 0
|
"track_seen": 0,
|
||||||
|
"track_views": 0
|
||||||
}
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 1,
|
"allow_rename": 1,
|
||||||
@ -15,10 +16,12 @@
|
|||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "exemption_category",
|
"fieldname": "exemption_category",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -26,8 +29,8 @@
|
|||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 1,
|
||||||
"label": "Tax Exemption Category",
|
"label": "Tax Exemption Category",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
@ -42,14 +45,18 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_from": "exemption_category.max_amount",
|
||||||
|
"fetch_if_empty": 1,
|
||||||
"fieldname": "max_amount",
|
"fieldname": "max_amount",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -59,7 +66,7 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Max Amount",
|
"label": "Max Exemption Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -69,17 +76,21 @@
|
|||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"default": "1",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "is_active",
|
"fieldname": "is_active",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -102,6 +113,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -115,7 +127,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-05-09 13:25:01.595240",
|
"modified": "2019-04-25 13:24:05.164877",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Tax Exemption Sub Category",
|
"name": "Employee Tax Exemption Sub Category",
|
||||||
@ -124,7 +136,6 @@
|
|||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"apply_user_permissions": 0,
|
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
@ -144,7 +155,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"apply_user_permissions": 0,
|
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
@ -164,7 +174,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"apply_user_permissions": 0,
|
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
@ -189,6 +198,7 @@
|
|||||||
"show_name_in_global_search": 0,
|
"show_name_in_global_search": 0,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 0,
|
||||||
"track_seen": 0
|
"track_seen": 0,
|
||||||
|
"track_views": 0
|
||||||
}
|
}
|
||||||
@ -4,7 +4,13 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from frappe.utils import flt
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class EmployeeTaxExemptionSubCategory(Document):
|
class EmployeeTaxExemptionSubCategory(Document):
|
||||||
pass
|
def validate(self):
|
||||||
|
category_max_amount = frappe.db.get_value("Employee Tax Exemption Category", self.exemption_category, "max_amount")
|
||||||
|
if flt(self.max_amount) > flt(category_max_amount):
|
||||||
|
frappe.throw(_("Max Exemption Amount cannot be greater than maximum exemption amount {0} of Tax Exemption Category {1}")
|
||||||
|
.format(category_max_amount, self.exemption_category))
|
||||||
@ -13,7 +13,8 @@ from frappe.utils import getdate, nowdate, add_days, add_months, flt, get_first_
|
|||||||
from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip
|
from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip
|
||||||
from erpnext.hr.doctype.payroll_entry.payroll_entry import get_month_details
|
from erpnext.hr.doctype.payroll_entry.payroll_entry import get_month_details
|
||||||
from erpnext.hr.doctype.employee.test_employee import make_employee
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
from erpnext.hr.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration import create_payroll_period, create_exemption_category
|
from erpnext.hr.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration \
|
||||||
|
import create_payroll_period, create_exemption_category
|
||||||
|
|
||||||
class TestSalarySlip(unittest.TestCase):
|
class TestSalarySlip(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -36,8 +37,10 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
no_of_days = self.get_no_of_days()
|
no_of_days = self.get_no_of_days()
|
||||||
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
|
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_employee@salary.com")
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
||||||
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
|
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0])
|
self.assertEqual(ss.total_working_days, no_of_days[0])
|
||||||
@ -53,8 +56,10 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
no_of_days = self.get_no_of_days()
|
no_of_days = self.get_no_of_days()
|
||||||
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
|
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_employee@salary.com")
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
||||||
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
|
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
||||||
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
ss = make_employee_salary_slip("test_employee@salary.com", "Monthly")
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0] - no_of_days[1])
|
self.assertEqual(ss.total_working_days, no_of_days[0] - no_of_days[1])
|
||||||
@ -100,16 +105,21 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
self.assertEqual(ss.payment_days, (no_of_days[0] - getdate(date_of_joining).day + 1))
|
self.assertEqual(ss.payment_days, (no_of_days[0] - getdate(date_of_joining).day + 1))
|
||||||
|
|
||||||
# set relieving date in the same month
|
# set relieving date in the same month
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "date_of_joining", (add_days(nowdate(),-60)))
|
frappe.db.set_value("Employee",frappe.get_value("Employee",
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", relieving_date)
|
{"employee_name":"test_employee@salary.com"}, "name"), "date_of_joining", (add_days(nowdate(),-60)))
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Left")
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
|
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", relieving_date)
|
||||||
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
|
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Left")
|
||||||
ss.save()
|
ss.save()
|
||||||
|
|
||||||
self.assertEqual(ss.total_working_days, no_of_days[0])
|
self.assertEqual(ss.total_working_days, no_of_days[0])
|
||||||
self.assertEqual(ss.payment_days, getdate(relieving_date).day)
|
self.assertEqual(ss.payment_days, getdate(relieving_date).day)
|
||||||
|
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
{"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None)
|
||||||
|
frappe.db.set_value("Employee", frappe.get_value("Employee",
|
||||||
|
{"employee_name":"test_employee@salary.com"}, "name"), "status", "Active")
|
||||||
|
|
||||||
def test_employee_salary_slip_read_permission(self):
|
def test_employee_salary_slip_read_permission(self):
|
||||||
make_employee("test_employee@salary.com")
|
make_employee("test_employee@salary.com")
|
||||||
@ -168,17 +178,22 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
|
|
||||||
def test_tax_for_payroll_period(self):
|
def test_tax_for_payroll_period(self):
|
||||||
data = {}
|
data = {}
|
||||||
# test the impact of tax exemption declaration, tax exemption proof submission and deduct check boxes in annual tax calculation
|
# test the impact of tax exemption declaration, tax exemption proof submission
|
||||||
|
# and deduct check boxes in annual tax calculation
|
||||||
# as per assigned salary structure 40500 in monthly salary so 236000*5/100/12
|
# as per assigned salary structure 40500 in monthly salary so 236000*5/100/12
|
||||||
frappe.db.sql("""delete from `tabPayroll Period`""")
|
frappe.db.sql("""delete from `tabPayroll Period`""")
|
||||||
frappe.db.sql("""delete from `tabSalary Component`""")
|
frappe.db.sql("""delete from `tabSalary Component`""")
|
||||||
payroll_period = create_payroll_period()
|
payroll_period = create_payroll_period()
|
||||||
create_tax_slab(payroll_period)
|
create_tax_slab(payroll_period)
|
||||||
employee = make_employee("test_tax@salary.slip")
|
employee = make_employee("test_tax@salary.slip")
|
||||||
delete_docs = ["Salary Slip", "Additional Salary",
|
delete_docs = [
|
||||||
"Employee Tax Exemption Declaration",
|
"Salary Slip",
|
||||||
"Employee Tax Exemption Proof Submission",
|
"Additional Salary",
|
||||||
"Employee Benefit Claim", "Salary Structure Assignment"]
|
"Employee Tax Exemption Declaration",
|
||||||
|
"Employee Tax Exemption Proof Submission",
|
||||||
|
"Employee Benefit Claim",
|
||||||
|
"Salary Structure Assignment"
|
||||||
|
]
|
||||||
for doc in delete_docs:
|
for doc in delete_docs:
|
||||||
frappe.db.sql("delete from `tab%s` where employee='%s'" % (doc, employee))
|
frappe.db.sql("delete from `tab%s` where employee='%s'" % (doc, employee))
|
||||||
|
|
||||||
@ -298,12 +313,11 @@ def make_employee_salary_slip(user, payroll_frequency, salary_structure=None):
|
|||||||
|
|
||||||
if not salary_slip:
|
if not salary_slip:
|
||||||
salary_slip = make_salary_slip(salary_structure_doc.name, employee = employee)
|
salary_slip = make_salary_slip(salary_structure_doc.name, employee = employee)
|
||||||
salary_slip.employee_name = frappe.get_value("Employee", {"name":frappe.db.get_value("Employee", {"user_id": user})}, "employee_name")
|
salary_slip.employee_name = frappe.get_value("Employee",
|
||||||
|
{"name":frappe.db.get_value("Employee", {"user_id": user})}, "employee_name")
|
||||||
salary_slip.payroll_frequency = payroll_frequency
|
salary_slip.payroll_frequency = payroll_frequency
|
||||||
salary_slip.posting_date = nowdate()
|
salary_slip.posting_date = nowdate()
|
||||||
salary_slip.insert()
|
salary_slip.insert()
|
||||||
# salary_slip.submit()
|
|
||||||
# salary_slip = salary_slip.name
|
|
||||||
|
|
||||||
return salary_slip
|
return salary_slip
|
||||||
|
|
||||||
@ -338,99 +352,99 @@ def create_account(company):
|
|||||||
salary_account = frappe.db.get_value("Account", "Salary - " + frappe.get_cached_value('Company', company, 'abbr'))
|
salary_account = frappe.db.get_value("Account", "Salary - " + frappe.get_cached_value('Company', company, 'abbr'))
|
||||||
if not salary_account:
|
if not salary_account:
|
||||||
frappe.get_doc({
|
frappe.get_doc({
|
||||||
"doctype": "Account",
|
"doctype": "Account",
|
||||||
"account_name": "Salary",
|
"account_name": "Salary",
|
||||||
"parent_account": "Indirect Expenses - " + frappe.get_cached_value('Company', company, 'abbr'),
|
"parent_account": "Indirect Expenses - " + frappe.get_cached_value('Company', company, 'abbr'),
|
||||||
"company": company
|
"company": company
|
||||||
}).insert()
|
}).insert()
|
||||||
return salary_account
|
return salary_account
|
||||||
|
|
||||||
def make_earning_salary_component(setup=False, test_tax=False):
|
def make_earning_salary_component(setup=False, test_tax=False):
|
||||||
data = [
|
data = [
|
||||||
|
{
|
||||||
|
"salary_component": 'Basic Salary',
|
||||||
|
"abbr":'BS',
|
||||||
|
"condition": 'base > 10000',
|
||||||
|
"formula": 'base*.5',
|
||||||
|
"type": "Earning",
|
||||||
|
"amount_based_on_formula": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"salary_component": 'HRA',
|
||||||
|
"abbr":'H',
|
||||||
|
"amount": 3000,
|
||||||
|
"type": "Earning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"salary_component": 'Special Allowance',
|
||||||
|
"abbr":'SA',
|
||||||
|
"condition": 'H < 10000',
|
||||||
|
"formula": 'BS*.5',
|
||||||
|
"type": "Earning",
|
||||||
|
"amount_based_on_formula": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"salary_component": "Leave Encashment",
|
||||||
|
"abbr": 'LE',
|
||||||
|
"is_additional_component": 1,
|
||||||
|
"type": "Earning"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
if test_tax:
|
||||||
|
data.extend([
|
||||||
{
|
{
|
||||||
"salary_component": 'Basic Salary',
|
"salary_component": "Leave Travel Allowance",
|
||||||
"abbr":'BS',
|
"abbr": 'B',
|
||||||
"condition": 'base > 10000',
|
"is_flexible_benefit": 1,
|
||||||
"formula": 'base*.5',
|
|
||||||
"type": "Earning",
|
"type": "Earning",
|
||||||
"amount_based_on_formula": 1
|
"pay_against_benefit_claim": 1,
|
||||||
|
"max_benefit_amount": 100000
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"salary_component": 'HRA',
|
"salary_component": "Medical Allowance",
|
||||||
"abbr":'H',
|
"abbr": 'B',
|
||||||
"amount": 3000,
|
"is_flexible_benefit": 1,
|
||||||
"type": "Earning"
|
"pay_against_benefit_claim": 0,
|
||||||
},
|
|
||||||
{
|
|
||||||
"salary_component": 'Special Allowance',
|
|
||||||
"abbr":'SA',
|
|
||||||
"condition": 'H < 10000',
|
|
||||||
"formula": 'BS*.5',
|
|
||||||
"type": "Earning",
|
"type": "Earning",
|
||||||
"amount_based_on_formula": 1
|
"max_benefit_amount": 15000
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"salary_component": "Leave Encashment",
|
"salary_component": "Perfomance Bonus",
|
||||||
"abbr": 'LE',
|
"abbr": 'B',
|
||||||
"is_additional_component": 1,
|
"is_additional_component": 1,
|
||||||
"type": "Earning"
|
"type": "Earning"
|
||||||
}
|
}
|
||||||
]
|
])
|
||||||
if test_tax:
|
|
||||||
data.extend([
|
|
||||||
{
|
|
||||||
"salary_component": "Leave Travel Allowance",
|
|
||||||
"abbr": 'B',
|
|
||||||
"is_flexible_benefit": 1,
|
|
||||||
"type": "Earning",
|
|
||||||
"pay_against_benefit_claim": 1,
|
|
||||||
"max_benefit_amount": 100000
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"salary_component": "Medical Allowance",
|
|
||||||
"abbr": 'B',
|
|
||||||
"is_flexible_benefit": 1,
|
|
||||||
"pay_against_benefit_claim": 0,
|
|
||||||
"type": "Earning",
|
|
||||||
"max_benefit_amount": 15000
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"salary_component": "Perfomance Bonus",
|
|
||||||
"abbr": 'B',
|
|
||||||
"is_additional_component": 1,
|
|
||||||
"type": "Earning"
|
|
||||||
}
|
|
||||||
])
|
|
||||||
if setup or test_tax:
|
if setup or test_tax:
|
||||||
make_salary_component(data, test_tax)
|
make_salary_component(data, test_tax)
|
||||||
data.append({
|
data.append({
|
||||||
"salary_component": 'Basic Salary',
|
"salary_component": 'Basic Salary',
|
||||||
"abbr":'BS',
|
"abbr":'BS',
|
||||||
"condition": 'base < 10000',
|
"condition": 'base < 10000',
|
||||||
"formula": 'base*.2',
|
"formula": 'base*.2',
|
||||||
"type": "Earning",
|
"type": "Earning",
|
||||||
"amount_based_on_formula": 1
|
"amount_based_on_formula": 1
|
||||||
})
|
})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def make_deduction_salary_component(setup=False, test_tax=False):
|
def make_deduction_salary_component(setup=False, test_tax=False):
|
||||||
data = [
|
data = [
|
||||||
{
|
{
|
||||||
"salary_component": 'Professional Tax',
|
"salary_component": 'Professional Tax',
|
||||||
"abbr":'PT',
|
"abbr":'PT',
|
||||||
"condition": 'base > 10000',
|
"condition": 'base > 10000',
|
||||||
"formula": 'base*.1',
|
"formula": 'base*.1',
|
||||||
"type": "Deduction",
|
"type": "Deduction",
|
||||||
"amount_based_on_formula": 1
|
"amount_based_on_formula": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"salary_component": 'TDS',
|
"salary_component": 'TDS',
|
||||||
"abbr":'T',
|
"abbr":'T',
|
||||||
"formula": 'base*.1',
|
"formula": 'base*.1',
|
||||||
"type": "Deduction",
|
"type": "Deduction",
|
||||||
"amount_based_on_formula": 1
|
"amount_based_on_formula": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
if not test_tax:
|
if not test_tax:
|
||||||
data.append({
|
data.append({
|
||||||
"salary_component": 'TDS',
|
"salary_component": 'TDS',
|
||||||
@ -453,48 +467,63 @@ def get_tax_paid_in_period(employee):
|
|||||||
|
|
||||||
def create_exemption_declaration(employee, payroll_period):
|
def create_exemption_declaration(employee, payroll_period):
|
||||||
create_exemption_category()
|
create_exemption_category()
|
||||||
declaration = frappe.get_doc({"doctype": "Employee Tax Exemption Declaration",
|
declaration = frappe.get_doc({
|
||||||
"employee": employee,
|
"doctype": "Employee Tax Exemption Declaration",
|
||||||
"payroll_period": payroll_period,
|
"employee": employee,
|
||||||
"company": erpnext.get_default_company()})
|
"payroll_period": payroll_period,
|
||||||
declaration.append("declarations", {"exemption_sub_category": "_Test Sub Category",
|
"company": erpnext.get_default_company()
|
||||||
"exemption_category": "_Test Category",
|
})
|
||||||
"amount": 100000})
|
declaration.append("declarations", {
|
||||||
|
"exemption_sub_category": "_Test Sub Category",
|
||||||
|
"exemption_category": "_Test Category",
|
||||||
|
"amount": 100000
|
||||||
|
})
|
||||||
declaration.submit()
|
declaration.submit()
|
||||||
|
|
||||||
def create_proof_submission(employee, payroll_period, amount):
|
def create_proof_submission(employee, payroll_period, amount):
|
||||||
submission_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
submission_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
||||||
proof_submission = frappe.get_doc({"doctype": "Employee Tax Exemption Proof Submission",
|
proof_submission = frappe.get_doc({
|
||||||
"employee": employee,
|
"doctype": "Employee Tax Exemption Proof Submission",
|
||||||
"payroll_period": payroll_period.name,
|
"employee": employee,
|
||||||
"submission_date": submission_date})
|
"payroll_period": payroll_period.name,
|
||||||
proof_submission.append("tax_exemption_proofs", {"exemption_sub_category": "_Test Sub Category",
|
"submission_date": submission_date
|
||||||
"exemption_category": "_Test Category", "type_of_proof": "Test", "amount": amount})
|
})
|
||||||
|
proof_submission.append("tax_exemption_proofs", {
|
||||||
|
"exemption_sub_category": "_Test Sub Category",
|
||||||
|
"exemption_category": "_Test Category",
|
||||||
|
"type_of_proof": "Test", "amount": amount
|
||||||
|
})
|
||||||
proof_submission.submit()
|
proof_submission.submit()
|
||||||
return submission_date
|
return submission_date
|
||||||
|
|
||||||
def create_benefit_claim(employee, payroll_period, amount, component):
|
def create_benefit_claim(employee, payroll_period, amount, component):
|
||||||
claim_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
claim_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
||||||
frappe.get_doc({"doctype": "Employee Benefit Claim", "employee": employee,
|
frappe.get_doc({
|
||||||
"claimed_amount": amount, "claim_date": claim_date, "earning_component":
|
"doctype": "Employee Benefit Claim",
|
||||||
component}).submit()
|
"employee": employee,
|
||||||
|
"claimed_amount": amount,
|
||||||
|
"claim_date": claim_date,
|
||||||
|
"earning_component": component
|
||||||
|
}).submit()
|
||||||
return claim_date
|
return claim_date
|
||||||
|
|
||||||
def create_tax_slab(payroll_period):
|
def create_tax_slab(payroll_period):
|
||||||
data = [{
|
data = [
|
||||||
"from_amount": 250000,
|
{
|
||||||
"to_amount": 500000,
|
"from_amount": 250000,
|
||||||
"percent_deduction": 5
|
"to_amount": 500000,
|
||||||
},
|
"percent_deduction": 5
|
||||||
{
|
},
|
||||||
"from_amount": 500000,
|
{
|
||||||
"to_amount": 1000000,
|
"from_amount": 500000,
|
||||||
"percent_deduction": 20
|
"to_amount": 1000000,
|
||||||
},
|
"percent_deduction": 20
|
||||||
{
|
},
|
||||||
"from_amount": 1000000,
|
{
|
||||||
"percent_deduction": 30
|
"from_amount": 1000000,
|
||||||
}]
|
"percent_deduction": 30
|
||||||
|
}
|
||||||
|
]
|
||||||
payroll_period.taxable_salary_slabs = []
|
payroll_period.taxable_salary_slabs = []
|
||||||
for item in data:
|
for item in data:
|
||||||
payroll_period.append("taxable_salary_slabs", item)
|
payroll_period.append("taxable_salary_slabs", item)
|
||||||
@ -526,9 +555,13 @@ def create_salary_slips_for_payroll_period(employee, salary_structure, payroll_p
|
|||||||
|
|
||||||
def create_additional_salary(employee, payroll_period, amount):
|
def create_additional_salary(employee, payroll_period, amount):
|
||||||
salary_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
salary_date = add_months(payroll_period.start_date, random.randint(0, 11))
|
||||||
frappe.get_doc({"doctype": "Additional Salary", "employee": employee,
|
frappe.get_doc({
|
||||||
"company": erpnext.get_default_company(),
|
"doctype": "Additional Salary",
|
||||||
"salary_component": "Perfomance Bonus",
|
"employee": employee,
|
||||||
"payroll_date": salary_date,
|
"company": erpnext.get_default_company(),
|
||||||
"amount": amount, "type": "Earning"}).submit()
|
"salary_component": "Perfomance Bonus",
|
||||||
|
"payroll_date": salary_date,
|
||||||
|
"amount": amount,
|
||||||
|
"type": "Earning"
|
||||||
|
}).submit()
|
||||||
return salary_date
|
return salary_date
|
||||||
|
|||||||
@ -221,16 +221,30 @@ def get_employee_leave_policy(employee):
|
|||||||
|
|
||||||
def validate_tax_declaration(declarations):
|
def validate_tax_declaration(declarations):
|
||||||
subcategories = []
|
subcategories = []
|
||||||
for declaration in declarations:
|
for d in declarations:
|
||||||
if declaration.exemption_sub_category in subcategories:
|
if d.exemption_sub_category in subcategories:
|
||||||
frappe.throw(_("More than one selection for {0} not \
|
frappe.throw(_("More than one selection for {0} not allowed").format(d.exemption_sub_category))
|
||||||
allowed").format(declaration.exemption_sub_category), frappe.ValidationError)
|
subcategories.append(d.exemption_sub_category)
|
||||||
subcategories.append(declaration.exemption_sub_category)
|
|
||||||
max_amount = frappe.db.get_value("Employee Tax Exemption Sub Category", \
|
def get_total_exemption_amount(declarations):
|
||||||
declaration.exemption_sub_category, "max_amount")
|
exemptions = frappe._dict()
|
||||||
if declaration.amount > max_amount:
|
for d in declarations:
|
||||||
frappe.throw(_("Max exemption amount for {0} is {1}").format(\
|
exemptions.setdefault(d.exemption_category, frappe._dict())
|
||||||
declaration.exemption_sub_category, max_amount), frappe.ValidationError)
|
category_max_amount = exemptions.get(d.exemption_category).max_amount
|
||||||
|
if not category_max_amount:
|
||||||
|
category_max_amount = frappe.db.get_value("Employee Tax Exemption Category", d.exemption_category, "max_amount")
|
||||||
|
exemptions.get(d.exemption_category).max_amount = category_max_amount
|
||||||
|
sub_category_exemption_amount = d.max_amount \
|
||||||
|
if (d.max_amount and flt(d.amount) > flt(d.max_amount)) else d.amount
|
||||||
|
|
||||||
|
exemptions.get(d.exemption_category).setdefault("total_exemption_amount", 0.0)
|
||||||
|
exemptions.get(d.exemption_category).total_exemption_amount += flt(sub_category_exemption_amount)
|
||||||
|
|
||||||
|
if category_max_amount and exemptions.get(d.exemption_category).total_exemption_amount > category_max_amount:
|
||||||
|
exemptions.get(d.exemption_category).total_exemption_amount = category_max_amount
|
||||||
|
|
||||||
|
total_exemption_amount = sum([flt(d.total_exemption_amount) for d in exemptions.values()])
|
||||||
|
return total_exemption_amount
|
||||||
|
|
||||||
def get_leave_period(from_date, to_date, company):
|
def get_leave_period(from_date, to_date, company):
|
||||||
leave_period = frappe.db.sql("""
|
leave_period = frappe.db.sql("""
|
||||||
|
|||||||
@ -167,8 +167,13 @@ def get_attributes_and_values(item_code):
|
|||||||
if attribute in attribute_list:
|
if attribute in attribute_list:
|
||||||
valid_options.setdefault(attribute, set()).add(attribute_value)
|
valid_options.setdefault(attribute, set()).add(attribute_value)
|
||||||
|
|
||||||
|
item_attribute_values = frappe.db.get_all('Item Attribute Value',
|
||||||
|
['parent', 'attribute_value', 'idx'], order_by='parent asc, idx asc')
|
||||||
|
ordered_attribute_value_map = frappe._dict()
|
||||||
|
for iv in item_attribute_values:
|
||||||
|
ordered_attribute_value_map.setdefault(iv.parent, []).append(iv.attribute_value)
|
||||||
|
|
||||||
# build attribute values in idx order
|
# build attribute values in idx order
|
||||||
ordered_attribute_value_map = item_cache.get_ordered_attribute_values()
|
|
||||||
for attr in attributes:
|
for attr in attributes:
|
||||||
valid_attribute_values = valid_options.get(attr.attribute, [])
|
valid_attribute_values = valid_options.get(attr.attribute, [])
|
||||||
ordered_values = ordered_attribute_value_map.get(attr.attribute, [])
|
ordered_values = ordered_attribute_value_map.get(attr.attribute, [])
|
||||||
|
|||||||
@ -284,18 +284,18 @@ def make_custom_fields(update=True):
|
|||||||
'Employee Tax Exemption Declaration':[
|
'Employee Tax Exemption Declaration':[
|
||||||
dict(fieldname='hra_section', label='HRA Exemption',
|
dict(fieldname='hra_section', label='HRA Exemption',
|
||||||
fieldtype='Section Break', insert_after='declarations'),
|
fieldtype='Section Break', insert_after='declarations'),
|
||||||
dict(fieldname='salary_structure_hra', label='HRA as per Salary Structure',
|
|
||||||
fieldtype='Currency', insert_after='hra_section', read_only=1),
|
|
||||||
dict(fieldname='monthly_house_rent', label='Monthly House Rent',
|
dict(fieldname='monthly_house_rent', label='Monthly House Rent',
|
||||||
fieldtype='Currency', insert_after='salary_structure_hra'),
|
fieldtype='Currency', insert_after='hra_section'),
|
||||||
dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
|
dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
|
||||||
fieldtype='Check', insert_after='monthly_house_rent'),
|
fieldtype='Check', insert_after='monthly_house_rent', depends_on='monthly_house_rent'),
|
||||||
|
dict(fieldname='salary_structure_hra', label='HRA as per Salary Structure',
|
||||||
|
fieldtype='Currency', insert_after='rented_in_metro_city', read_only=1, depends_on='monthly_house_rent'),
|
||||||
dict(fieldname='hra_column_break', fieldtype='Column Break',
|
dict(fieldname='hra_column_break', fieldtype='Column Break',
|
||||||
insert_after='rented_in_metro_city'),
|
insert_after='salary_structure_hra', depends_on='monthly_house_rent'),
|
||||||
dict(fieldname='annual_hra_exemption', label='Annual HRA Exemption',
|
dict(fieldname='annual_hra_exemption', label='Annual HRA Exemption',
|
||||||
fieldtype='Currency', insert_after='hra_column_break', read_only=1),
|
fieldtype='Currency', insert_after='hra_column_break', read_only=1, depends_on='monthly_house_rent'),
|
||||||
dict(fieldname='monthly_hra_exemption', label='Monthly HRA Exemption',
|
dict(fieldname='monthly_hra_exemption', label='Monthly HRA Exemption',
|
||||||
fieldtype='Currency', insert_after='annual_hra_exemption', read_only=1)
|
fieldtype='Currency', insert_after='annual_hra_exemption', read_only=1, depends_on='monthly_house_rent')
|
||||||
],
|
],
|
||||||
'Employee Tax Exemption Proof Submission': [
|
'Employee Tax Exemption Proof Submission': [
|
||||||
dict(fieldname='hra_section', label='HRA Exemption',
|
dict(fieldname='hra_section', label='HRA Exemption',
|
||||||
@ -303,19 +303,19 @@ def make_custom_fields(update=True):
|
|||||||
dict(fieldname='house_rent_payment_amount', label='House Rent Payment Amount',
|
dict(fieldname='house_rent_payment_amount', label='House Rent Payment Amount',
|
||||||
fieldtype='Currency', insert_after='hra_section'),
|
fieldtype='Currency', insert_after='hra_section'),
|
||||||
dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
|
dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
|
||||||
fieldtype='Check', insert_after='house_rent_payment_amount'),
|
fieldtype='Check', insert_after='house_rent_payment_amount', depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='rented_from_date', label='Rented From Date',
|
dict(fieldname='rented_from_date', label='Rented From Date',
|
||||||
fieldtype='Date', insert_after='rented_in_metro_city'),
|
fieldtype='Date', insert_after='rented_in_metro_city', depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='rented_to_date', label='Rented To Date',
|
dict(fieldname='rented_to_date', label='Rented To Date',
|
||||||
fieldtype='Date', insert_after='rented_from_date'),
|
fieldtype='Date', insert_after='rented_from_date', depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='hra_column_break', fieldtype='Column Break',
|
dict(fieldname='hra_column_break', fieldtype='Column Break',
|
||||||
insert_after='rented_to_date'),
|
insert_after='rented_to_date', depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='monthly_house_rent', label='Monthly House Rent',
|
dict(fieldname='monthly_house_rent', label='Monthly House Rent',
|
||||||
fieldtype='Currency', insert_after='hra_column_break', read_only=1),
|
fieldtype='Currency', insert_after='hra_column_break', read_only=1, depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='monthly_hra_exemption', label='Monthly Eligible Amount',
|
dict(fieldname='monthly_hra_exemption', label='Monthly Eligible Amount',
|
||||||
fieldtype='Currency', insert_after='monthly_house_rent', read_only=1),
|
fieldtype='Currency', insert_after='monthly_house_rent', read_only=1, depends_on='house_rent_payment_amount'),
|
||||||
dict(fieldname='total_eligible_hra_exemption', label='Total Eligible HRA Exemption',
|
dict(fieldname='total_eligible_hra_exemption', label='Total Eligible HRA Exemption',
|
||||||
fieldtype='Currency', insert_after='monthly_hra_exemption', read_only=1)
|
fieldtype='Currency', insert_after='monthly_hra_exemption', read_only=1, depends_on='house_rent_payment_amount')
|
||||||
],
|
],
|
||||||
'Supplier': [
|
'Supplier': [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, re
|
import frappe, re
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import cstr, flt, date_diff, getdate
|
from frappe.utils import cstr, flt, date_diff, nowdate
|
||||||
from erpnext.regional.india import states, state_numbers
|
from erpnext.regional.india import states, state_numbers
|
||||||
from erpnext.controllers.taxes_and_totals import get_itemised_tax, get_itemised_taxable_amount
|
from erpnext.controllers.taxes_and_totals import get_itemised_tax, get_itemised_taxable_amount
|
||||||
from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
||||||
@ -144,24 +144,40 @@ def get_regional_address_details(out, doctype, company):
|
|||||||
def calculate_annual_eligible_hra_exemption(doc):
|
def calculate_annual_eligible_hra_exemption(doc):
|
||||||
basic_component = frappe.get_cached_value('Company', doc.company, "basic_component")
|
basic_component = frappe.get_cached_value('Company', doc.company, "basic_component")
|
||||||
hra_component = frappe.get_cached_value('Company', doc.company, "hra_component")
|
hra_component = frappe.get_cached_value('Company', doc.company, "hra_component")
|
||||||
|
if not (basic_component and hra_component):
|
||||||
|
frappe.throw(_("Please mention Basic and HRA component in Company"))
|
||||||
|
|
||||||
annual_exemption, monthly_exemption, hra_amount = 0, 0, 0
|
annual_exemption, monthly_exemption, hra_amount = 0, 0, 0
|
||||||
if hra_component and basic_component:
|
if hra_component and basic_component:
|
||||||
assignment = get_salary_assignment(doc.employee, getdate())
|
assignment = get_salary_assignment(doc.employee, nowdate())
|
||||||
if assignment and frappe.db.exists("Salary Detail", {
|
|
||||||
"parent": assignment.salary_structure,
|
if assignment:
|
||||||
"salary_component": hra_component, "parentfield": "earnings"}):
|
hra_component_exists = frappe.db.exists("Salary Detail", {
|
||||||
basic_amount, hra_amount = get_component_amt_from_salary_slip(doc.employee,
|
"parent": assignment.salary_structure,
|
||||||
assignment.salary_structure, basic_component, hra_component)
|
"salary_component": hra_component,
|
||||||
if hra_amount:
|
"parentfield": "earnings",
|
||||||
if doc.monthly_house_rent:
|
"parenttype": "Salary Structure"
|
||||||
annual_exemption = calculate_hra_exemption(assignment.salary_structure,
|
})
|
||||||
basic_amount, hra_amount, doc.monthly_house_rent,
|
if hra_component_exists:
|
||||||
doc.rented_in_metro_city)
|
basic_amount, hra_amount = get_component_amt_from_salary_slip(doc.employee,
|
||||||
if annual_exemption > 0:
|
assignment.salary_structure, basic_component, hra_component)
|
||||||
monthly_exemption = annual_exemption / 12
|
if hra_amount:
|
||||||
else:
|
if doc.monthly_house_rent:
|
||||||
annual_exemption = 0
|
annual_exemption = calculate_hra_exemption(assignment.salary_structure,
|
||||||
return {"hra_amount": hra_amount, "annual_exemption": annual_exemption, "monthly_exemption": monthly_exemption}
|
basic_amount, hra_amount, doc.monthly_house_rent,
|
||||||
|
doc.rented_in_metro_city)
|
||||||
|
if annual_exemption > 0:
|
||||||
|
monthly_exemption = annual_exemption / 12
|
||||||
|
else:
|
||||||
|
annual_exemption = 0
|
||||||
|
elif doc.docstatus == 1:
|
||||||
|
frappe.throw(_("Salary Structure must be submitted before submission of Tax Ememption Declaration"))
|
||||||
|
|
||||||
|
return frappe._dict({
|
||||||
|
"hra_amount": hra_amount,
|
||||||
|
"annual_exemption": annual_exemption,
|
||||||
|
"monthly_exemption": monthly_exemption
|
||||||
|
})
|
||||||
|
|
||||||
def get_component_amt_from_salary_slip(employee, salary_structure, basic_component, hra_component):
|
def get_component_amt_from_salary_slip(employee, salary_structure, basic_component, hra_component):
|
||||||
salary_slip = make_salary_slip(salary_structure, employee=employee)
|
salary_slip = make_salary_slip(salary_structure, employee=employee)
|
||||||
@ -181,8 +197,10 @@ def calculate_hra_exemption(salary_structure, basic, monthly_hra, monthly_house_
|
|||||||
frequency = frappe.get_value("Salary Structure", salary_structure, "payroll_frequency")
|
frequency = frappe.get_value("Salary Structure", salary_structure, "payroll_frequency")
|
||||||
# case 1: The actual amount allotted by the employer as the HRA.
|
# case 1: The actual amount allotted by the employer as the HRA.
|
||||||
exemptions.append(get_annual_component_pay(frequency, monthly_hra))
|
exemptions.append(get_annual_component_pay(frequency, monthly_hra))
|
||||||
|
|
||||||
actual_annual_rent = monthly_house_rent * 12
|
actual_annual_rent = monthly_house_rent * 12
|
||||||
annual_basic = get_annual_component_pay(frequency, basic)
|
annual_basic = get_annual_component_pay(frequency, basic)
|
||||||
|
|
||||||
# case 2: Actual rent paid less 10% of the basic salary.
|
# case 2: Actual rent paid less 10% of the basic salary.
|
||||||
exemptions.append(flt(actual_annual_rent) - flt(annual_basic * 0.1))
|
exemptions.append(flt(actual_annual_rent) - flt(annual_basic * 0.1))
|
||||||
# case 3: 50% of the basic salary, if the employee is staying in a metro city (40% for a non-metro city).
|
# case 3: 50% of the basic salary, if the employee is staying in a metro city (40% for a non-metro city).
|
||||||
@ -205,15 +223,25 @@ def get_annual_component_pay(frequency, amount):
|
|||||||
def validate_house_rent_dates(doc):
|
def validate_house_rent_dates(doc):
|
||||||
if not doc.rented_to_date or not doc.rented_from_date:
|
if not doc.rented_to_date or not doc.rented_from_date:
|
||||||
frappe.throw(_("House rented dates required for exemption calculation"))
|
frappe.throw(_("House rented dates required for exemption calculation"))
|
||||||
|
|
||||||
if date_diff(doc.rented_to_date, doc.rented_from_date) < 14:
|
if date_diff(doc.rented_to_date, doc.rented_from_date) < 14:
|
||||||
frappe.throw(_("House rented dates should be atleast 15 days apart"))
|
frappe.throw(_("House rented dates should be atleast 15 days apart"))
|
||||||
proofs = frappe.db.sql("""select name from `tabEmployee Tax Exemption Proof Submission`
|
|
||||||
where docstatus=1 and employee='{0}' and payroll_period='{1}' and
|
proofs = frappe.db.sql("""
|
||||||
(rented_from_date between '{2}' and '{3}' or rented_to_date between
|
select name
|
||||||
'{2}' and '{3}')""".format(doc.employee, doc.payroll_period,
|
from `tabEmployee Tax Exemption Proof Submission`
|
||||||
doc.rented_from_date, doc.rented_to_date))
|
where
|
||||||
|
docstatus=1 and employee=%(employee)s and payroll_period=%(payroll_period)s
|
||||||
|
and (rented_from_date between %(from_date)s and %(to_date)s or rented_to_date between %(from_date)s and %(to_date)s)
|
||||||
|
""", {
|
||||||
|
"employee": doc.employee,
|
||||||
|
"payroll_period": doc.payroll_period,
|
||||||
|
"from_date": doc.rented_from_date,
|
||||||
|
"to_date": doc.rented_to_date
|
||||||
|
})
|
||||||
|
|
||||||
if proofs:
|
if proofs:
|
||||||
frappe.throw(_("House rent paid days overlap with {0}").format(proofs[0][0]))
|
frappe.throw(_("House rent paid days overlapping with {0}").format(proofs[0][0]))
|
||||||
|
|
||||||
def calculate_hra_exemption_for_period(doc):
|
def calculate_hra_exemption_for_period(doc):
|
||||||
monthly_rent, eligible_hra = 0, 0
|
monthly_rent, eligible_hra = 0, 0
|
||||||
|
|||||||
@ -204,6 +204,20 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
erpnext.utils.make_subscription(doc.doctype, doc.name)
|
erpnext.utils.make_subscription(doc.doctype, doc.name)
|
||||||
}, __('Create'))
|
}, __('Create'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (doc.docstatus === 1 && !doc.inter_company_order_reference) {
|
||||||
|
let me = this;
|
||||||
|
frappe.model.with_doc("Customer", me.frm.doc.customer, () => {
|
||||||
|
let customer = frappe.model.get_doc("Customer", me.frm.doc.customer);
|
||||||
|
let internal = customer.is_internal_customer;
|
||||||
|
let disabled = customer.disabled;
|
||||||
|
if (internal === 1 && disabled === 0) {
|
||||||
|
me.frm.add_custom_button("Inter Company Order", function() {
|
||||||
|
me.make_inter_company_order();
|
||||||
|
}, __('Create'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// payment request
|
// payment request
|
||||||
if(flt(doc.per_billed)==0) {
|
if(flt(doc.per_billed)==0) {
|
||||||
@ -500,6 +514,13 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
make_inter_company_order: function() {
|
||||||
|
frappe.model.open_mapped_doc({
|
||||||
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_inter_company_purchase_order",
|
||||||
|
frm: this.frm
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
make_maintenance_visit: function() {
|
make_maintenance_visit: function() {
|
||||||
frappe.model.open_mapped_doc({
|
frappe.model.open_mapped_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit",
|
||||||
|
|||||||
@ -1449,6 +1449,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "pricing_rule_details",
|
"fieldname": "pricing_rule_details",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1481,6 +1482,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "pricing_rules",
|
"fieldname": "pricing_rules",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -1514,6 +1516,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "section_break_31",
|
"fieldname": "section_break_31",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -3230,6 +3233,40 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "inter_company_order_reference",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Inter Company Order Reference",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Purchase Order",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
@ -4292,17 +4329,15 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 105,
|
"idx": 105,
|
||||||
"image_view": 0,
|
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2019-02-13 01:02:45.882179",
|
"modified": "2019-04-18 12:05:23.464968",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Sales Order",
|
"name": "Sales Order",
|
||||||
@ -4425,7 +4460,6 @@
|
|||||||
],
|
],
|
||||||
"quick_entry": 0,
|
"quick_entry": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 1,
|
|
||||||
"search_fields": "status,transaction_date,customer,customer_name, territory,order_type,company",
|
"search_fields": "status,transaction_date,customer,customer_name, territory,order_type,company",
|
||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
|
|||||||
@ -19,6 +19,8 @@ from erpnext.selling.doctype.customer.customer import check_credit_limit
|
|||||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||||
from erpnext.manufacturing.doctype.production_plan.production_plan import get_items_for_material_requests
|
from erpnext.manufacturing.doctype.production_plan.production_plan import get_items_for_material_requests
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_doc,\
|
||||||
|
unlink_inter_company_doc
|
||||||
|
|
||||||
form_grid_templates = {
|
form_grid_templates = {
|
||||||
"items": "templates/form_grid/item_grid.html"
|
"items": "templates/form_grid/item_grid.html"
|
||||||
@ -42,6 +44,7 @@ class SalesOrder(SellingController):
|
|||||||
self.validate_warehouse()
|
self.validate_warehouse()
|
||||||
self.validate_drop_ship()
|
self.validate_drop_ship()
|
||||||
self.validate_serial_no_based_delivery()
|
self.validate_serial_no_based_delivery()
|
||||||
|
validate_inter_company_party(self.doctype, self.customer, self.company, self.inter_company_order_reference)
|
||||||
|
|
||||||
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
||||||
make_packing_list(self)
|
make_packing_list(self)
|
||||||
@ -182,6 +185,8 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
self.update_blanket_order()
|
self.update_blanket_order()
|
||||||
|
|
||||||
|
update_linked_doc(self.doctype, self.name, self.inter_company_order_reference)
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
super(SalesOrder, self).on_cancel()
|
super(SalesOrder, self).on_cancel()
|
||||||
|
|
||||||
@ -198,6 +203,8 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
self.update_blanket_order()
|
self.update_blanket_order()
|
||||||
|
|
||||||
|
unlink_inter_company_doc(self.doctype, self.name, self.inter_company_order_reference)
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') != "Each Transaction":
|
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') != "Each Transaction":
|
||||||
return
|
return
|
||||||
@ -764,6 +771,7 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier=None, target
|
|||||||
target.apply_discount_on = ""
|
target.apply_discount_on = ""
|
||||||
target.additional_discount_percentage = 0.0
|
target.additional_discount_percentage = 0.0
|
||||||
target.discount_amount = 0.0
|
target.discount_amount = 0.0
|
||||||
|
target.inter_company_order_reference = ""
|
||||||
|
|
||||||
default_price_list = frappe.get_value("Supplier", supplier, "default_price_list")
|
default_price_list = frappe.get_value("Supplier", supplier, "default_price_list")
|
||||||
if default_price_list:
|
if default_price_list:
|
||||||
@ -971,3 +979,8 @@ def make_raw_material_request(items, company, sales_order, project=None):
|
|||||||
material_request.run_method("set_missing_values")
|
material_request.run_method("set_missing_values")
|
||||||
material_request.submit()
|
material_request.submit()
|
||||||
return material_request
|
return material_request
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_inter_company_purchase_order(source_name, target_doc=None):
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||||
|
return make_inter_company_transaction("Sales Order", source_name, target_doc)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user