Compare commits
114 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec6267e82a | ||
|
|
db05ac2414 | ||
|
|
f862505bf9 | ||
|
|
ea6d7e9b09 | ||
|
|
8f782e71af | ||
|
|
dac204b1e3 | ||
|
|
9c786948d5 | ||
|
|
6f1795cb3d | ||
|
|
01b555edc7 | ||
|
|
20b01873ab | ||
|
|
43accf4c07 | ||
|
|
9239ed5c44 | ||
|
|
713e2b7b62 | ||
|
|
3b6dc141c6 | ||
|
|
e4fb7b1b2f | ||
|
|
9a1bcac576 | ||
|
|
e68b089187 | ||
|
|
d8a372587d | ||
|
|
f04ce3c5a6 | ||
|
|
50f8262ac7 | ||
|
|
e30fadc661 | ||
|
|
f0937bf722 | ||
|
|
4810831678 | ||
|
|
7cdc6fd789 | ||
|
|
03e5ea3a0d | ||
|
|
9d5a07d101 | ||
|
|
b7bc6bd75d | ||
|
|
23a6d05622 | ||
|
|
b969c2cb60 | ||
|
|
c4e71fcc51 | ||
|
|
b8a8fb5877 | ||
|
|
734cf70b43 | ||
|
|
6fe3ac49cf | ||
|
|
e4e69ec027 | ||
|
|
386d9e1613 | ||
|
|
40c60b6182 | ||
|
|
95c998109d | ||
|
|
33bcaa8a07 | ||
|
|
4da2c81641 | ||
|
|
c2595aa902 | ||
|
|
613ef344f3 | ||
|
|
0c1be8df35 | ||
|
|
815ebafa7b | ||
|
|
8f7708ed5b | ||
|
|
1bd9f22add | ||
|
|
f369b5951e | ||
|
|
81995389ac | ||
|
|
fe913c9969 | ||
|
|
18d6162935 | ||
|
|
91d6544958 | ||
|
|
f640ad4389 | ||
|
|
39bc4b2a4c | ||
|
|
d973c1606a | ||
|
|
df9cf2ef8e | ||
|
|
528ab53b3a | ||
|
|
9cd356c7f0 | ||
|
|
de08639d49 | ||
|
|
987009bf35 | ||
|
|
c833cc8432 | ||
|
|
3f22ec9536 | ||
|
|
d643f2b249 | ||
|
|
b739dd24b2 | ||
|
|
c917423b01 | ||
|
|
6a23016f90 | ||
|
|
730f3e7aba | ||
|
|
033ed00c56 | ||
|
|
6c0d9579d2 | ||
|
|
09fc241d59 | ||
|
|
e78ef5f8c8 | ||
|
|
315a5e1b4d | ||
|
|
7909a30008 | ||
|
|
cf80f850bd | ||
|
|
36f2d4f81e | ||
|
|
a7d92bc8f6 | ||
|
|
332729e99e | ||
|
|
18480bdc23 | ||
|
|
4b08f9ad1f | ||
|
|
ea5a32d304 | ||
|
|
c9501eb460 | ||
|
|
d908b99b00 | ||
|
|
6646960e31 | ||
|
|
185c247286 | ||
|
|
a56121a342 | ||
|
|
cc054a5bbc | ||
|
|
aa12d30d5a | ||
|
|
399a4bf201 | ||
|
|
70be24d6f0 | ||
|
|
6ddbb8820a | ||
|
|
6252e935a0 | ||
|
|
5bbc68df8b | ||
|
|
8bd2487533 | ||
|
|
08fb39f1ba | ||
|
|
baef2624a2 | ||
|
|
88fff46ab4 | ||
|
|
f44b5152d2 | ||
|
|
ec2d09c557 | ||
|
|
722b22a834 | ||
|
|
08e2105b09 | ||
|
|
11d565b07c | ||
|
|
a2c9d13f68 | ||
|
|
508542d4d9 | ||
|
|
50ff8471e0 | ||
|
|
78b8cdc3c1 | ||
|
|
2275cd15e6 | ||
|
|
d217387400 | ||
|
|
b9376641af | ||
|
|
ee018b5ae1 | ||
|
|
c41ab8d15b | ||
|
|
7127a8f522 | ||
|
|
acf85dffc5 | ||
|
|
44f85fed26 | ||
|
|
590d2d524b | ||
|
|
fe11e71084 | ||
|
|
2c76aec119 |
@@ -2,7 +2,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
__version__ = '7.0.21'
|
||||
__version__ = '7.0.32'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
|
||||
@@ -47,7 +47,7 @@ cur_frm.cscript.account_type = function(doc, cdt, cdn) {
|
||||
|
||||
cur_frm.cscript.add_toolbar_buttons = function(doc) {
|
||||
cur_frm.add_custom_button(__('Chart of Accounts'),
|
||||
function() { frappe.set_route("Tree", "Account"); }, __("View"))
|
||||
function() { frappe.set_route("Tree", "Account"); });
|
||||
|
||||
if (doc.is_group == 1) {
|
||||
cur_frm.add_custom_button(__('Group to Non-Group'),
|
||||
@@ -61,7 +61,7 @@ cur_frm.cscript.add_toolbar_buttons = function(doc) {
|
||||
"company": doc.company
|
||||
};
|
||||
frappe.set_route("query-report", "General Ledger");
|
||||
}, __("View"));
|
||||
});
|
||||
|
||||
cur_frm.add_custom_button(__('Non-Group to Group'),
|
||||
function() { cur_frm.cscript.convert_to_group(); }, 'icon-retweet', 'btn-default')
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"document_type": "",
|
||||
"editable_grid": 1,
|
||||
"fields": [
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
@@ -65,24 +66,24 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "monthly_distribution",
|
||||
"fieldname": "company",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Monthly Distribution",
|
||||
"label": "Company",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Monthly Distribution",
|
||||
"options": "Company",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -170,24 +171,25 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "company",
|
||||
"depends_on": "eval:in_list([\"Stop\", \"Warn\"], doc.action_if_accumulated_monthly_budget_exceeded)",
|
||||
"fieldname": "monthly_distribution",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Company",
|
||||
"label": "Monthly Distribution",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Company",
|
||||
"options": "Monthly Distribution",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -271,13 +273,14 @@
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"idx": 0,
|
||||
"image_view": 0,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"is_submittable": 1,
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2016-05-16 15:00:40.233685",
|
||||
"modified": "2016-08-18 14:46:02.653081",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Budget",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import flt, getdate, add_months, get_last_day
|
||||
from frappe.utils import flt, getdate, add_months, get_last_day, fmt_money
|
||||
from frappe.model.naming import make_autoname
|
||||
from frappe.model.document import Document
|
||||
|
||||
@@ -73,25 +73,30 @@ def validate_expense_against_budget(args):
|
||||
args.posting_date, args.fiscal_year, budget.budget_amount)
|
||||
|
||||
args["month_end_date"] = get_last_day(args.posting_date)
|
||||
|
||||
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
budget_amount, _("Accumulated Monthly"), monthly_action)
|
||||
|
||||
elif yearly_action in ["Stop", "Warn"]:
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
flt(budget.budget_amount), _("Annual"), yearly_action)
|
||||
if yearly_action in ("Stop", "Warn") and monthly_action != "Stop" \
|
||||
and yearly_action != monthly_action:
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
flt(budget.budget_amount), _("Annual"), yearly_action)
|
||||
|
||||
def compare_expense_with_budget(args, cost_center, budget_amount, action_for, action):
|
||||
actual_expense = get_actual_expense(args, cost_center)
|
||||
if actual_expense > budget_amount:
|
||||
diff = actual_expense - budget_amount
|
||||
currency = frappe.db.get_value('Company', frappe.db.get_value('Cost Center',
|
||||
cost_center, 'company'), 'default_currency')
|
||||
|
||||
msg = _("{0} Budget for Account {1} against Cost Center {2} is {3}. It will exceed by {4}").format(_(action_for), args.account, cost_center, budget_amount, diff)
|
||||
msg = _("{0} Budget for Account {1} against Cost Center {2} is {3}. It will exceed by {4}").format(_(action_for),
|
||||
frappe.bold(args.account), frappe.bold(cost_center),
|
||||
frappe.bold(fmt_money(budget_amount, currency=currency)), frappe.bold(fmt_money(diff, currency=currency)))
|
||||
|
||||
if action=="Stop":
|
||||
frappe.throw(msg, BudgetError)
|
||||
else:
|
||||
frappe.msgprint(msg)
|
||||
frappe.msgprint(msg, indicator='orange')
|
||||
|
||||
def get_accumulated_monthly_budget(monthly_distribution, posting_date, fiscal_year, annual_budget):
|
||||
distribution = {}
|
||||
|
||||
@@ -32,8 +32,13 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||
cur_frm.toggle_display('sb1', doc.is_group==0)
|
||||
cur_frm.set_intro(intro_txt);
|
||||
|
||||
cur_frm.add_custom_button(__('Chart of Cost Centers'),
|
||||
function() { frappe.set_route("Tree", "Cost Center"); }, __("View"))
|
||||
if(!cur_frm.doc.__islocal) {
|
||||
cur_frm.add_custom_button(__('Chart of Cost Centers'),
|
||||
function() { frappe.set_route("Tree", "Cost Center"); });
|
||||
|
||||
cur_frm.add_custom_button(__('Budget'),
|
||||
function() { frappe.set_route("List", "Budget", {'cost_center': cur_frm.doc.name}); });
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.parent_cost_center = function(doc, cdt, cdn) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
||||
// For license information, please see license.txt
|
||||
{% include "erpnext/public/js/controllers/accounts.js" %}
|
||||
|
||||
frappe.ui.form.on('Payment Entry', {
|
||||
onload: function(frm) {
|
||||
@@ -257,22 +258,6 @@ frappe.ui.form.on('Payment Entry', {
|
||||
}
|
||||
},
|
||||
|
||||
mode_of_payment: function(frm) {
|
||||
return frappe.call({
|
||||
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
|
||||
args: {
|
||||
"mode_of_payment": frm.doc.mode_of_payment,
|
||||
"company": frm.doc.company
|
||||
},
|
||||
callback: function(r, rt) {
|
||||
if(r.message) {
|
||||
var payment_account_field = frm.doc.payment_type == "Receive" ? "paid_to" : "paid_from";
|
||||
frm.set_value(payment_account_field, r.message['account']);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
paid_from: function(frm) {
|
||||
if(frm.set_party_account_based_on_party) return;
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
{% include "erpnext/public/js/controllers/accounts.js" %}
|
||||
|
||||
frappe.ui.form.on("POS Profile", "onload", function(frm) {
|
||||
frm.set_query("selling_price_list", function() {
|
||||
return { filters: { selling: 1 } };
|
||||
|
||||
@@ -118,6 +118,32 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "campaign",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Campaign",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Campaign",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -690,6 +716,32 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "account_for_change_amount",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Account for Change Amount",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Account",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -833,7 +885,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2016-08-06 17:05:59.990031",
|
||||
"modified": "2016-08-17 15:12:56.713748",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "POS Profile",
|
||||
|
||||
@@ -232,7 +232,8 @@ cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
||||
|
||||
cur_frm.fields_dict['items'].grid.get_field("item_code").get_query = function(doc, cdt, cdn) {
|
||||
return {
|
||||
query: "erpnext.controllers.queries.item_query"
|
||||
query: "erpnext.controllers.queries.item_query",
|
||||
filters: {'is_purchase_item': 1}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"document_type": "Document",
|
||||
"editable_grid": 0,
|
||||
"fields": [
|
||||
{
|
||||
"allow_on_submit": 1,
|
||||
@@ -117,6 +118,33 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"description": "",
|
||||
"fieldname": "bill_no",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Supplier Invoice No",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "bill_no",
|
||||
"oldfieldtype": "Data",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -142,6 +170,32 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"default": "0",
|
||||
"fieldname": "is_return",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Is Return",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -198,19 +252,18 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"description": "",
|
||||
"fieldname": "bill_no",
|
||||
"fieldtype": "Data",
|
||||
"fieldname": "bill_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Supplier Invoice No",
|
||||
"label": "Supplier Invoice Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "bill_no",
|
||||
"oldfieldtype": "Data",
|
||||
"oldfieldname": "bill_date",
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
@@ -225,17 +278,17 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "bill_date",
|
||||
"fieldname": "due_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Supplier Invoice Date",
|
||||
"label": "Due Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "bill_date",
|
||||
"oldfieldname": "due_date",
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
@@ -299,32 +352,6 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"default": "0",
|
||||
"fieldname": "is_return",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Is Return",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -2497,32 +2524,6 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "due_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Due Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "due_date",
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -3031,7 +3032,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2016-06-30 13:40:39.440648",
|
||||
"modified": "2016-08-10 02:45:28.746569",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Purchase Invoice",
|
||||
|
||||
@@ -497,6 +497,18 @@ class PurchaseInvoice(BuyingController):
|
||||
|
||||
i += 1
|
||||
|
||||
if self.update_stock and valuation_tax:
|
||||
for cost_center, amount in valuation_tax.items():
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": self.expenses_included_in_valuation,
|
||||
"cost_center": cost_center,
|
||||
"against": self.supplier,
|
||||
"credit": amount,
|
||||
"remarks": self.remarks or "Accounting Entry for Stock"
|
||||
})
|
||||
)
|
||||
|
||||
def make_payment_gl_entries(self, gl_entries):
|
||||
# Make Cash GL Entries
|
||||
if cint(self.is_paid) and self.cash_bank_account and self.paid_amount:
|
||||
|
||||
@@ -18,3 +18,13 @@ frappe.ui.form.on("Purchase Taxes and Charges", "add_deduct_tax", function(doc,
|
||||
}
|
||||
refresh_field('add_deduct_tax', d.name, 'taxes');
|
||||
});
|
||||
|
||||
frappe.ui.form.on("Purchase Taxes and Charges", "category", function(doc, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
|
||||
if (d.category != 'Total' && d.add_deduct_tax == 'Deduct') {
|
||||
msgprint(__("Cannot deduct when category is for 'Valuation' or 'Vaulation and Total'"));
|
||||
d.add_deduct_tax = '';
|
||||
}
|
||||
refresh_field('add_deduct_tax', d.name, 'taxes');
|
||||
});
|
||||
|
||||
@@ -13,9 +13,9 @@ from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
||||
@frappe.whitelist()
|
||||
def get_pos_data():
|
||||
doc = frappe.new_doc('Sales Invoice')
|
||||
doc.update_stock = 1;
|
||||
doc.is_pos = 1;
|
||||
pos_profile = get_pos_profile(doc.company) or {}
|
||||
doc.update_stock = pos_profile.get('update_stock')
|
||||
|
||||
if pos_profile.get('name'):
|
||||
pos_profile = frappe.get_doc('POS Profile', pos_profile.get('name'))
|
||||
@@ -35,7 +35,6 @@ def get_pos_data():
|
||||
'customers': get_customers(pos_profile, doc),
|
||||
'pricing_rules': get_pricing_rules(doc),
|
||||
'print_template': print_template,
|
||||
'write_off_account': pos_profile.get('write_off_account'),
|
||||
'meta': {
|
||||
'invoice': frappe.get_meta('Sales Invoice'),
|
||||
'items': frappe.get_meta('Sales Invoice Item'),
|
||||
@@ -45,7 +44,12 @@ def get_pos_data():
|
||||
|
||||
def update_pos_profile_data(doc, pos_profile):
|
||||
company_data = frappe.db.get_value('Company', doc.company, '*', as_dict=1)
|
||||
doc.campaign = pos_profile.get('campaign')
|
||||
|
||||
doc.write_off_account = pos_profile.get('write_off_account') or \
|
||||
company_data.write_off_account
|
||||
doc.change_amount_account = pos_profile.get('change_amount_account') or \
|
||||
company_data.default_cash_account
|
||||
doc.taxes_and_charges = pos_profile.get('taxes_and_charges')
|
||||
if doc.taxes_and_charges:
|
||||
update_tax_table(doc)
|
||||
@@ -54,7 +58,8 @@ def update_pos_profile_data(doc, pos_profile):
|
||||
doc.conversion_rate = 1.0
|
||||
if doc.currency != company_data.default_currency:
|
||||
doc.conversion_rate = get_exchange_rate(doc.currency, company_data.default_currency)
|
||||
doc.selling_price_list = pos_profile.get('selling_price_list') or frappe.db.get_value('Selling Settings', None, 'selling_price_list')
|
||||
doc.selling_price_list = pos_profile.get('selling_price_list') or \
|
||||
frappe.db.get_value('Selling Settings', None, 'selling_price_list')
|
||||
doc.naming_series = pos_profile.get('naming_series') or 'SINV-'
|
||||
doc.letter_head = pos_profile.get('letter_head') or company_data.default_letter_head
|
||||
doc.ignore_pricing_rule = pos_profile.get('ignore_pricing_rule') or 0
|
||||
@@ -100,7 +105,7 @@ def update_tax_table(doc):
|
||||
|
||||
def get_items(doc, pos_profile):
|
||||
item_list = []
|
||||
for item in frappe.get_all("Item", fields=["*"], filters={'disabled': 0, 'has_variants': 0}):
|
||||
for item in frappe.get_all("Item", fields=["*"], filters={'disabled': 0, 'has_variants': 0, 'is_sales_item': 1}):
|
||||
item_doc = frappe.get_doc('Item', item.name)
|
||||
if item_doc.taxes:
|
||||
item.taxes = json.dumps(dict(([d.tax_type, d.tax_rate] for d in
|
||||
@@ -157,10 +162,11 @@ def get_customers(pos_profile, doc):
|
||||
def get_pricing_rules(doc):
|
||||
pricing_rules = ""
|
||||
if doc.ignore_pricing_rule == 0:
|
||||
pricing_rules = frappe.db.sql(""" Select * from `tabPricing Rule` where docstatus < 2 and disable = 0
|
||||
and selling = 1 and ifnull(company, '') in (%(company)s, '') and
|
||||
ifnull(for_price_list, '') in (%(price_list)s, '') and %(date)s between
|
||||
ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31') order by priority desc, name desc""",
|
||||
pricing_rules = frappe.db.sql(""" Select * from `tabPricing Rule` where docstatus < 2
|
||||
and ifnull(for_price_list, '') in (%(price_list)s, '') and selling = 1
|
||||
and ifnull(company, '') in (%(company)s, '') and disable = 0 and %(date)s
|
||||
between ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')
|
||||
order by priority desc, name desc""",
|
||||
{'company': doc.company, 'price_list': doc.selling_price_list, 'date': nowdate()}, as_dict=1)
|
||||
return pricing_rules
|
||||
|
||||
@@ -173,17 +179,23 @@ def make_invoice(doc_list):
|
||||
|
||||
for docs in doc_list:
|
||||
for name, doc in docs.items():
|
||||
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
|
||||
validate_customer(doc)
|
||||
validate_item(doc)
|
||||
if not frappe.db.exists('Sales Invoice',
|
||||
{'offline_pos_name': name, 'docstatus': ("<", "2")}):
|
||||
validate_records(doc)
|
||||
si_doc = frappe.new_doc('Sales Invoice')
|
||||
si_doc.offline_pos_name = name
|
||||
si_doc.update(doc)
|
||||
submit_invoice(si_doc, name)
|
||||
name_list.append(name)
|
||||
else:
|
||||
name_list.append(name)
|
||||
|
||||
return name_list
|
||||
|
||||
def validate_records(doc):
|
||||
validate_customer(doc)
|
||||
validate_item(doc)
|
||||
|
||||
def validate_customer(doc):
|
||||
if not frappe.db.exists('Customer', doc.get('customer')):
|
||||
customer_doc = frappe.new_doc('Customer')
|
||||
@@ -195,8 +207,6 @@ def validate_customer(doc):
|
||||
frappe.db.commit()
|
||||
doc['customer'] = customer_doc.name
|
||||
|
||||
return doc
|
||||
|
||||
def validate_item(doc):
|
||||
for item in doc.get('items'):
|
||||
if not frappe.db.exists('Item', item.get('item_code')):
|
||||
@@ -222,6 +232,7 @@ def submit_invoice(si_doc, name):
|
||||
|
||||
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.insert()
|
||||
make_scheduler_log(e, si_doc.name)
|
||||
|
||||
@@ -267,6 +267,16 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
||||
|
||||
amount: function(){
|
||||
this.write_off_outstanding_amount_automatically()
|
||||
},
|
||||
|
||||
change_amount: function(){
|
||||
if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
|
||||
this.calculate_write_off_amount()
|
||||
}else {
|
||||
this.frm.set_value("change_amount", 0.0)
|
||||
}
|
||||
|
||||
this.frm.refresh_fields();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -458,7 +468,7 @@ frappe.ui.form.on('Sales Invoice', {
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
frappe.ui.form.on('Sales Invoice Timesheet', {
|
||||
|
||||
@@ -2200,32 +2200,6 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "base_change_amount",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Base Change Amount (Company Currency)",
|
||||
"length": 0,
|
||||
"no_copy": 1,
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -2278,6 +2252,80 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "section_break_88",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "base_change_amount",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Base Change Amount (Company Currency)",
|
||||
"length": 0,
|
||||
"no_copy": 1,
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "column_break_90",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
@@ -2297,7 +2345,33 @@
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "account_for_change_amount",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Account for Change Amount",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Account",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
@@ -3677,7 +3751,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2016-08-03 11:50:49.680278",
|
||||
"modified": "2016-08-17 15:12:39.357372",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Sales Invoice",
|
||||
|
||||
@@ -61,6 +61,7 @@ class SalesInvoice(SellingController):
|
||||
self.clear_unallocated_advances("Sales Invoice Advance", "advances")
|
||||
self.add_remarks()
|
||||
self.validate_write_off_account()
|
||||
self.validate_account_for_change_amount()
|
||||
self.validate_fixed_asset()
|
||||
self.set_income_account_for_fixed_assets()
|
||||
|
||||
@@ -233,12 +234,22 @@ class SalesInvoice(SellingController):
|
||||
from erpnext.stock.get_item_details import get_pos_profile_item_details, get_pos_profile
|
||||
pos = get_pos_profile(self.company)
|
||||
|
||||
if not self.get('payments'):
|
||||
pos_profile = frappe.get_doc('POS Profile', pos.name) if pos else None
|
||||
update_multi_mode_option(self, pos_profile)
|
||||
|
||||
if not self.account_for_change_amount:
|
||||
self.account_for_change_amount = frappe.db.get_value('Company', self.company, 'default_cash_account')
|
||||
|
||||
if pos:
|
||||
if not for_validate and not self.customer:
|
||||
self.customer = pos.customer
|
||||
self.mode_of_payment = pos.mode_of_payment
|
||||
# self.set_customer_defaults()
|
||||
|
||||
if pos.get('account_for_change_amount'):
|
||||
self.account_for_change_amount = pos.get('account_for_change_amount')
|
||||
|
||||
for fieldname in ('territory', 'naming_series', 'currency', 'taxes_and_charges', 'letter_head', 'tc_name',
|
||||
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account',
|
||||
'write_off_account', 'write_off_cost_center'):
|
||||
@@ -265,10 +276,6 @@ class SalesInvoice(SellingController):
|
||||
if self.taxes_and_charges and not len(self.get("taxes")):
|
||||
self.set_taxes()
|
||||
|
||||
if not self.get('payments'):
|
||||
pos_profile = frappe.get_doc('POS Profile', pos.name)
|
||||
update_multi_mode_option(self, pos_profile)
|
||||
|
||||
return pos
|
||||
|
||||
def get_company_abbr(self):
|
||||
@@ -374,11 +381,16 @@ class SalesInvoice(SellingController):
|
||||
if d.delivery_note:
|
||||
msgprint(_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note), raise_exception=1)
|
||||
|
||||
|
||||
def validate_write_off_account(self):
|
||||
if flt(self.write_off_amount) and not self.write_off_account:
|
||||
self.write_off_account = frappe.db.get_value('Company', self.company, 'write_off_account')
|
||||
|
||||
if flt(self.write_off_amount) and not self.write_off_account:
|
||||
msgprint(_("Please enter Write Off Account"), raise_exception=1)
|
||||
|
||||
def validate_account_for_change_amount(self):
|
||||
if flt(self.change_amount) and not self.account_for_change_amount:
|
||||
msgprint(_("Please enter Account for Change Amount"), raise_exception=1)
|
||||
|
||||
def validate_c_form(self):
|
||||
""" Blank C-form no if C-form applicable marked as 'No'"""
|
||||
@@ -502,7 +514,7 @@ class SalesInvoice(SellingController):
|
||||
gl_entries = merge_similar_entries(gl_entries)
|
||||
|
||||
self.make_pos_gl_entries(gl_entries)
|
||||
self.make_gle_for_change(gl_entries)
|
||||
self.make_gle_for_change_amount(gl_entries)
|
||||
|
||||
self.make_write_off_gl_entry(gl_entries)
|
||||
|
||||
@@ -606,16 +618,15 @@ class SalesInvoice(SellingController):
|
||||
}, payment_mode_account_currency)
|
||||
)
|
||||
|
||||
def make_gle_for_change(self, gl_entries):
|
||||
def make_gle_for_change_amount(self, gl_entries):
|
||||
if cint(self.is_pos) and self.change_amount:
|
||||
cash_account = self.get_cash_account()
|
||||
if cash_account:
|
||||
if self.account_for_change_amount:
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": self.debit_to,
|
||||
"party_type": "Customer",
|
||||
"party": self.customer,
|
||||
"against": cash_account,
|
||||
"against": self.account_for_change_amount,
|
||||
"debit": flt(self.base_change_amount),
|
||||
"debit_in_account_currency": flt(self.base_change_amount) \
|
||||
if self.party_account_currency==self.company_currency else flt(self.change_amount),
|
||||
@@ -626,22 +637,13 @@ class SalesInvoice(SellingController):
|
||||
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": cash_account,
|
||||
"account": self.account_for_change_amount,
|
||||
"against": self.customer,
|
||||
"credit": self.base_change_amount
|
||||
})
|
||||
)
|
||||
|
||||
|
||||
def get_cash_account(self):
|
||||
cash_account = [d.account for d in self.payments if d.type=="Cash"]
|
||||
if cash_account:
|
||||
cash_account = cash_account[0]
|
||||
else:
|
||||
cash_account = frappe.db.get_value("Account",
|
||||
filters={"company": self.company, "account_type": "Cash", "is_group": 0})
|
||||
|
||||
return cash_account
|
||||
else:
|
||||
frappe.throw(_("Select change amount account"), title="Mandatory Field")
|
||||
|
||||
def make_write_off_gl_entry(self, gl_entries):
|
||||
# write off entries, applicable if only pos
|
||||
|
||||
@@ -455,6 +455,25 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
|
||||
self.pos_gl_entry(si, pos, 300)
|
||||
|
||||
def test_pos_change_amount(self):
|
||||
set_perpetual_inventory()
|
||||
self.make_pos_profile()
|
||||
|
||||
self._insert_purchase_receipt()
|
||||
pos = copy.deepcopy(test_records[1])
|
||||
pos["is_pos"] = 1
|
||||
pos["update_stock"] = 1
|
||||
pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
|
||||
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 340}]
|
||||
|
||||
si = frappe.copy_doc(pos)
|
||||
si.change_amount = 5.0
|
||||
si.insert()
|
||||
si.submit()
|
||||
|
||||
self.assertEquals(si.grand_total, 630.0)
|
||||
self.assertEquals(si.write_off_amount, -5)
|
||||
|
||||
def test_make_pos_invoice(self):
|
||||
from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
|
||||
|
||||
|
||||
@@ -183,6 +183,14 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
if(this.frm.doc.customer){
|
||||
this.party_field.$input.val(this.frm.doc.customer);
|
||||
}
|
||||
|
||||
if(!this.frm.doc.write_off_account){
|
||||
this.frm.doc.write_off_account = doc.write_off_account
|
||||
}
|
||||
|
||||
if(!this.frm.doc.account_for_change_amount){
|
||||
this.frm.doc.account_for_change_amount = doc.account_for_change_amount
|
||||
}
|
||||
},
|
||||
|
||||
get_invoice_doc: function(si_docs){
|
||||
@@ -209,7 +217,6 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
window.meta = r.message.meta;
|
||||
window.print_template = r.message.print_template;
|
||||
me.default_customer = r.message.default_customer || null;
|
||||
me.write_off_account = r.message.write_off_account;
|
||||
localStorage.setItem('doc', JSON.stringify(r.message.doc));
|
||||
if(callback){
|
||||
callback();
|
||||
@@ -421,19 +428,25 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
}
|
||||
|
||||
key = this.search.$input.val().toLowerCase();
|
||||
search_status = true
|
||||
|
||||
if(key){
|
||||
return $.grep(window.items, function(item){
|
||||
if(in_list(item.batch_nos, me.search.$input.val())){
|
||||
return me.item_batch_no[item.item_code] = me.search.$input.val()
|
||||
} else if((item.item_code.toLowerCase().match(key)) ||
|
||||
(item.item_name.toLowerCase().match(key)) || (item.item_group.toLowerCase().match(key))){
|
||||
return true
|
||||
}else if(item.barcode == me.search.$input.val()){
|
||||
return item.barcode == me.search.$input.val();
|
||||
} else if (in_list(Object.keys(item.serial_nos), me.search.$input.val())){
|
||||
me.item_serial_no[item.item_code] = [me.search.$input.val(), item.serial_nos[me.search.$input.val()]]
|
||||
return true
|
||||
if(search_status){
|
||||
if(in_list(item.batch_nos, me.search.$input.val())){
|
||||
search_status = false;
|
||||
return me.item_batch_no[item.item_code] = me.search.$input.val()
|
||||
} else if(in_list(Object.keys(item.serial_nos), me.search.$input.val())) {
|
||||
search_status = false;
|
||||
me.item_serial_no[item.item_code] = [me.search.$input.val(), item.serial_nos[me.search.$input.val()]]
|
||||
return true
|
||||
} else if(item.barcode == me.search.$input.val()) {
|
||||
search_status = false;
|
||||
return item.barcode == me.search.$input.val();
|
||||
} else if((item.item_code.toLowerCase().match(key)) ||
|
||||
(item.item_name.toLowerCase().match(key)) || (item.item_group.toLowerCase().match(key))) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
})
|
||||
}else{
|
||||
@@ -479,11 +492,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
|
||||
this.remove_item = []
|
||||
$.each(this.frm.doc["items"] || [], function(i, d) {
|
||||
if (d.item_code == item_code && d.serial_no
|
||||
&& field == 'qty' && cint(value) != value) {
|
||||
d.qty = 0.0;
|
||||
me.refresh();
|
||||
frappe.throw(__("Serial no item cannot be a fraction"))
|
||||
if(d.serial_no){
|
||||
me.validate_serial_no_qty(d, item_code, field, value)
|
||||
}
|
||||
|
||||
if (d.item_code == item_code) {
|
||||
@@ -499,7 +509,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.remove_zero_qty_item();
|
||||
}
|
||||
|
||||
this.refresh();
|
||||
this.update_paid_amount_status(false)
|
||||
},
|
||||
|
||||
remove_zero_qty_item: function(){
|
||||
@@ -581,7 +591,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
if (!caught)
|
||||
this.add_new_item_to_grid();
|
||||
|
||||
this.refresh();
|
||||
this.update_paid_amount_status(false)
|
||||
},
|
||||
|
||||
add_new_item_to_grid: function() {
|
||||
@@ -606,6 +616,14 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
? this.item_serial_no[this.child.item_code][0] : '');
|
||||
},
|
||||
|
||||
update_paid_amount_status: function(update_paid_amount){
|
||||
if(this.name){
|
||||
update_paid_amount = update_paid_amount ? false : true;
|
||||
}
|
||||
|
||||
this.refresh(update_paid_amount);
|
||||
},
|
||||
|
||||
refresh: function(update_paid_amount) {
|
||||
var me = this;
|
||||
this.refresh_fields(update_paid_amount);
|
||||
@@ -613,6 +631,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.update_rate();
|
||||
this.set_primary_action();
|
||||
},
|
||||
|
||||
refresh_fields: function(update_paid_amount) {
|
||||
this.apply_pricing_rule();
|
||||
this.discount_amount_applied = false;
|
||||
@@ -688,7 +707,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
|
||||
if (this.frm.doc.docstatus==0) {
|
||||
this.page.set_primary_action(__("Pay"), function() {
|
||||
me.validate()
|
||||
me.validate();
|
||||
me.update_paid_amount_status(true);
|
||||
me.create_invoice();
|
||||
me.make_payment();
|
||||
}, "octicon octicon-credit-card");
|
||||
@@ -717,49 +737,6 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
}, 1000)
|
||||
},
|
||||
|
||||
write_off_amount: function(){
|
||||
var me = this;
|
||||
var value = 0.0;
|
||||
|
||||
if(this.frm.doc.outstanding_amount > 0){
|
||||
dialog = new frappe.ui.Dialog({
|
||||
title: 'Write Off Amount',
|
||||
fields: [
|
||||
{fieldtype: "Check", fieldname: "write_off_amount", label: __("Write off Outstanding Amount")},
|
||||
{fieldtype: "Link", options:"Account", default:this.write_off_account, fieldname: "write_off_account",
|
||||
label: __("Write off Account"), get_query: function() {
|
||||
return {
|
||||
filters: {'is_group': 0, 'report_type': 'Profit and Loss'}
|
||||
}
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
|
||||
dialog.fields_dict.write_off_amount.$input.change(function(){
|
||||
write_off_amount = dialog.get_values().write_off_amount;
|
||||
me.frm.doc.write_off_outstanding_amount_automatically = write_off_amount;
|
||||
me.frm.doc.base_write_off_amount = (write_off_amount==1) ? flt(me.frm.doc.grand_total - me.frm.doc.paid_amount, precision("outstanding_amount")) : 0;
|
||||
me.frm.doc.write_off_account = (write_off_amount==1) ? dialog.get_values().write_off_account : '';
|
||||
me.frm.doc.write_off_amount = flt(me.frm.doc.base_write_off_amount * me.frm.doc.conversion_rate, precision("write_off_amount"))
|
||||
me.calculate_outstanding_amount();
|
||||
me.set_primary_action();
|
||||
})
|
||||
|
||||
dialog.fields_dict.write_off_account.$input.change(function(){
|
||||
me.frm.doc.write_off_account = dialog.get_values().write_off_account;
|
||||
})
|
||||
|
||||
dialog.set_primary_action(__("Submit"), function(){
|
||||
dialog.hide()
|
||||
me.submit_invoice()
|
||||
})
|
||||
}else{
|
||||
this.submit_invoice()
|
||||
}
|
||||
},
|
||||
|
||||
submit_invoice: function(){
|
||||
var me = this;
|
||||
frappe.confirm(__("Do you really want to submit the invoice?"), function () {
|
||||
@@ -798,6 +775,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.update_invoice()
|
||||
}else{
|
||||
this.name = $.now();
|
||||
this.frm.doc.posting_date = frappe.datetime.get_today();
|
||||
this.frm.doc.posting_time = frappe.datetime.now_time();
|
||||
invoice_data[this.name] = this.frm.doc
|
||||
this.si_docs.push(invoice_data)
|
||||
this.update_localstorage();
|
||||
@@ -943,6 +922,23 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
}
|
||||
},
|
||||
|
||||
validate_serial_no_qty: function(args, item_code, field, value){
|
||||
var me = this;
|
||||
if (args.item_code == item_code && args.serial_no
|
||||
&& field == 'qty' && cint(value) != value) {
|
||||
args.qty = 0.0;
|
||||
this.refresh();
|
||||
frappe.throw(__("Serial no item cannot be a fraction"))
|
||||
}
|
||||
|
||||
if(args.serial_no && args.serial_no.split('\n').length != cint(value)){
|
||||
args.qty = 0.0;
|
||||
args.serial_no = ''
|
||||
this.refresh();
|
||||
frappe.throw(__("Total nos of serial no is not equal to quantity."))
|
||||
}
|
||||
},
|
||||
|
||||
mandatory_batch_no: function(){
|
||||
var me = this;
|
||||
if(this.items[0].has_batch_no && !this.item_batch_no[this.items[0].item_code]){
|
||||
@@ -970,11 +966,13 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
get_pricing_rule: function(item){
|
||||
var me = this;
|
||||
return $.grep(this.pricing_rules, function(data){
|
||||
if(data.item_code == item.item_code || in_list(['All Item Groups', item.item_group], data.item_group)) {
|
||||
if(in_list(['Customer', 'Customer Group', 'Territory'], data.applicable_for)){
|
||||
return me.validate_condition(data)
|
||||
}else{
|
||||
return true
|
||||
if(item.qty >= data.min_qty && (item.qty <= (data.max_qty ? data.max_qty : item.qty)) ){
|
||||
if(data.item_code == item.item_code || in_list(['All Item Groups', item.item_group], data.item_group)) {
|
||||
if(in_list(['Customer', 'Customer Group', 'Territory', 'Campaign'], data.applicable_for)){
|
||||
return me.validate_condition(data)
|
||||
}else{
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -993,6 +991,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
'Customer': [data.customer, [this.frm.doc.customer]],
|
||||
'Customer Group': [data.customer_group, [this.frm.doc.customer_group, 'All Customer Groups']],
|
||||
'Territory': [data.territory, [this.frm.doc.territory, 'All Territories']],
|
||||
'Campaign': [data.campaign, [this.frm.doc.campaign]],
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
"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{{ company }}<br>\n\t{{ __(\"Invoice\") }}<br>\n</p>\n<p>\n\t<b>{{ __(\"Date\") }}:</b> {{ dateutil.global_date_format(posting_date) }}<br>\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=\"50%\">{{ __(\"Item\") }}</b></th>\n\t\t\t<th width=\"25%\" class=\"text-right\">{{ __(\"Qty\") }}</th>\n\t\t\t<th width=\"25%\" class=\"text-right\">{{ __(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{% for item in items %}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_name }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ format_currency(item.rate, currency) }}</td>\n\t\t\t<td class=\"text-right\">{{ format_currency(item.amount, currency) }}</td>\n\t\t</tr>\n\t\t{% endfor %}\n\t</tbody>\n</table>\n\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{{ format_currency(total, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{% for row in 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{{ format_currency(row.tax_amount, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if 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{{ format_currency(discount_amount, currency) }}\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{{ format_currency(grand_total, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n\n<hr>\n<p class=\"text-center\">{{ __(\"Thank you, please visit again.\") }}</p>",
|
||||
"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{{ company }}<br>\n\t{{ __(\"Invoice\") }}<br>\n</p>\n<p>\n\t<b>{{ __(\"Date\") }}:</b> {{ dateutil.global_date_format(posting_date) }}<br>\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=\"50%\">{{ __(\"Item\") }}</b></th>\n\t\t\t<th width=\"25%\" class=\"text-right\">{{ __(\"Qty\") }}</th>\n\t\t\t<th width=\"25%\" class=\"text-right\">{{ __(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{% for item in items %}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_name }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ format_number(item.qty, precision(\"difference\")) }}<br>@ {{ format_currency(item.rate, currency) }}</td>\n\t\t\t<td class=\"text-right\">{{ format_currency(item.amount, currency) }}</td>\n\t\t</tr>\n\t\t{% endfor %}\n\t</tbody>\n</table>\n\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{{ format_currency(total, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{% for row in 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{{ format_currency(row.tax_amount, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if 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{{ format_currency(discount_amount, currency) }}\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{{ format_currency(grand_total, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n\n<hr>\n<p class=\"text-center\">{{ __(\"Thank you, please visit again.\") }}</p>",
|
||||
"idx": 0,
|
||||
"modified": "2016-05-21 00:25:20.359074",
|
||||
"modified": "2016-08-11 07:23:04.530676",
|
||||
"modified_by": "Administrator",
|
||||
"name": "Point of Sale",
|
||||
"owner": "Administrator",
|
||||
|
||||
@@ -66,7 +66,8 @@ class ReceivablePayableReport(object):
|
||||
columns.append({
|
||||
"fieldname": "currency",
|
||||
"label": _("Currency"),
|
||||
"fieldtype": "Data",
|
||||
"fieldtype": "Link",
|
||||
"options": "Currency",
|
||||
"width": 100
|
||||
})
|
||||
if args.get("party_type") == "Customer":
|
||||
|
||||
@@ -34,7 +34,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
||||
columns.append({
|
||||
"fieldname": "currency",
|
||||
"label": _("Currency"),
|
||||
"fieldtype": "Data",
|
||||
"fieldtype": "Link",
|
||||
"options": "Currency",
|
||||
"width": 80
|
||||
})
|
||||
|
||||
|
||||
@@ -55,14 +55,6 @@ def get_columns():
|
||||
"fieldtype": "Date",
|
||||
"width": 90
|
||||
},
|
||||
{
|
||||
"fieldname": "payment_document",
|
||||
"label": _("Payment Document"),
|
||||
"fieldtype": "Link",
|
||||
"options": "DocType",
|
||||
"width": 120,
|
||||
"hidden": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "payment_entry",
|
||||
"label": _("Payment Entry"),
|
||||
|
||||
@@ -25,6 +25,9 @@ def execute(filters=None):
|
||||
return columns, res
|
||||
|
||||
def validate_filters(filters, account_details):
|
||||
if not filters.get('company'):
|
||||
frappe.throw(_('{0} is mandatory').format(_('Company')))
|
||||
|
||||
if filters.get("account") and not account_details.get(filters.account):
|
||||
frappe.throw(_("Account {0} does not exists").format(filters.account))
|
||||
|
||||
@@ -87,7 +90,7 @@ def get_columns(filters):
|
||||
columns += [
|
||||
_("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/"+_("Voucher Type")+":160",
|
||||
_("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150",
|
||||
_("Project") + ":Link/Project:100", _("Cost Center") + ":Link/Cost Center:100",
|
||||
_("Project") + ":Link/Project:100", _("Cost Center") + ":Link/Cost Center:100",
|
||||
_("Remarks") + "::400"
|
||||
]
|
||||
|
||||
@@ -111,7 +114,7 @@ def get_gl_entries(filters):
|
||||
if filters.get("group_by_voucher") else "group by name"
|
||||
|
||||
gl_entries = frappe.db.sql("""
|
||||
select
|
||||
select
|
||||
posting_date, account, party_type, party,
|
||||
sum(debit) as debit, sum(credit) as credit,
|
||||
voucher_type, voucher_no, cost_center, project,
|
||||
|
||||
@@ -79,7 +79,8 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
||||
}
|
||||
} else {
|
||||
return{
|
||||
query: "erpnext.controllers.queries.item_query"
|
||||
query: "erpnext.controllers.queries.item_query",
|
||||
filters: {'is_purchase_item': 1}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
|
||||
<head>
|
||||
|
||||
|
||||
<link href="/assets/frappe/css/c3.min.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
<script type="text/javascript" src="/assets/frappe/js/lib/d3.min.js"></script>
|
||||
<script type="text/javascript" src="/assets/frappe/js/lib/c3.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
onReady("#chart_div", function() {
|
||||
var chartData = [];
|
||||
{% var q = 0; %}
|
||||
{% for(var j=0, m=data.length+1; j<m; j++) { %}
|
||||
|
||||
var tempData{%=j%} = [];
|
||||
|
||||
{% for(var i=1, l=report.columns.length; i<l; i++) { %}
|
||||
{% if(__(report.columns[i].label) != __("Quotation")) { %}
|
||||
|
||||
{% if(j == 0) { %}
|
||||
{% if(i == 1) { %}
|
||||
tempData{%=j%}[{%=i%}-1] = \"x\";
|
||||
{% } else { %}
|
||||
|
||||
tempData{%=j%}[{%=i%}-1] = Math.log(parseInt(\"{%= report.columns[i].label %}\".replace(\"Qty: \",\"\"))) / Math.LN10;
|
||||
{% } %}
|
||||
{% } else { %}
|
||||
{% if(i == 1) { %}
|
||||
tempData{%=j%}[{%=i%}-1] = \"{%= data[j-1][report.columns[i].field] %} \";
|
||||
{% } else { %}
|
||||
tempData{%=j%}[{%=i%}-1] = {% if(data[j-1][report.columns[i].field] == "") { if (i > 2) { %}
|
||||
tempData{%=j%}[{%=i%}-2]
|
||||
{% } else { %}
|
||||
0
|
||||
{% } } else { %}
|
||||
{%= data[j-1][report.columns[i].field] %}
|
||||
{% } %};
|
||||
{% } %};
|
||||
{% } %}
|
||||
{% } else { %}
|
||||
{% if(j == 0) { %}
|
||||
{% if(i < l-1) { %}
|
||||
tempData{%=j%}[{%=i%}-1] = Math.log(parseInt(\"{%= report.columns[i+1].label %}\".replace(\"Qty: \",\"\"))-1) / Math.LN10;
|
||||
{% } else { %}
|
||||
tempData{%=j%}[{%=i%}-1] = Math.log(2*parseInt(\"{%= report.columns[i-1].label %}\".replace(\"Qty: \",\"\"))) / Math.LN10;
|
||||
{% } %}
|
||||
{% } else { %}
|
||||
|
||||
tempData{%=j%}[{%=i%}-1] = tempData{%=j%}[{%=i%}-2];
|
||||
{% } %}
|
||||
|
||||
{% } %}
|
||||
|
||||
{% } %}
|
||||
chartData[{%=j%}] = tempData{%=j%};
|
||||
{% } %}
|
||||
console.log(chartData);
|
||||
|
||||
hold = {
|
||||
bindto: "#chart_div" ,data: {
|
||||
x: "x",
|
||||
columns: chartData
|
||||
},
|
||||
axis: {
|
||||
x: {
|
||||
tick: {
|
||||
format: function (x22) { return Math.pow(10,x22).toFixed(0); },
|
||||
culling: {
|
||||
max: {%=report.columns.length%} / 2
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
point: {
|
||||
show: false
|
||||
}
|
||||
};
|
||||
console.log(hold);
|
||||
var chart = c3.generate(hold);
|
||||
});
|
||||
|
||||
function onReady(selector, callback) {
|
||||
var intervalID = window.setInterval(function() {
|
||||
if (document.querySelector(selector) !== undefined) {
|
||||
window.clearInterval(intervalID);
|
||||
callback.call(this);
|
||||
}
|
||||
}, 500);}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<div style="margin-bottom: 7px;" class="text-center">
|
||||
{%= frappe.boot.letter_heads[frappe.defaults.get_default("letter_head")] %}
|
||||
</div>
|
||||
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
||||
<h4 class="text-center">{%= filters.item %} </h4>
|
||||
|
||||
<hr>
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for(var i=0, l=report.columns.length; i<l; i++) { %}
|
||||
<th style="width: 15%">{%= report.columns[i].label %}</th>
|
||||
{% } %}
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
{% for(var i=0, l=data.length; i<l; i++) { %}
|
||||
<tr>
|
||||
|
||||
{% for(var j=0,m=report.columns.length; j<m; j++) { %}
|
||||
<td style="width: 15%">{%= data[i][report.columns[j].field] %}</td>
|
||||
{% } %}
|
||||
|
||||
</tr>
|
||||
{% } %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h4 class="text-center"> Analysis Chart </h4>
|
||||
<div id="chart_div"></div>
|
||||
|
||||
|
||||
|
||||
<p class="text-right text-muted">Printed On {%= dateutil.str_to_user(dateutil.get_datetime_as_string()) %}</p>
|
||||
@@ -11,5 +11,72 @@ frappe.query_reports["Quoted Item Comparison"] = {
|
||||
"default": ""
|
||||
|
||||
}
|
||||
]
|
||||
],
|
||||
onload: function(report) {
|
||||
//Create a button for setting the default supplier
|
||||
report.page.add_inner_button(__("Select Default Supplier"), function() {
|
||||
|
||||
var reporter = frappe.query_reports["Quoted Item Comparison"];
|
||||
|
||||
//Always make a new one so that the latest values get updated
|
||||
reporter.make_default_supplier_dialog(report);
|
||||
report.dialog.show();
|
||||
setTimeout(function() { report.dialog.input.focus(); }, 1000);
|
||||
|
||||
}, 'Tools');
|
||||
|
||||
},
|
||||
"make_default_supplier_dialog": function (report) {
|
||||
//Get the name of the item to change
|
||||
var filters = report.get_values();
|
||||
var item_code = filters.item;
|
||||
|
||||
//Get a list of the suppliers (with a blank as well) for the user to select
|
||||
var select_options = "";
|
||||
for (let supplier of report.data)
|
||||
{
|
||||
select_options += supplier.supplier_name+ '\n'
|
||||
}
|
||||
|
||||
//Create a dialog window for the user to pick their supplier
|
||||
var d = new frappe.ui.Dialog({
|
||||
title: __('Select Default Supplier'),
|
||||
fields: [
|
||||
{fieldname: 'supplier', fieldtype:'Select', label:'Supplier', reqd:1,options:select_options},
|
||||
{fieldname: 'ok_button', fieldtype:'Button', label:'Set Default Supplier'},
|
||||
]
|
||||
});
|
||||
|
||||
//On the user clicking the ok button
|
||||
d.fields_dict.ok_button.input.onclick = function() {
|
||||
var btn = d.fields_dict.ok_button.input;
|
||||
var v = report.dialog.get_values();
|
||||
if(v) {
|
||||
$(btn).set_working();
|
||||
|
||||
//Set the default_supplier field of the appropriate Item to the selected supplier
|
||||
frappe.call({
|
||||
method: "frappe.client.set_value",
|
||||
args: {
|
||||
doctype: "Item",
|
||||
name: item_code,
|
||||
fieldname: "default_supplier",
|
||||
value: v.supplier,
|
||||
},
|
||||
callback: function (r){
|
||||
$(btn).done_working();
|
||||
msgprint("Successfully Set Supplier");
|
||||
report.dialog.hide();
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
report.dialog = d;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from erpnext.setup.utils import get_exchange_rate
|
||||
|
||||
import frappe
|
||||
|
||||
def execute(filters=None):
|
||||
@@ -22,6 +24,7 @@ def get_quote_list(item, qty_list):
|
||||
if item:
|
||||
price_data = []
|
||||
suppliers = []
|
||||
company_currency = frappe.db.get_default("currency")
|
||||
# Get the list of suppliers
|
||||
for root in frappe.db.sql("""select parent, qty, rate from `tabSupplier Quotation Item` where item_code=%s and docstatus < 2""", item, as_dict=1):
|
||||
for splr in frappe.db.sql("""SELECT supplier from `tabSupplier Quotation` where name =%s and docstatus < 2""", root.parent, as_dict=1):
|
||||
@@ -35,6 +38,9 @@ def get_quote_list(item, qty_list):
|
||||
|
||||
#Add a row for each supplier
|
||||
for root in set(suppliers):
|
||||
supplier_currency = frappe.db.get_value("Supplier",root,"default_currency")
|
||||
exg = get_exchange_rate(supplier_currency,company_currency)
|
||||
|
||||
row = frappe._dict({
|
||||
"supplier_name": root
|
||||
})
|
||||
@@ -42,7 +48,7 @@ def get_quote_list(item, qty_list):
|
||||
# Get the quantity for this row
|
||||
for item_price in price_data:
|
||||
if str(item_price.qty) == col.key and item_price.supplier == root:
|
||||
row[col.key] = item_price.rate
|
||||
row[col.key] = item_price.rate * exg
|
||||
row[col.key + "QUOTE"] = item_price.parent
|
||||
break
|
||||
else:
|
||||
|
||||
58
erpnext/change_log/v7/v7_0_0.md
Normal file
@@ -0,0 +1,58 @@
|
||||
#### New POS
|
||||
- Offline
|
||||
- Multiple Payment Modes
|
||||
- Standard documents cannot be edited in POS view
|
||||
|
||||
#### Payment Entry
|
||||
- Dedicated form for managing Payments
|
||||
- Designed for normal users who do not have accounting background
|
||||
|
||||
#### Request for Quotation
|
||||
- Updated workflow: Material Request -> **Request for Quotation** -> Supplier Quotation -> Purchase Order
|
||||
|
||||
#### Fixed Asset Management
|
||||
- Manage fixed asset records and their depreciation
|
||||
|
||||
#### Improved Navigation
|
||||
- Heatmaps
|
||||
- Centralized navigation from Masters like Item, Customer, Supplier, Employee etc.
|
||||
|
||||
#### Timesheets
|
||||
- New grid
|
||||
- Multiple time logs in one timesheets
|
||||
- Linked to Payroll and Billing
|
||||
|
||||
#### Graphs in Reports
|
||||
- Added graphs in some important reports like Balance Sheet, Accounts Receivable etc.
|
||||
|
||||
#### Sub-warehouse
|
||||
- Tree view for Warehouse
|
||||
|
||||
#### New Portal Design
|
||||
- New Homepage Design
|
||||
- Sidebar in Portal View
|
||||
- New Cart View
|
||||
|
||||
#### Collaborative Project Management
|
||||
- Web View
|
||||
- Customers/Suppliers can add/edit issues and view timesheets
|
||||
|
||||
#### Budget
|
||||
- Dedicated budget form
|
||||
- Budget can be assigned against Cost Center Group
|
||||
|
||||
#### Check Printing Format
|
||||
- Ability to customize Cheque Printing Format for any bank
|
||||
|
||||
#### Schools application is now part of ERPNext
|
||||
|
||||
#### Minor
|
||||
|
||||
- Selling Price calculation based on Margin defined in the Pricing Rule
|
||||
- Document flow-chart on Sales / Purchase Transactions
|
||||
- Domain specific desktop views
|
||||
- Add opening Stock and Rate while creating a new Item
|
||||
- Book payments and update stock directly from Purchase Invoice
|
||||
- List view for Products on Website
|
||||
- Features Setup is deprecated, settings moved to individual module setup views
|
||||
- Added Safety Stock to Item Master
|
||||
@@ -204,10 +204,10 @@ class StockController(AccountsController):
|
||||
from erpnext.stock.stock_ledger import make_sl_entries
|
||||
make_sl_entries(sl_entries, is_amended, allow_negative_stock, via_landed_cost_voucher)
|
||||
|
||||
def make_gl_entries_on_cancel(self):
|
||||
def make_gl_entries_on_cancel(self, repost_future_gle=True):
|
||||
if frappe.db.sql("""select name from `tabGL Entry` where voucher_type=%s
|
||||
and voucher_no=%s""", (self.doctype, self.name)):
|
||||
self.make_gl_entries()
|
||||
self.make_gl_entries(repost_future_gle)
|
||||
|
||||
def get_serialized_items(self):
|
||||
serialized_items = []
|
||||
@@ -261,7 +261,7 @@ def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for
|
||||
|
||||
future_stock_vouchers = get_future_stock_vouchers(posting_date, posting_time, for_warehouses, for_items)
|
||||
gle = get_voucherwise_gl_entries(future_stock_vouchers, posting_date)
|
||||
|
||||
|
||||
for voucher_type, voucher_no in future_stock_vouchers:
|
||||
existing_gle = gle.get((voucher_type, voucher_no), [])
|
||||
voucher_obj = frappe.get_doc(voucher_type, voucher_no)
|
||||
|
||||
@@ -440,6 +440,7 @@ class calculate_taxes_and_totals(object):
|
||||
paid_amount = self.doc.paid_amount \
|
||||
if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount
|
||||
|
||||
self.calculate_write_off_amount()
|
||||
self.calculate_change_amount()
|
||||
|
||||
self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) +
|
||||
@@ -468,6 +469,13 @@ class calculate_taxes_and_totals(object):
|
||||
self.doc.base_change_amount = flt(self.doc.change_amount * self.doc.conversion_rate,
|
||||
self.doc.precision("base_change_amount"))
|
||||
|
||||
def calculate_write_off_amount(self):
|
||||
if flt(self.doc.change_amount) > 0:
|
||||
self.doc.write_off_amount = flt(self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount,
|
||||
self.doc.precision("write_off_amount"))
|
||||
self.doc.base_write_off_amount = flt(self.doc.write_off_amount * self.doc.conversion_rate,
|
||||
self.doc.precision("base_write_off_amount"))
|
||||
|
||||
def calculate_margin(self, item):
|
||||
total_margin = 0.0
|
||||
if item.price_list_rate:
|
||||
|
||||
@@ -51,7 +51,8 @@ erpnext.crm.Opportunity = frappe.ui.form.Controller.extend({
|
||||
|
||||
this.frm.set_query("item_code", "items", function() {
|
||||
return {
|
||||
query: "erpnext.controllers.queries.item_query"
|
||||
query: "erpnext.controllers.queries.item_query",
|
||||
filters: {'is_sales_item': 1}
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
BIN
erpnext/docs/assets/img/accounts/perpetual-2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
erpnext/docs/assets/img/accounts/perpetual-3.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 85 KiB |
BIN
erpnext/docs/assets/img/articles/freeze-account-1.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
erpnext/docs/assets/img/articles/freeze-account-2.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 86 KiB |
BIN
erpnext/docs/assets/img/articles/post-dated-1.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
0
erpnext/docs/assets/img/schools/fees/__init__.py
Normal file
BIN
erpnext/docs/assets/img/schools/fees/fee-category.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
erpnext/docs/assets/img/schools/fees/fee-structure.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
erpnext/docs/assets/img/schools/fees/fees-section.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
erpnext/docs/assets/img/schools/fees/fees.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
erpnext/docs/assets/img/schools/home.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 76 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/course-schedule-att.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/course-schedule.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/examination.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/schedule-section.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/scheduling-tool.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
erpnext/docs/assets/img/schools/schedule/student-attendance.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
0
erpnext/docs/assets/img/schools/setup/__init__.py
Normal file
BIN
erpnext/docs/assets/img/schools/setup/academic-term.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
erpnext/docs/assets/img/schools/setup/academic-year.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
erpnext/docs/assets/img/schools/setup/course.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
erpnext/docs/assets/img/schools/setup/instructor.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
erpnext/docs/assets/img/schools/setup/program.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
erpnext/docs/assets/img/schools/setup/room.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
erpnext/docs/assets/img/schools/setup/setup-section.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
0
erpnext/docs/assets/img/schools/student/__init__.py
Normal file
BIN
erpnext/docs/assets/img/schools/student/program-enrollment.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 72 KiB |
BIN
erpnext/docs/assets/img/schools/student/student-applicant.png
Normal file
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 87 KiB |
BIN
erpnext/docs/assets/img/schools/student/student-group.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
erpnext/docs/assets/img/schools/student/student-section.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
erpnext/docs/assets/img/schools/student/student.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
erpnext/docs/assets/img/setup-wizard/step-1.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-1.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-3.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-open-1.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-open-2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
erpnext/docs/assets/img/setup/dropbox-open-3.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 566 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 231 KiB |
|
Before Width: | Height: | Size: 242 KiB |
@@ -1,36 +0,0 @@
|
||||
#Cheque Print
|
||||
|
||||
** Whats is Cheque Print? **
|
||||
|
||||
You can choose to print Cheques at the time of making payments to Creditors/ parties during Voucher Entry i.e., directly from the Payment Vouchers and Inter-bank payment or transfers through Contra Vouchers.
|
||||
|
||||
###Setup Cheque Print
|
||||
|
||||
To enable cheque printing,
|
||||
|
||||
1. Create cheque settings under `Accounts > Cheque Print Template`.
|
||||
|
||||

|
||||
|
||||
You can see a preview of cheque print by attaching scanned copy of cheque to avoid miss printing.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
2. After saving cheque print settings, you can Create / Update print format for settings.
|
||||
|
||||
To create print format, click on `Create Print Format`.
|
||||
|
||||

|
||||
|
||||
If you have already created a Print Format, you can update it by clicking on `Update Print Format`.
|
||||
|
||||
3. You will see newly created / updated print format under Journal Entry.
|
||||
|
||||

|
||||
|
||||
|
||||
###Cheque Print
|
||||
|
||||

|
||||
@@ -1,41 +0,0 @@
|
||||
#Depreciation for Fixed Asset Items
|
||||
|
||||
Depreciation is when you write off certain value of your assets as an expense. For example, office computer will be used for five years. Hence total value of computer should be booked as expense over the period of five years.
|
||||
|
||||
As per perpetual inventory valuation system (set by default), you should create Stock Reconciliation for depreciating value of fixed asset items. Check below steps to learn more.
|
||||
|
||||
#### Step 1: Depreciation Account
|
||||
|
||||
Depreciation account is auto-created, under Indirect Expenses account.
|
||||
|
||||
<img alt="Project Default Cost Center" class="screenshot" src="{{docs_base_url}}/assets/img/articles/depreciation-1.png">
|
||||
|
||||
#### Step 2: Stock Reconciliation
|
||||
|
||||
To create new Stock Reconciliation, go to:
|
||||
|
||||
`Stock > Setup > Stock Reconciliation > New`
|
||||
|
||||
Set Posting Date and Time of Stock Reconciliation will when you wish depreciation entry to be posted in your accounts.
|
||||
|
||||
#### Step 3: Item
|
||||
|
||||
Select Fixed Asset Items in the item table. Update Warehouse of an item. For item valuation, update post-depreciation value. For example, item value was 100. Depreciation amount is 20. As per this post-depreciation valuation of an item will be 80. Hence 80 should be posted as valuation in the Stock Reconciliation.
|
||||
|
||||
<img alt="Project Default Cost Center" class="screenshot" src="{{docs_base_url}}/assets/img/articles/depreciation-2.png">
|
||||
|
||||
#### Step 4: Depreciation Account
|
||||
|
||||
Select Depereciation Account in which depereciation amount will be booked.
|
||||
|
||||
<img alt="Project Default Cost Center" class="screenshot" src="{{docs_base_url}}/assets/img/articles/depreciation-3.png">
|
||||
|
||||
#### Step 5: Submit
|
||||
|
||||
On submission of Stock Reconciliation, depreciation will booked for items asset items.
|
||||
|
||||
<img alt="Project Default Cost Center" class="screenshot" src="{{docs_base_url}}/assets/img/articles/depreciation-4.png">
|
||||
|
||||
Click [here]({{docs_base_url}}/user/manual/en/setting-up/stock-reconciliation-for-non-serialized-item.html) for steps to be followed when making Stock Reconciliation entry.
|
||||
|
||||
<!-- markdown -->
|
||||
@@ -1,28 +1,36 @@
|
||||
#How To Freeze Accounting Ledger?
|
||||
|
||||
You can freeze any accounting ledger in ERPNext. So that frozen accounting ledger became unsearchable in accounting transaction. Follow below step to understand the process.
|
||||
If you want to discontinue using specific Account, you can freeze it.
|
||||
|
||||
#### 1. Set Frozen Accounts Modifier
|
||||
>Account can be Frozen by the User having specific Role. This Role for set in the Account Settings, in the field "Role Allowed to Set Frozen Accounts & Edit Frozen Entries".
|
||||
|
||||
To set frozen accounts modifier go to `Accounts > Setup > Accounts Setting`
|
||||
Please check following steps to freeze an Account from the Chart of Accounts master.
|
||||
|
||||
Search and select Role under Frozen Accounts Modifier field and save the Account Settings form.
|
||||
|
||||

|
||||
####Step 1: Chart of Accounts
|
||||
|
||||
#### 2. Edit Accounting Ledger.
|
||||
To edit an Account, go to Chart of Accounts:
|
||||
|
||||
To edit accounting ledger go to `Accounts > Setup > Chart of Accounts`
|
||||
`Explore > Accounts > Chart of Accounts`
|
||||
|
||||

|
||||
<img class="screenshot" alt="Freeze Account" src="{{docs_base_url}}/assets/img/articles/freeze-account-1.png">
|
||||
|
||||
#### 3. Set Frozen Status of Ledger.
|
||||
Click on Account in which Frozen Date is to be updated.
|
||||
|
||||

|
||||
####Step 2: Set Account as Frozen
|
||||
|
||||
In the Account form, you will find a field called **Frozen**. Set value in this field as 'Yes'
|
||||
|
||||
<img class="screenshot" alt="Freeze Account" src="{{docs_base_url}}/assets/img/articles/freeze-account-2.png">
|
||||
|
||||
####Step 3: Save
|
||||
|
||||
After update Save an Account.
|
||||
|
||||
On saving, this Account will be frozen and will not be selectable in any accounting transaction.
|
||||
|
||||
<div class ="well"> Note: In future, if you want to make an accounting transaction against this Account, then you can unfreeze this account by setting values in the Frozen field as 'No'.</div>
|
||||
|
||||
Set Frozen field status of ledger as 'Yes' and save the ledger form. On save this ledger will be frozen and you will became unable to search this ledger in accounting transactions.
|
||||
|
||||
<div class ="well"> Note: If you want to make accounting transaction against this ledger in the future, then that time again set frozen field status as 'No'.</div>
|
||||
|
||||
|
||||
<!-- markdown -->
|
||||
@@ -1,7 +1,5 @@
|
||||
tracking-project-profitability-using-cost-center
|
||||
c-form
|
||||
changing-parent-account
|
||||
depreciation-for-fixed-asset-items
|
||||
difference-entry-button
|
||||
fiscal-year-error
|
||||
freeze-accounting-entries
|
||||
@@ -13,4 +11,4 @@ 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
|
||||
cheque-print
|
||||
c-form
|
||||
@@ -1,32 +1,32 @@
|
||||
#Post Dated Cheque Entry
|
||||
|
||||
Post Dated Cheque is a cheque dated on future date. Party generally give post dated cheque, as advance payment. This cheque would be cleared only after cheque date has arrived.
|
||||
Post Dated Cheque is a cheque dated on future date. Party generally give post dated cheque, as advance payment. This cheque would be cleared only when cheque date arrives.
|
||||
|
||||
In ERPNext, create Journal Entries for post dated cheque.
|
||||
In ERPNext, create Payment Entry for post dated cheque.
|
||||
|
||||
####New Journal Entry
|
||||
####New Payment Entry
|
||||
|
||||
To open new journal voucher go to
|
||||
|
||||
`Accounts > Documents > Journal Entry > New`
|
||||
`Explore > Accounts > Payment Entry > New`
|
||||
|
||||
#### Set Posting Date
|
||||
|
||||
Assuming your Cheque Date is 31st December, 2016 (or any future date). As a result, this posting in your bank ledger will appear on Posting Date updated.
|
||||
|
||||
<img alt="JE Posting Date" class="screenshot" src="{{docs_base_url}}/assets/img/articles/post-dated-1.gif">
|
||||
<img alt="JE Posting Date" class="screenshot" src="{{docs_base_url}}/assets/img/articles/post-dated-1.png">
|
||||
|
||||
Note: Journal Voucher Reference Date should equal to or less than Posting Date.
|
||||
Note: Payment Entry Reference Date should equal to or less than Posting Date.
|
||||
|
||||
####Step 3: Save and Submit
|
||||
|
||||
After entering required details, Save and Submit the Journal Entry.
|
||||
After entering required details, Save and Submit the Payment Entry.
|
||||
|
||||
####Adjusting Post Dated Cheque Entry
|
||||
|
||||
If Post Dated Journal Entry needs to be adjusted against any invoice, it can be accomplished via [Payment Reconciliation Tool]({{docs_base_url}}/user/manual/en/accounts/tools/payment-reconciliation.html).
|
||||
You can adjust Post Dated Payment Entry against an invoice via [Payment Reconciliation Tool]({{docs_base_url}}/user/manual/en/accounts/tools/payment-reconciliation.html).
|
||||
|
||||
When cheque is cleared, i.e. on actual date on the cheque, you can update its Clearance Date via [Bank Reconciliation Tool]({{docs_base_url}}/user/manual/en/accounts/tools/bank-reconciliation.html).
|
||||
|
||||
You might find value of this Journal Entry already reflecting against bank's ledger. You should check **Bank Reconciliation Statement**, a report in the account module to know difference of bank balance as per system, and actual balance in a account.
|
||||
In the Chart of Accounts, you might find value of this Payment Entry already reflecting against bank Account. You should check **Bank Reconciliation Statement**, a report in the account module to know difference of bank balance as per system, and actual balance in the bank's statement.
|
||||
<!-- markdown -->
|
||||
0
erpnext/docs/user/manual/en/schools/__init__.py
Normal file
7
erpnext/docs/user/manual/en/schools/fees/fee-category.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Fee Category
|
||||
|
||||
List of all different type of fees collected.
|
||||
|
||||
<img class="screenshot" alt="Fees Category" src="{{url_prefix}}/assets/img/schools/fees/fee-category.png">
|
||||
|
||||
{next}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Fee Structure
|
||||
|
||||
A Fee Structure is a template that can be used while making fee records.
|
||||
|
||||
<img class="screenshot" alt="Fees Structure" src="{{url_prefix}}/assets/img/schools/fees/fee-structure.png">
|
||||
|
||||
{next}
|
||||
8
erpnext/docs/user/manual/en/schools/fees/fees.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Fees
|
||||
|
||||
Maintain a record of fees collected from students.
|
||||
The [Fee Structure]({{docs_base_url}}/user/manual/en/schools/fees/fee-structure.html) is fetched based on the selected Program and Academic Term.
|
||||
|
||||
<img class="screenshot" alt="Fees" src="{{url_prefix}}/assets/img/schools/fees/fees.png">
|
||||
|
||||
{next}
|
||||
9
erpnext/docs/user/manual/en/schools/fees/index.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Fees
|
||||
|
||||
This section contains 'Fee' related documents.
|
||||
|
||||
<img class="screenshot" alt="Fees Section" src="{{url_prefix}}/assets/img/schools/fees/fees-section.png">
|
||||
|
||||
### Topics
|
||||
|
||||
{index}
|
||||
3
erpnext/docs/user/manual/en/schools/fees/index.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
fees
|
||||
fee-structure
|
||||
fee-category
|
||||