Merge branch 'develop' into pos-refactor
@ -58,4 +58,5 @@ script:
|
||||
- bench reinstall --yes
|
||||
- bench execute erpnext.setup.setup_wizard.utils.complete
|
||||
- bench execute erpnext.setup.utils.enable_all_roles_and_domains
|
||||
- bench --verbose run-setup-wizard-ui-test
|
||||
- bench run-ui-tests --app erpnext
|
||||
|
@ -4,7 +4,7 @@ import inspect
|
||||
import frappe
|
||||
from erpnext.hooks import regional_overrides
|
||||
|
||||
__version__ = '8.10.0'
|
||||
__version__ = '8.10.2'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
|
@ -78,6 +78,7 @@ def get_chart(chart_template, existing_company=None):
|
||||
for folder in folders:
|
||||
path = os.path.join(os.path.dirname(__file__), folder)
|
||||
for fname in os.listdir(path):
|
||||
fname = frappe.as_unicode(fname)
|
||||
if fname.endswith(".json"):
|
||||
with open(os.path.join(path, fname), "r") as f:
|
||||
chart = f.read()
|
||||
@ -105,6 +106,7 @@ def get_charts_for_country(country):
|
||||
path = os.path.join(os.path.dirname(__file__), folder)
|
||||
|
||||
for fname in os.listdir(path):
|
||||
fname = frappe.as_unicode(fname)
|
||||
if (fname.startswith(country_code) or fname.startswith(country)) and fname.endswith(".json"):
|
||||
with open(os.path.join(path, fname), "r") as f:
|
||||
_get_chart_name(f.read())
|
||||
|
@ -1607,4 +1607,4 @@
|
||||
"root_type": "Income"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -5,7 +5,9 @@ QUnit.test("test account", function(assert) {
|
||||
let done = assert.async();
|
||||
frappe.run_serially([
|
||||
() => frappe.set_route('Tree', 'Account'),
|
||||
() => frappe.timeout(3),
|
||||
() => frappe.click_button('Expand All'),
|
||||
() => frappe.timeout(1),
|
||||
() => frappe.click_link('Debtors'),
|
||||
() => frappe.click_button('Edit'),
|
||||
() => frappe.timeout(1),
|
||||
|
@ -1,5 +1,6 @@
|
||||
{
|
||||
"allow_copy": 0,
|
||||
"allow_guest_to_view": 0,
|
||||
"allow_import": 1,
|
||||
"allow_rename": 1,
|
||||
"autoname": "field:title",
|
||||
@ -12,6 +13,7 @@
|
||||
"editable_grid": 0,
|
||||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -40,6 +42,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -69,6 +72,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -99,6 +103,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -129,6 +134,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -159,6 +165,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -189,6 +196,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -217,6 +225,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -247,6 +256,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -275,6 +285,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -303,6 +314,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -331,6 +343,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -359,6 +372,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -387,6 +401,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -417,6 +432,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -447,6 +463,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -477,6 +494,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -507,6 +525,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -537,6 +556,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -567,6 +587,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -597,6 +618,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -627,6 +649,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -655,6 +678,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -683,6 +707,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -711,6 +736,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -739,6 +765,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -767,6 +794,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -796,6 +824,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -824,6 +853,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -851,6 +881,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -880,6 +911,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -910,6 +942,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -941,6 +974,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -969,6 +1003,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1000,6 +1035,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1028,6 +1064,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1058,6 +1095,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1085,13 +1123,14 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.price_or_discount==\"Price\"",
|
||||
"fieldname": "price",
|
||||
"fieldtype": "Float",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
@ -1114,6 +1153,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1143,6 +1183,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1173,6 +1214,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1202,6 +1244,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -1230,18 +1273,18 @@
|
||||
"unique": 0
|
||||
}
|
||||
],
|
||||
"has_web_view": 0,
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"icon": "fa fa-gift",
|
||||
"idx": 1,
|
||||
"image_view": 0,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"is_submittable": 0,
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-02-17 16:21:28.446208",
|
||||
"modified": "2017-08-31 16:34:41.614743",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Pricing Rule",
|
||||
|
@ -320,8 +320,7 @@ def make_invoice(doc_list={}, email_queue_list={}, customers_list={}):
|
||||
si_doc.set_posting_time = 1
|
||||
si_doc.customer = get_customer_id(doc)
|
||||
si_doc.due_date = doc.get('posting_date')
|
||||
submit_invoice(si_doc, name, doc)
|
||||
name_list.append(name)
|
||||
name_list = submit_invoice(si_doc, name, doc, name_list)
|
||||
else:
|
||||
name_list.append(name)
|
||||
|
||||
@ -475,19 +474,29 @@ def validate_item(doc):
|
||||
frappe.db.commit()
|
||||
|
||||
|
||||
def submit_invoice(si_doc, name, doc):
|
||||
def submit_invoice(si_doc, name, doc, name_list):
|
||||
try:
|
||||
si_doc.insert()
|
||||
si_doc.submit()
|
||||
frappe.db.commit()
|
||||
name_list.append(name)
|
||||
except Exception as e:
|
||||
if frappe.message_log: frappe.message_log.pop()
|
||||
frappe.db.rollback()
|
||||
save_invoice(e, si_doc, name)
|
||||
frappe.log_error(frappe.get_traceback())
|
||||
name_list = save_invoice(e, si_doc, name, name_list)
|
||||
|
||||
def save_invoice(e, si_doc, name):
|
||||
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
|
||||
si_doc.docstatus = 0
|
||||
si_doc.flags.ignore_mandatory = True
|
||||
si_doc.due_date = si_doc.posting_date
|
||||
si_doc.insert()
|
||||
return name_list
|
||||
|
||||
def save_invoice(e, si_doc, name, name_list):
|
||||
try:
|
||||
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
|
||||
si_doc.docstatus = 0
|
||||
si_doc.flags.ignore_mandatory = True
|
||||
si_doc.due_date = si_doc.posting_date
|
||||
si_doc.insert()
|
||||
name_list.append(name)
|
||||
except Exception:
|
||||
frappe.log_error(frappe.get_traceback())
|
||||
|
||||
return name_list
|
||||
|
@ -1167,8 +1167,15 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertEqual(flt(si.outstanding_amount), flt(si.grand_total + si.total_advance, si.precision("outstanding_amount")))
|
||||
|
||||
def test_multiple_uom_in_selling(self):
|
||||
si = frappe.copy_doc(test_records[1])
|
||||
frappe.db.sql("""delete from `tabItem Price`
|
||||
where price_list='_Test Price List' and item_code='_Test Item'""")
|
||||
item_price = frappe.new_doc("Item Price")
|
||||
item_price.price_list = "_Test Price List"
|
||||
item_price.item_code = "_Test Item"
|
||||
item_price.price_list_rate = 100
|
||||
item_price.insert()
|
||||
|
||||
si = frappe.copy_doc(test_records[1])
|
||||
si.items[0].uom = "_Test UOM 1"
|
||||
si.items[0].conversion_factor = None
|
||||
si.items[0].price_list_rate = None
|
||||
|
@ -0,0 +1,45 @@
|
||||
QUnit.module('Sales Invoice');
|
||||
|
||||
QUnit.test("test sales Invoice with serialize item", function(assert) {
|
||||
assert.expect(5);
|
||||
let done = assert.async();
|
||||
frappe.run_serially([
|
||||
() => {
|
||||
return frappe.tests.make('Sales Invoice', [
|
||||
{customer: 'Test Customer 1'},
|
||||
{items: [
|
||||
[
|
||||
{'qty': 2},
|
||||
{'item_code': 'Test Product 4'},
|
||||
]
|
||||
]},
|
||||
{update_stock:1},
|
||||
{customer_address: 'Test1-Billing'},
|
||||
{shipping_address_name: 'Test1-Shipping'},
|
||||
{contact_person: 'Contact 1-Test Customer 1'},
|
||||
{taxes_and_charges: 'TEST In State GST'},
|
||||
{tc_name: 'Test Term 1'},
|
||||
{terms: 'This is Test'}
|
||||
]);
|
||||
},
|
||||
() => cur_frm.save(),
|
||||
() => {
|
||||
// get_item_details
|
||||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
|
||||
// get tax details
|
||||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST', "Tax details correct");
|
||||
// get tax account head details
|
||||
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
|
||||
// get batch number
|
||||
assert.ok(cur_frm.doc.items[0].batch_no=='TEST-BATCH-001', " Batch Details correct");
|
||||
// grand_total Calculated
|
||||
assert.ok(cur_frm.doc.grand_total==218, "Grad Total correct");
|
||||
|
||||
},
|
||||
() => frappe.tests.click_button('Submit'),
|
||||
() => frappe.tests.click_button('Yes'),
|
||||
() => frappe.timeout(0.3),
|
||||
() => done()
|
||||
]);
|
||||
});
|
||||
|
@ -435,11 +435,16 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
});
|
||||
|
||||
this.serach_item.make_input();
|
||||
this.serach_item.$input.on("keyup", function () {
|
||||
setTimeout(function () {
|
||||
me.items = me.get_items();
|
||||
me.make_item_list();
|
||||
}, 1000);
|
||||
|
||||
this.serach_item.$input.on("keypress", function (event) {
|
||||
|
||||
clearTimeout(me.last_search_timeout);
|
||||
me.last_search_timeout = setTimeout(() => {
|
||||
if((me.serach_item.$input.val() != "") || (event.which == 13)) {
|
||||
me.items = me.get_items();
|
||||
me.make_item_list();
|
||||
}
|
||||
}, 400);
|
||||
});
|
||||
|
||||
this.search_item_group = this.wrapper.find('.search-item-group');
|
||||
@ -736,14 +741,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
|
||||
input = input.toLowerCase();
|
||||
item = this.get_item(item.value);
|
||||
var searchtext =
|
||||
Object.keys(item)
|
||||
.filter(key => ['customer_name', 'customer_group', 'value', 'label', 'email_id', 'phone', 'mobile_no'].includes(key))
|
||||
.map(key => item[key])
|
||||
.join(" ")
|
||||
.toLowerCase();
|
||||
|
||||
return searchtext.includes(input)
|
||||
return item.searchtext.includes(input)
|
||||
},
|
||||
item: function (item, input) {
|
||||
var d = this.get_item(item.value);
|
||||
@ -817,7 +815,11 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
territory: c.territory,
|
||||
phone: contact ? contact["phone"] : '',
|
||||
mobile_no: contact ? contact["mobile_no"] : '',
|
||||
email_id: contact ? contact["email_id"] : ''
|
||||
email_id: contact ? contact["email_id"] : '',
|
||||
searchtext: ['customer_name', 'customer_group', 'value',
|
||||
'label', 'email_id', 'phone', 'mobile_no']
|
||||
.map(key => c[key]).join(' ')
|
||||
.toLowerCase()
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -0,0 +1,22 @@
|
||||
{
|
||||
"align_labels_left": 0,
|
||||
"creation": "2017-08-08 12:33:04.773099",
|
||||
"custom_format": 1,
|
||||
"disabled": 0,
|
||||
"doc_type": "Sales Invoice",
|
||||
"docstatus": 0,
|
||||
"doctype": "Print Format",
|
||||
"font": "Default",
|
||||
"html": "<style>\n\t.print-format table, .print-format tr, \n\t.print-format td, .print-format div, .print-format p {\n\t\tfont-family: Monospace;\n\t\tline-height: 200%;\n\t\tvertical-align: middle;\n\t}\n\t@media screen {\n\t\t.print-format {\n\t\t\twidth: 4in;\n\t\t\tpadding: 0.25in;\n\t\t\tmin-height: 8in;\n\t\t}\n\t}\n</style>\n\n<p class=\"text-center\">\n\t{{ doc.company }}<br>\n\t{% if doc.company_address_display %}\n\t\t{% set company_address = doc.company_address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t{% if \"GSTIN\" not in company_address %}\n\t\t\t{{ company_address }}\n\t\t\t<b>{{ _(\"GSTIN\") }}:</b>{{ doc.company_gstin }}\n\t\t{% else %}\n\t\t\t{{ company_address.replace(\"GSTIN\", \"<br>GSTIN\") }}\n\t\t{% endif %}\n\t{% endif %}\n\t<br>\n\t<b>{{ doc.select_print_heading or _(\"Invoice\") }}</b><br>\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t{% if doc.grand_total > 50000 %}\n\t\t{% set customer_address = doc.address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t<b>{{ _(\"Customer\") }}:</b><br>\n\t\t{{ doc.customer_name }}<br>\n\t\t{{ customer_address }}\n\t{% endif %}\n</p>\n\n<hr>\n<table class=\"table table-condensed cart no-border\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th width=\"40%\">{{ _(\"Item\") }}</b></th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Qty\") }}</th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{%- for item in doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.gst_hsn_code -%}\n\t\t\t\t\t<br><b>{{ _(\"HSN/SAC\") }}:</b> {{ item.gst_hsn_code }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t<br><b>{{ _(\"Serial No\") }}:</b> {{ item.serial_no }}\n\t\t\t\t{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ item.rate }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t{{ _(\"Net Total\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"net_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t{%- if not row.included_in_print_rate -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t{{ row.description }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t{%- endfor -%}\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n<p><b>Tax Breakup:</b></p>\n<div style=\"font-size: 8px\">\n\t{{ doc.other_charges_calculation }}\n</div>\n<p>{{ doc.terms or \"\" }}</p>\n<p class=\"text-center\">{{ _(\"Thank you, please visit again.\") }}</p>",
|
||||
"idx": 0,
|
||||
"line_breaks": 0,
|
||||
"modified": "2017-08-29 15:54:19.467642",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "GST POS Invoice",
|
||||
"owner": "Administrator",
|
||||
"print_format_builder": 0,
|
||||
"print_format_type": "Server",
|
||||
"show_section_headings": 0,
|
||||
"standard": "Yes"
|
||||
}
|
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 9.2 KiB |
BIN
erpnext/docs/assets/img/articles/brand-logo.gif
Normal file
After Width: | Height: | Size: 1.5 MiB |
BIN
erpnext/docs/assets/img/articles/capacity-1.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
erpnext/docs/assets/img/articles/capacity-2.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
erpnext/docs/assets/img/articles/capacity-3.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
erpnext/docs/assets/img/articles/child-1.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
erpnext/docs/assets/img/articles/child-2.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
erpnext/docs/assets/img/articles/child-3.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
erpnext/docs/assets/img/articles/child-4.gif
Normal file
After Width: | Height: | Size: 424 KiB |
BIN
erpnext/docs/assets/img/articles/child-5.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
erpnext/docs/assets/img/articles/child-6.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
erpnext/docs/assets/img/articles/common-receivable.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
erpnext/docs/assets/img/articles/download-backup-1.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
erpnext/docs/assets/img/articles/download-backup-2.gif
Normal file
After Width: | Height: | Size: 216 KiB |
BIN
erpnext/docs/assets/img/articles/email-error.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
erpnext/docs/assets/img/articles/email-setup-error.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
erpnext/docs/assets/img/articles/fetching-1.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
erpnext/docs/assets/img/articles/fetching-2.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
erpnext/docs/assets/img/articles/fetching-3.gif
Normal file
After Width: | Height: | Size: 363 KiB |
BIN
erpnext/docs/assets/img/articles/hr-working-days.png
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
erpnext/docs/assets/img/articles/item-valuation-1.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
erpnext/docs/assets/img/articles/item-valuation-2.png
Normal file
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 55 KiB |
BIN
erpnext/docs/assets/img/articles/purchase-return.gif
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
erpnext/docs/assets/img/articles/report-header-1.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
erpnext/docs/assets/img/articles/report-header-2.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
erpnext/docs/assets/img/articles/report-permission-1.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
erpnext/docs/assets/img/articles/report-permission-2.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
erpnext/docs/assets/img/articles/role-deskperm.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
erpnext/docs/assets/img/articles/sections-1.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
erpnext/docs/assets/img/articles/sections-2.gif
Normal file
After Width: | Height: | Size: 312 KiB |
BIN
erpnext/docs/assets/img/articles/types-in-tax-masters.png
Normal file
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 1.3 MiB |
After Width: | Height: | Size: 1.4 MiB |
After Width: | Height: | Size: 1019 KiB |
BIN
erpnext/docs/assets/img/schools/admission/program-enrollment.gif
Normal file
After Width: | Height: | Size: 2.2 MiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 96 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/student-attendance.gif
Normal file
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 2.1 MiB |
BIN
erpnext/docs/assets/img/schools/setup/Course-schedule-error.png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
erpnext/docs/assets/img/schools/setup/Room-Assesment-plan.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
erpnext/docs/assets/img/schools/setup/course-fee-program.png
Normal file
After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 376 KiB |
After Width: | Height: | Size: 81 KiB |
BIN
erpnext/docs/assets/img/schools/student/guardian.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
erpnext/docs/assets/img/schools/student/schools-settings.png
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
erpnext/docs/assets/img/schools/student/student group.gif
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
erpnext/docs/assets/img/schools/student/student-admission.gif
Normal file
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 550 KiB |
BIN
erpnext/docs/assets/img/schools/student/student-batch.gif
Normal file
After Width: | Height: | Size: 366 KiB |
Before Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 985 KiB |
After Width: | Height: | Size: 647 KiB |
After Width: | Height: | Size: 991 KiB |
Before Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 132 KiB |
BIN
erpnext/docs/assets/img/setup/integrations/razorpay-api.gif
Normal file
After Width: | Height: | Size: 765 KiB |
@ -1,47 +0,0 @@
|
||||
#C-Form
|
||||
|
||||
C-Form functionality is only applicable for Indian customers.
|
||||
|
||||
**What is C-Form?**
|
||||
|
||||
C-Form is issued by the Customer. If Customer Issues C-Form, supplier applies discounted CST (central sales tax) in the invoice. C-Form is only applicable on the inter-state transactions.
|
||||
|
||||
C-Form functionality in ERPNext allows Supplier to update C-Form No. as received from Customer in the submitted Sales Invoice. Also you can create report on Sales Invoice and track invoices for which C-Form has not yet been received from Customer.
|
||||
|
||||
Following are step to manage C-Form related sales in ERPNext.
|
||||
|
||||
####Set C-Form Applicability
|
||||
|
||||
While creating Sales invoice for the customer, set C-Form applicability in Sales Invoice. In More Info section of Sales Invoice, set field called **Is C-Form Applicable** as **Yes**. Bydefault, this field will have No for a value.
|
||||
|
||||

|
||||
|
||||
Updating this field as Yes will allow you to pull this Sales Invoice in the C-Form Tool, and update C-Form No. as received from the Customer.
|
||||
|
||||
####Create C-Form Record
|
||||
|
||||
After receiving C-Form from your Customer, you should update that C-Form no. in the Sales Invoice by creating C-Form record.
|
||||
|
||||
Go to `Accounts > Setup > C-Form > New`
|
||||
|
||||
Enter details like C-Form No, Received Date, State and Amount etc. Select Customer and pull related Sales Invoices under provided table.
|
||||
|
||||

|
||||
|
||||
####Save & Submit C-Form
|
||||
|
||||
After entering details, save and submit C-Form record. On save system will generate C-Form record and on submission update that C-Form No. in the Sales Invoice.
|
||||
|
||||

|
||||
|
||||
C-Form serial no will be updated in related invoice under the field 'C-Form No'.
|
||||
|
||||

|
||||
|
||||
####Tracking Pending Invoice for C-Form
|
||||
|
||||
To track invoices for which C-Form has not yet been received from Customer, you can create custom report on Sales Invoice. In this report, you can filter invoices which doesn't have C-Form updated in them yet, and followup with the customer accordingly.
|
||||
|
||||

|
||||
|
||||
<!-- markdown -->
|
@ -0,0 +1,13 @@
|
||||
# Common Receivable Account
|
||||
|
||||
As per the party model, a common receivable account called **Debtor** is auto-created. This is a default Receivable Account for all the Customers.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/common-receivable.png">
|
||||
|
||||
If needed, you can also create a new receivable account and update in the Customer master.
|
||||
|
||||
**Question:** Should I create separate Receivable Account Account for each Customer?
|
||||
|
||||
**Answer:** You can, but it's not a recommend approach. If you want to create separate Receivable Account for each Customer for tracking receivable, then it not needed. You still view Account Receivable & General Ledger report for each Customer.
|
||||
|
||||
Just like Debtors, for tracking payables, default account called Creditors is created under Account Payables.
|
@ -0,0 +1,13 @@
|
||||
# Freeze an Account
|
||||
|
||||
Once an Account is Frozen, you won't be able to use it any accounting transaction. Since this is a critical action, you need to explicitly define a Role who can set an Account as Frozen. You can define this Role in the Account Settings.
|
||||
|
||||
`Accounts > Account Settings`
|
||||
|
||||
To freeze an Account, go to Chart of Accounts, and edit an Account.
|
||||
|
||||
<img class="screenshot" alt="Download Backup" src="/docs/assets/img/articles/freeze-account-1.png">
|
||||
|
||||
If User has Role define in the Account Setting assigned, then he/she will be able to set an Account as Frozen.
|
||||
|
||||
<img class="screenshot" alt="Download Backup" src="/docs/assets/img/articles/freeze-account-2.png">
|
@ -6,10 +6,12 @@ freeze-accounting-entries
|
||||
how-to-freeze-accouting-ledger
|
||||
manage-foreign-exchange-difference
|
||||
managing-transactions-in-multiple-currency
|
||||
fiscal-year-creation
|
||||
fiscal-year-creation
|
||||
post-dated-cheque-entry
|
||||
update-stock-option-in-sales-invoice
|
||||
what-is-the-differences-of-total-and-valuation-in-tax-and-charges
|
||||
withdrawing-salary-from-owners-equity-account
|
||||
adjust-withhold-amount-payment-entry
|
||||
c-form
|
||||
common-receivable-account.md
|
||||
types-in-tax-template
|
||||
freeze-account
|
@ -0,0 +1,9 @@
|
||||
# Purchase Invoice - Account Type Error
|
||||
|
||||
**Question:** On saving the Purchase Invoice, I am getting a validation message that Credit To Account must be a Balance Sheet account.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/purchase-invoice-account-type.png">
|
||||
|
||||
**Answer: **On submission of a Purchase Invoice, payable is updated towards the Supplier. As per the accounting standards, Payable Account is aligned under Current Liability (credit side of Balance Sheet).
|
||||
|
||||
The error message indicates that Account selected in the Credit To field doesn't belong to the Liability Group. Please ensure that Payable Account selected in the Purchase Invoice is located under Liability group.
|
@ -0,0 +1,17 @@
|
||||
# Types in Sales and Purchase Tax Template
|
||||
|
||||
In the Sales Taxes and Purchase Taxes master, you will find a column called Type. Following a brief on a meaning of each Type and how you can use it.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/types-in-tax-masters.png">
|
||||
|
||||
**Actual:** This allows you to enter expense amount directly. For example, Rs. 500 incurred for Shipping.
|
||||
|
||||
**On Net Total:** If you want to apply any tax or charges on Net Total, select this option. For example, 18% GST applied to all the item in the Sales Order.
|
||||
|
||||
**On Previous Row Amount:** This option helps you want to calculate tax amount calculated based on another tax amount.
|
||||
|
||||
Example: Education Cess is calculated based on the amount of GST tax.
|
||||
|
||||
**On Previous Row Total:** For each Tax row, a cumulative tax is calculated in the Total column. For the first row, total tax is calculated as Net Total + Tax amount at first row. If you want to apply a tax on the Total Amount of another tax row, then use this option.
|
||||
|
||||
If you select Type as Previous Row Amount or Previous Row Total, then you must also specify a Row No. whose Amount or Total should be considered for the calculation.
|
@ -0,0 +1,33 @@
|
||||
# Customizing visibility of data in the child table
|
||||
|
||||
**Question:** Currently, in the child table (like Item table in Quotation), we can view value in the four columns only. How can we have more values previewed in the child table?
|
||||
|
||||
**Answer:** In the version 7, we introduced a feature, editable grid. This allowed the user to add values in the child table without opening dialog box/form for each row.
|
||||
|
||||
This is how Quotation Item table renders value when Editable Grid is enabled. It will maximum list four columns in the table.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-1.png">
|
||||
|
||||
As per the default setting, only four columns are listed in the child table. Following is how you can add more columns in the editable itself.
|
||||
|
||||
For the field to be added as a column in the table, enter a value in the Column field. Also, ensure that "Is List View" property is checked for that field.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-2.png">
|
||||
|
||||
Based on the value in the Column field, columns will be added in the child table. Ensure that sum total of value added in the Column field doesn't exceed 10. Based on the Column value, width for that column will be set.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-3.png">
|
||||
|
||||
**Switch to Un-editable Grid**
|
||||
|
||||
To have more values shown in the preview of Quotation Item table, you can disable Editable Grid for the Quotation Item Doctype. Steps below.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-4.gif">
|
||||
|
||||
Once Editable Grid is disabled for the Quotation Item, the following is how values will be rendered in a preview of the Quotation Item table.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-5.png">
|
||||
|
||||
To have specific field's value shown in the preview, ensure that for that field, in the Customize Form tool, "In List View" property is checked.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/child-6.png">
|
@ -0,0 +1,19 @@
|
||||
# Fetching Data from one Document to Another
|
||||
|
||||
**Question:** We track Customer's PO No and PO Date field in the Sales Order. To have these values fetched into Sales Invoice as well, we have inserted Custom Field in the Sales Invoice. However, when we create Sales Invoice from the Sales Order, Customer's PO details are not being fetched.
|
||||
|
||||
**Answer:** When data is fetched from one transaction to the another transaction, then the mapping of data is done based on the field names. If two transactions have fields with the exact same name, then it's values are mapped.
|
||||
|
||||
For example, if you want Customer's PO No. and PO Date to be fetched from Sales Order to Sales Invoice, then you should ensure that Custom Fields added in the Sales Invoice has an exact same field name as in the Sales Order.
|
||||
|
||||
Sales Order (standard fields)
|
||||
|
||||
<img class="screenshot" alt="Standard fields in Sales Order" src="/docs/assets/img/articles/fetching-1.png">
|
||||
|
||||
Sales Invoice (custom fields)
|
||||
|
||||
<img class="screenshot" alt="Custom Field in Sales Invoice" src="/docs/assets/img/articles/fetching-2.png">
|
||||
|
||||
Since names for the Customer's PO related fields are same in the Sales Order and Sales Invoice, when creating Sales Invoice from the Sales Order, values in these fields are auto-fetched.
|
||||
|
||||
<img class="screenshot" alt="Values fetching from Sales Order to Sales Invoice" src="/docs/assets/img/articles/fetching-3.gif">
|
@ -14,4 +14,6 @@ search-record-by-specific-field
|
||||
set-language
|
||||
set-precision
|
||||
user-restriction
|
||||
maximum-numbers-of-fields-in-a-form
|
||||
maximum-numbers-of-fields-in-a-form
|
||||
child-table
|
||||
fetching-data-from-a-document
|
@ -1,2 +1,3 @@
|
||||
employees-loan-management
|
||||
leave-calculation-in-salary-slip
|
||||
leave-calculation-in-salary-slip
|
||||
working-days-in-salary-slip
|
@ -0,0 +1,11 @@
|
||||
# Working Days Calculation in the Salary Slip
|
||||
|
||||
Working Days are shown in the In the Salary Slip. Based on your preference, it may include holidays of the month or it may not. You can define your preference for the Working Days calculation in HR Settings.
|
||||
|
||||
`HR > Setup > HR Settings`
|
||||
|
||||
If you want to include holidays in the count of Total Working days, then ensure that in the HR Settings, field **Include holidays in Total no. of Working Days** is checked and vice versa.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/hr-working-days.png">
|
||||
|
||||
To learn how to define holidays for your company, check [Holiday List](/user/manual/en/human-resources/holiday-list) feature in the HR module.
|
@ -9,22 +9,23 @@ Schedule seminars, workshops, conferences etc using Training Event. You can also
|
||||
### Inviting Employees for Event
|
||||
|
||||
You can invite your employees to attend the event. You can do so by selecting the employees to be invited in the employee table.
|
||||
|
||||
By default the status of the employee will be 'Open'.
|
||||
The system shall notify the employee with status 'Open' by sending a email to the office email address of the employee as mentioned in the employee master if you have selected 'Send Email' checkbox.
|
||||
The status is changed to 'Invited' when an invitation email is sent to the employee by the system.
|
||||
When an Employee confirms his/her presence for the event you can change the status to 'Confirmed'.
|
||||
|
||||
<img class="screenshot" alt="Employee" src="/docs/assets/img/human-resources/training_event_employee.png">
|
||||
|
||||
When you submit the Training Event, a notifcation will be sent to the employee notifying that the Training has been scheduled. This is sent via Email Alert "Training Scheduled". You can modifiy this Email Alert to customize the message.
|
||||
|
||||
### Training Result
|
||||
|
||||
After compleation of the training Employee Wise training results can be stored based on the Feedback received from the Trainer.
|
||||
After compleation of the training Employee-wise training results can be stored based on the Feedback received from the Trainer.
|
||||
|
||||
<img class="screenshot" alt="Employee" src="/docs/assets/img/human-resources/training_result.png">
|
||||
|
||||
When the Training Result is submitted, all the employees will receive an email notifying them that they must share their feedback via "Training Feedback". This is also managed via an Email Alert, so you can customize this alert too.
|
||||
|
||||
### Trainig Feedback
|
||||
### Training Feedback
|
||||
|
||||
Collect feedback regarding the event from your Employees using Training Feedback.
|
||||
Employees can then share their feedback via Training Feedback.
|
||||
|
||||
<img class="screenshot" alt="Employee" src="/docs/assets/img/human-resources/training_feedback.png">
|
||||
|
@ -0,0 +1,51 @@
|
||||
# Capacity Planning based on Production Order
|
||||
|
||||
Capacity Planning functionality helps you in tracking production jobs allocated on each Workstation.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/capacity-1.png">
|
||||
|
||||
Follow are the steps to use Capacity Planning Feature in your ERPNext account.
|
||||
|
||||
1. Operations
|
||||
|
||||
To add operations, go to:
|
||||
|
||||
`Manufacturing > Bill of Materials > Operations`
|
||||
|
||||
2. Workstation
|
||||
|
||||
Add each Workstation in your ERPNext account from:
|
||||
|
||||
`Manufacturing > Bill of Materials > Workstation`
|
||||
|
||||
In the Workstation master, you can define which operations will be performed on it, what are the cost associated with it, and what are the working hours of that Workstation.
|
||||
|
||||
3. Bill of Materials (BOM):
|
||||
|
||||
In a BOM, with the list of raw material needed, for manufacturing, you can also list operation and workstations through which those raw materials will be processed.
|
||||
|
||||
4. Production Order:
|
||||
|
||||
On submission of Production Order, Timesheet for Operations. This helps you allocate production jobs on each Workstation, as well as you can update actual time taken for each Operation.
|
||||
|
||||
### Error due to Capacity Planning
|
||||
|
||||
**Question:** On Submission of Production Order, we are getting following error message.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/capacity-2.png">
|
||||
|
||||
**Answer: **Please check if you have updated Working Hours in the Workstation master? If not, then please update it and then try to submit Production Order.
|
||||
|
||||
On submission of Production Order, Operations (as added in the BOM) are allocated on the workstation. Each operation should start and end on the same day. If a system is not able to schedule that operation in a day, then system request you to divide that Project, so that system can allocate smaller operations in a day.
|
||||
|
||||
If you have update working hours in the Workstation, but still getting this issue, that because one of your operation is taking too long, and cannot be completed in a day. Please divide that operation into smaller operations, so that it can be allocated on Workstation and completed on the same day.
|
||||
|
||||
### Avoid Working Hours of Workstation
|
||||
|
||||
If you want to ignore above validation and allow scheduling of production job beyond the working hours of the Workstation, enable
|
||||
Overtime in the Manufacturing Settings.
|
||||
|
||||
<img alt="Role Desk Permission" class="screenshot" src="/docs/assets/img/articles/capacity-3.png">
|
||||
|
||||
If you want to complete disable Capacity Planning feature, in the Manufacturing Settings, check field "Disable Capacity Planning and Time Tracking".
|
||||
|
@ -1,3 +1,4 @@
|
||||
nested-bom-structure
|
||||
production-planning-subassembly
|
||||
valuation-based-on-field-in-bom
|
||||
valuation-based-on-field-in-bom
|
||||
capacity-planning
|
@ -1,4 +1,4 @@
|
||||
<h1>Project Costing</h1>
|
||||
# Project Costing
|
||||
|
||||
Each project has multiple task associated with it. To track actual costing of a Project, primarily in terms of services, user has to create Time Log based on actual time spent on Project-Task. Following the steps on how you can track actual service cost against Project.
|
||||
|
||||
@ -12,17 +12,17 @@ Activity Type is a master of service offered by your personnel. You can add new
|
||||
|
||||
Activity Cost is a master where you can track billing and costing rate for each Employee, and for each Activity Type.
|
||||
|
||||

|
||||
<img alt="Activity Cost" class="screenshot" src="/docs/assets/img/articles/Screen Shot 2015-06-11 at 4.57.01 pm.png">
|
||||
|
||||
#### Time Log
|
||||
|
||||
Based on Actual Time spent on the Project-Task, Employee will create a time log.
|
||||
|
||||

|
||||
<img alt="Time Log" class="screenshot" src="/docs/assets/img/articles/Screen Shot 2015-06-11 at 4.59.49 pm.png">
|
||||
|
||||
On selection of Activity Type in the Time Log, Billing and Costing Rate will fetched for that Employee from respective Activity Cost master.
|
||||
|
||||

|
||||
<img alt="[Time Log Costing" class="screenshot" src="/docs/assets/img/articles/Screen Shot 2015-06-11 at 5.00.06 pm.png">
|
||||
|
||||
Multiplying these rates with total no. of Hours in the Time Log gives Costing Amount and Billing Amount for the specific Time Log.
|
||||
|
||||
@ -30,10 +30,10 @@ Multiplying these rates with total no. of Hours in the Time Log gives Costing Am
|
||||
|
||||
Based on total Time Logs created for a specific Task, its costing will be updated in the respective Task master.
|
||||
|
||||

|
||||
<img alt="Costing in Task" class="screenshot" src="/docs/assets/img/articles/Screen Shot 2015-06-11 at 5.02.54 pm.png">
|
||||
|
||||
Same way, Project master will have cost updated based on Time Log created against that Projects, and tasks associated with that Project.
|
||||
|
||||

|
||||
<img alt="Costing in Project" class="screenshot" src="/docs/assets/img/articles/Screen Shot 2015-06-11 at 5.02.29 pm.png">
|
||||
|
||||
<!-- markdown -->
|
@ -48,6 +48,8 @@ In the Timesheet, if "Is Billable" is checked, you will find option to create Sa
|
||||
|
||||
<img class="screenshot" alt="Sales Invoice" src="/docs/assets/img/project/timesheet/timesheet-invoice-1.png">
|
||||
|
||||
<img class="screenshot" alt="Sales Invoice timesheet" src="{{docs_base_url}}/assets/img/project/timesheet/make_invoice_from_timesheet.gif">
|
||||
|
||||
####Sales Invoice
|
||||
|
||||
Sales Invoice has dedicated table for the Timesheet table where Timesheet details will be updated. You can select more Timesheets in this table.
|
||||
|
@ -0,0 +1 @@
|
||||
#
|