Compare commits

...

73 Commits

Author SHA1 Message Date
Nabin Hait
660f3ed0d6 Merge branch 'develop' 2016-08-08 15:50:00 +05:30
Nabin Hait
d5c83122f2 bumped to version 7.0.21 2016-08-08 16:20:00 +06:00
Nabin Hait
2777f23ace Merge pull request #6019 from nabinhait/pcv_test_case
Fixed test cases for period closing voucher
2016-08-08 15:45:19 +05:30
Nabin Hait
ae65172dca Added 'Ledger' button to show accounting entries against PCV 2016-08-08 15:44:45 +05:30
Nabin Hait
d261d40c7e Fixed test cases for period closing voucher 2016-08-08 15:44:45 +05:30
Nabin Hait
4b231c2692 Merge pull request #6018 from rohitwaghchaure/add_calendar_to_timesheets
Added a Calendar view for timesheet logs
2016-08-08 14:46:18 +05:30
Nabin Hait
7e27e32e92 Merge pull request #6017 from nabinhait/repost_future_stock_transactions
Repost gle for future transactions if update stock checked in back dated purchase invoice
2016-08-08 14:45:17 +05:30
Ben Cornwell-Mott
ed1b8cfe3f Added a Calendar view for timesheet logs 2016-08-08 14:17:06 +05:30
Nabin Hait
99d4ff4a29 Repost gle for future transactions if update stock checked in back dated purchase invoice 2016-08-08 14:12:58 +05:30
Nabin Hait
595dbd6dea Merge pull request #5963 from neilLasrado/assessment
Assessment Groups
2016-08-08 12:50:10 +05:30
Nabin Hait
f979b18ddb Merge pull request #6003 from neilLasrado/bug-fix
[bug fix] Fixed bug in fee caclulation, renamed functions
2016-08-08 12:44:27 +05:30
Nabin Hait
3ef6e7847e Merge pull request #6010 from rohitwaghchaure/minor_fix_pos
[Fix] pos ambiguous issue
2016-08-08 12:40:28 +05:30
Nabin Hait
2dba3b5e25 Merge pull request #6012 from bohlian/develop
[Enhancement + Fix] Disable buttons when Production Order is Stopped, Fixed Stopping and Re-Opening of Production Order
2016-08-08 12:40:00 +05:30
Nabin Hait
2cb8c6a867 Merge pull request #6015 from nabinhait/ar_ap_cols
[fix] Label for ageing cols in AR/AP report
2016-08-08 12:37:19 +05:30
Nabin Hait
be3aee973c Merge pull request #6011 from saurabh6790/get_acount_balance_fix
[minor][fix] return if account details not found
2016-08-08 12:36:40 +05:30
Nabin Hait
c30c342bdf [fix] Label for ageing cols in AR/AP report 2016-08-08 11:47:13 +05:30
Neil Trini Lasrado
f02a0d4d24 [bug fix] Fixed bug in fee caclulation, renamed functions 2016-08-08 11:09:29 +05:30
Rohit Waghchaure
cd6c00d505 [Fix] pos ambiguous issue 2016-08-07 14:29:21 +05:30
Javier Wong
e6cd228288 [Enhancement + Fix] Disable buttons when Production Order is Stopped, Fixed Stopping and Re-Opening of Production Order
Disabled the following buttons:
- Make Timesheet
- Start
- Finish `

- A better fix than 316f78f859
- Sets the Status to In Process or Not Started instead of Unstopped
- Displays this same status on the client prompt (msgprint)
2016-08-07 16:01:49 +08:00
Saurabh
ec14c81ebd [minor][fix] return if account details not found 2016-08-07 08:52:45 +05:30
Nabin Hait
8793b823af Merge branch 'develop' 2016-08-06 14:15:34 +05:30
Nabin Hait
537301a210 bumped to version 7.0.20 2016-08-06 14:45:34 +06:00
Nabin Hait
f1d8fc3d51 Merge pull request #6008 from KanchanChauhan/leave-application-validation
Leave Application Validation for processed salary
2016-08-06 14:13:46 +05:30
Nabin Hait
20b4666e89 Merge pull request #5958 from rohitwaghchaure/minor_fixes_and_cleanups
fixes and cleanups.
2016-08-06 14:11:24 +05:30
Rushabh Mehta
84969bdb2d Merge pull request #6007 from KanchanChauhan/task-json-fixed
[Minor] Removed hard coded success URL from task webform
2016-08-06 13:42:50 +05:30
Kanchan Chauhan
705384d8fe Leave Application Validation for processed salary 2016-08-06 13:42:18 +05:30
Rushabh Mehta
2123e02eda Merge pull request #6005 from revant/patch-2
[fix] success_url Issue #6004
2016-08-06 13:40:02 +05:30
Rohit Waghchaure
b77a1057ce fixes and cleanups. 2016-08-06 12:45:02 +05:30
Kanchan Chauhan
93b1f2ad72 [Minor] Removed hard coded success URL 2016-08-06 12:09:08 +05:30
Revant Nandgaonkar
9a433ffca1 [fix] success_url Issue #6004 2016-08-05 21:44:34 +05:30
Nabin Hait
c1162796c5 Merge branch 'develop' 2016-08-05 16:45:14 +05:30
Nabin Hait
82446bf83e bumped to version 7.0.19 2016-08-05 17:15:14 +06:00
Nabin Hait
c72f8976aa Merge pull request #5989 from umairsy/2aug
updated docs
2016-08-05 15:50:34 +05:30
Nabin Hait
c49a3425ef Merge pull request #6002 from nabinhait/pe_fix_101
Payment Entry fix: Unallocated amount in payment entry considering deductions
2016-08-05 15:44:44 +05:30
Neil Trini Lasrado
50b2278eda Renamed fields in Examination Doctype, Renamed examination doctype to Assessment, Added Assessment Group, added patch 2016-08-05 15:09:49 +05:30
Nabin Hait
e1d85f2467 Payment Entry fix: Unallocated amount in payment entry considering deductions 2016-08-05 14:51:36 +05:30
Umair Sayyed
3962cded76 updated docs 2016-08-04 19:01:02 +05:30
Umair Sayyed
66360f694e updated docs 2016-08-04 19:01:02 +05:30
Umair Sayyed
5dba950afa docs update 2016-08-04 19:01:02 +05:30
Umair Sayyed
6a3f51bee2 updated docs 2016-08-04 19:01:02 +05:30
Rushabh Mehta
efe1ab742f [minor] fixes for demo 2016-08-04 17:29:46 +05:30
Rushabh Mehta
4d32d5301a Merge pull request #5996 from KanchanChauhan/users-selection-for-project
'Project Users' role not required to add user to the project
2016-08-04 14:25:52 +05:30
Kanchan Chauhan
58bc00f954 Project Users role not required to add user to the project 2016-08-04 14:21:20 +05:30
Nabin Hait
155074479b Merge pull request #5986 from nabinhait/pe_fix_101
Set received amount based on paid amount if currency is same
2016-08-03 17:54:01 +05:30
Nabin Hait
fa1775b6a6 Merge pull request #5988 from nabinhait/item_route
default material request type field restored in item
2016-08-03 17:53:11 +05:30
Nabin Hait
764e6ef210 default material request type field restored in item 2016-08-03 17:32:26 +05:30
Rushabh Mehta
f2d89987f5 [minor] ignore email validation if comes from email; 2016-08-03 16:42:29 +05:30
Rushabh Mehta
06c92a782a [fix] small text for route 2016-08-03 16:27:11 +05:30
Nabin Hait
f43e49f378 Set received amount based on paid amount if currency is same 2016-08-03 14:17:05 +05:30
Rushabh Mehta
ea5ad84c5e [minor] fix image for demo 2016-08-02 21:26:04 +05:30
Nabin Hait
46f328cbda Merge branch 'develop' 2016-08-02 18:07:53 +05:30
Nabin Hait
1b9a01b6c3 bumped to version 7.0.18 2016-08-02 18:37:52 +06:00
Nabin Hait
e8ab7b8898 Merge pull request #5976 from nabinhait/patch_fix_109
[patch] Set default material request type in Item based on default bom
2016-08-02 18:05:03 +05:30
Nabin Hait
ae921ce2c8 [patch] Set default material request type in Item based on default bom 2016-08-02 18:02:31 +05:30
Nabin Hait
b77ad7c31d Merge branch 'develop' 2016-08-02 17:16:46 +05:30
Nabin Hait
cc13a9f2f6 bumped to version 7.0.17 2016-08-02 17:46:46 +06:00
Nabin Hait
97c74f9f8f Merge pull request #5925 from rohitwaghchaure/bcornwellmott-1
PPT looks at default MR type in Item to set MR type.
2016-08-02 17:15:02 +05:30
Nabin Hait
e1e6468b33 Merge pull request #5974 from nabinhait/pos_change_amount
Change amount calcualtion in POS if there is write off amount and gl entries in this scenario
2016-08-02 17:14:50 +05:30
Nabin Hait
6620e2a494 Test case fixed for pos gl entry 2016-08-02 17:14:28 +05:30
Rohit Waghchaure
08aadb853c PPT looks at default MR type in Item to set MR type. 2016-08-02 16:59:03 +05:30
Nabin Hait
3bb1a421f0 Change amount calcualtion in POS if there is write off amount and gl entries in this scenario 2016-08-02 16:41:15 +05:30
Nabin Hait
afc0bbc8ff Merge pull request #5964 from frappe/neilLasrado-patch-1-1
Fixes for patch - make_guardian.py
2016-08-02 11:30:45 +05:30
Nabin Hait
8869430a81 Merge pull request #5967 from rohitwaghchaure/minor_fix
minor fix in payment entry
2016-08-02 11:29:48 +05:30
Rohit Waghchaure
7f031d1bfd minor fix in payment entry 2016-08-02 11:07:40 +05:30
Rushabh Mehta
5b1ebc5c54 Merge pull request #5933 from shreyasp/erpnext/update-travis
[Minor] Updated the travis.yml to use latest bench installer for erpnext
2016-08-02 10:44:39 +05:30
Neil Trini Lasrado
5bb2f56b47 Update make_guardian.py 2016-08-02 00:01:00 +05:30
Nabin Hait
1e3e6865ce Merge branch 'develop' 2016-08-01 18:07:21 +05:30
Nabin Hait
94542e104c bumped to version 7.0.16 2016-08-01 18:37:20 +06:00
Nabin Hait
90bf69aa52 Merge pull request #5957 from nabinhait/guardian_patch_fix
[patch] reload guardian interest
2016-08-01 18:05:33 +05:30
Nabin Hait
3b8109780f [patch] reload guardian interest 2016-08-01 17:59:46 +05:30
Nabin Hait
f863055b91 Merge pull request #5955 from umairsy/28jul
added documentation for the new features
2016-08-01 17:53:26 +05:30
Umair Sayyed
e96b3ce725 added documentation for the new features 2016-08-01 17:42:30 +05:30
shreyas
60e9f84c8a [Minor] Updated the travis.yml to use new installer for erpnext 2016-08-01 17:40:20 +05:30
164 changed files with 905 additions and 455 deletions

View File

@@ -1,4 +1,5 @@
language: python
dist: trusty
python:
- "2.7"
@@ -11,10 +12,14 @@ before_install:
- "sh -e /etc/init.d/xvfb start"
install:
- sudo apt-get purge -y mysql-common
- wget https://raw.githubusercontent.com/frappe/bench/master/install_scripts/setup_frappe.sh
- sudo bash setup_frappe.sh --skip-setup-bench --mysql-root-password travis --bench-branch develop
- sudo pip install --upgrade pip
- sudo apt-get purge -y mysql-common mysql-server mysql-client
# - wget https://raw.githubusercontent.com/frappe/bench/master/install_scripts/setup_frappe.sh
# - sudo bash setup_frappe.sh --skip-setup-bench --mysql-root-password travis --bench-branch develop
- wget https://raw.githubusercontent.com/frappe/bench/master/playbooks/install.py
- sudo python install.py --develop --user travis --without-bench-setup
- sudo pip install -e ~/bench
# - sudo pip install --upgrade pip
- rm $TRAVIS_BUILD_DIR/.git/shallow
- bash $TRAVIS_BUILD_DIR/travis/bench_init.sh
- cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/
@@ -30,7 +35,7 @@ script:
- bench --verbose run-tests --driver Firefox
before_script:
- mysql -e 'create database test_frappe'
- mysql -u root -ptravis -e 'create database test_frappe'
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root -ptravis
- echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root -ptravis

View File

@@ -2,7 +2,7 @@
from __future__ import unicode_literals
import frappe
__version__ = '7.0.15'
__version__ = '7.0.21'
def get_default_company(user=None):
'''Get default company for user'''

View File

@@ -772,6 +772,9 @@ def get_account_balance_and_party_type(account, date, company, debit=None, credi
company_currency = get_company_currency(company)
account_details = frappe.db.get_value("Account", account, ["account_type", "account_currency"], as_dict=1)
if not account_details:
return
if account_details.account_type == "Receivable":
party_type = "Customer"
elif account_details.account_type == "Payable":

View File

@@ -95,13 +95,13 @@ frappe.ui.form.on('Payment Entry', {
frm.doc.paid_to_account_currency != company_currency &&
frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency));
frm.toggle_display("base_paid_amount", frm.doc.paid_from_account_currency != company_currency);
frm.toggle_display("base_paid_amount", frm.doc.paid_from_account_currency != company_currency);
frm.toggle_display("base_received_amount", (frm.doc.paid_to_account_currency != company_currency &&
frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency));
frm.toggle_display("received_amount",
frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency)
frm.toggle_display("received_amount", (frm.doc.payment_type=="Internal Transfer" ||
frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency))
frm.toggle_display(["base_total_allocated_amount"],
(frm.doc.paid_amount && frm.doc.received_amount && frm.doc.base_total_allocated_amount &&
@@ -414,10 +414,7 @@ frappe.ui.form.on('Payment Entry', {
paid_amount: function(frm) {
frm.set_value("base_paid_amount", flt(frm.doc.paid_amount) * flt(frm.doc.source_exchange_rate));
frm.trigger("reset_received_amount");
frm.set_paid_amount_based_on_received_amount = false;
},
received_amount: function(frm) {
@@ -436,22 +433,19 @@ frappe.ui.form.on('Payment Entry', {
frm.events.allocate_party_amount_against_ref_docs(frm, frm.doc.received_amount);
else
frm.events.set_difference_amount(frm);
frm.set_paid_amount_based_on_received_amount = false;
},
reset_received_amount: function(frm) {
if(!frm.set_paid_amount_based_on_received_amount &&
(frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency)) {
// var total_deductions = frappe.utils.sum($.map(frm.doc.deductions || [],
// function(d) { return d.amount}));
//
// var received_amount = frm.doc.paid_amount +
// flt(total_deductions) / flt(frm.doc.source_exchange_rate);
//
frm.set_value("received_amount", frm.doc.paid_amount);
frm.set_value("target_exchange_rate", frm.doc.source_exchange_rate);
frm.set_value("base_received_amount", frm.doc.base_paid_amount);
}
if(frm.doc.payment_type == "Receive")
frm.events.allocate_party_amount_against_ref_docs(frm, frm.doc.paid_amount);
else
@@ -607,11 +601,18 @@ frappe.ui.form.on('Payment Entry', {
if(frm.doc.party) {
var party_amount = frm.doc.payment_type=="Receive" ?
frm.doc.paid_amount : frm.doc.received_amount;
var total_deductions = frappe.utils.sum($.map(frm.doc.deductions || [],
function(d) { return flt(d.amount) }));
if(frm.doc.total_allocated_amount < party_amount)
unallocated_amount = party_amount - frm.doc.total_allocated_amount;
if(frm.doc.total_allocated_amount < party_amount) {
if(frm.doc.payment_type == "Receive") {
unallocated_amount = party_amount - (frm.doc.total_allocated_amount - total_deductions);
} else {
unallocated_amount = party_amount - (frm.doc.total_allocated_amount + total_deductions);
}
}
}
frm.set_value("unallocated_amount", unallocated_amount);
var difference_amount = 0;

View File

@@ -247,8 +247,13 @@ class PaymentEntry(AccountsController):
if self.party:
party_amount = self.paid_amount if self.payment_type=="Receive" else self.received_amount
total_deductions = sum([flt(d.amount) for d in self.get("deductions")])
if self.total_allocated_amount < party_amount:
self.unallocated_amount = party_amount - self.total_allocated_amount
if self.payment_type == "Receive":
self.unallocated_amount = party_amount - (self.total_allocated_amount - total_deductions)
else:
self.unallocated_amount = party_amount - (self.total_allocated_amount + total_deductions)
def set_difference_amount(self):
base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate)
@@ -569,10 +574,9 @@ def get_company_defaults(company):
@frappe.whitelist()
def get_reference_details(reference_doctype, reference_name, party_account_currency):
total_amount = outstanding_amount = exchange_rate = None
ref_doc = frappe.get_doc(reference_doctype, reference_name)
if reference_doctype != "Journal Entry":
ref_doc = frappe.get_doc(reference_doctype, reference_name)
if party_account_currency == ref_doc.company_currency:
total_amount = ref_doc.base_grand_total
exchange_rate = 1

View File

@@ -1,21 +1,37 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
//========================== On Load =================================================
cur_frm.cscript.onload = function(doc, cdt, cdn) {
if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date());
}
// ***************** Get Account Head *****************
cur_frm.fields_dict['closing_account_head'].get_query = function(doc, cdt, cdn) {
return {
filters: [
['Account', 'company', '=', doc.company],
['Account', 'is_group', '=', '0'],
['Account', 'freeze_account', '=', 'No'],
['Account', 'root_type', 'in', 'Liability, Equity']
]
frappe.ui.form.on('Period Closing Voucher', {
onload: function(frm) {
if (!frm.doc.transaction_date) frm.doc.transaction_date = dateutil.obj_to_str(new Date());
},
setup: function(frm) {
frm.set_query("closing_account_head", function() {
return {
filters: [
['Account', 'company', '=', frm.doc.company],
['Account', 'is_group', '=', '0'],
['Account', 'freeze_account', '=', 'No'],
['Account', 'root_type', 'in', 'Liability, Equity']
]
}
});
},
refresh: function(frm) {
if(frm.doc.docstatus==1) {
frm.add_custom_button(__('Ledger'), function() {
frappe.route_options = {
"voucher_no": frm.doc.name,
"from_date": frm.doc.posting_date,
"to_date": frm.doc.posting_date,
"company": frm.doc.company,
group_by_voucher: 0
};
frappe.set_route("query-report", "General Ledger");
}, "icon-table");
}
}
}
})

View File

@@ -55,9 +55,8 @@ class TestPeriodClosingVoucher(unittest.TestCase):
if random_expense_account:
# Check posted value for teh above random_expense_account
gle_for_random_expense_account = frappe.db.sql("""
select debit - credit as amount,
debit_in_account_currency - credit_in_account_currency
as amount_in_account_currency
select sum(debit - credit) as amount,
sum(debit_in_account_currency - credit_in_account_currency) as amount_in_account_currency
from `tabGL Entry`
where voucher_type='Period Closing Voucher' and voucher_no=%s and account =%s""",
(pcv.name, random_expense_account[0].account), as_dict=True)

View File

@@ -8,6 +8,7 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"editable_grid": 0,
"fields": [
{
"allow_on_submit": 0,
@@ -832,7 +833,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-06-13 21:20:13.805101",
"modified": "2016-08-06 17:05:59.990031",
"modified_by": "Administrator",
"module": "Accounts",
"name": "POS Profile",
@@ -879,7 +880,7 @@
"write": 0
}
],
"quick_entry": 1,
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",

View File

@@ -301,7 +301,7 @@ class PurchaseInvoice(BuyingController):
asset.flags.ignore_validate_update_after_submit = True
asset.save()
def make_gl_entries(self, repost_future_gle=False):
def make_gl_entries(self, repost_future_gle=True):
self.auto_accounting_for_stock = \
cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))

View File

@@ -91,7 +91,7 @@ def update_multi_mode_option(doc, pos_profile):
def get_mode_of_payment(doc):
return frappe.db.sql(""" select mpa.default_account, mpa.parent, mp.type as type from `tabMode of Payment Account` mpa,
`tabMode of Payment` mp where mpa.parent = mp.name and company = %(company)s""", {'company': doc.company}, as_dict=1)
`tabMode of Payment` mp where mpa.parent = mp.name and mpa.company = %(company)s""", {'company': doc.company}, as_dict=1)
def update_tax_table(doc):
taxes = get_taxes_and_charges('Sales Taxes and Charges Template', doc.taxes_and_charges)
@@ -108,13 +108,14 @@ def get_items(doc, pos_profile):
item.price_list_rate = frappe.db.get_value('Item Price', {'item_code': item.name,
'price_list': doc.selling_price_list}, 'price_list_rate') or 0
item.default_warehouse = pos_profile.get('warehouse') or item.default_warehouse or None
item.default_warehouse = pos_profile.get('warehouse') or \
get_item_warehouse_for_company(doc.company, item.default_warehouse) or None
item.expense_account = pos_profile.get('expense_account') or item.expense_account
item.income_account = pos_profile.get('income_account') or item_doc.income_account
item.cost_center = pos_profile.get('cost_center') or item_doc.selling_cost_center
item.actual_qty = frappe.db.get_value('Bin', {'item_code': item.name,
'warehouse': item.default_warehouse}, 'actual_qty') or 0
item.serial_nos = get_serial_nos(item, pos_profile)
item.serial_nos = get_serial_nos(item, pos_profile, doc.company)
item.batch_nos = frappe.db.sql_list("""select name from `tabBatch` where ifnull(expiry_date, '4000-10-10') > curdate()
and item = %(item_code)s""", {'item_code': item.item_code})
@@ -122,13 +123,19 @@ def get_items(doc, pos_profile):
return item_list
def get_serial_nos(item, pos_profile):
def get_item_warehouse_for_company(company, warehouse):
if frappe.db.get_value('Warehouse', warehouse, 'company') != company:
warehouse = None
return warehouse
def get_serial_nos(item, pos_profile, company):
cond = "1=1"
if pos_profile.get('update_stock') and pos_profile.get('warehouse'):
cond = "warehouse = '{0}'".format(pos_profile.get('warehouse'))
serial_nos = frappe.db.sql("""select name, warehouse from `tabSerial No` where {0}
and item_code = %(item_code)s""".format(cond), {'item_code': item.item_code}, as_dict=1)
and item_code = %(item_code)s and company = %(company)s
""".format(cond), {'item_code': item.item_code, 'company': company}, as_dict=1)
serial_no_list = {}
for serial_no in serial_nos:
@@ -214,9 +221,9 @@ def submit_invoice(si_doc, name):
save_invoice(e, si_doc, name)
def save_invoice(e, si_doc, name):
si_doc.docstatus = 0
si_doc.name = ''
si_doc.save(ignore_permissions=True)
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
si_doc.flags.ignore_mandatory = True
si_doc.insert()
make_scheduler_log(e, si_doc.name)
def make_scheduler_log(e, sales_invoice):

View File

@@ -10,6 +10,7 @@
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 0,
"fields": [
{
"allow_on_submit": 0,
@@ -1135,7 +1136,7 @@
"no_copy": 0,
"permlevel": 0,
"precision": "2",
"print_hide": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
@@ -3676,7 +3677,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
"modified": "2016-07-07 13:40:27.977803",
"modified": "2016-08-03 11:50:49.680278",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",

View File

@@ -87,15 +87,6 @@ class SalesInvoice(SellingController):
def before_save(self):
set_account_for_mode_of_payment(self)
def update_change_amount(self):
self.base_paid_amount = 0.0
if self.paid_amount:
self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, self.precision("base_paid_amount"))
self.change_amount = self.base_change_amount = 0.0
if self.paid_amount > self.grand_total:
self.change_amount = flt(self.paid_amount - self.grand_total, self.precision("change_amount"))
self.base_change_amount = flt(self.change_amount * self.conversion_rate, self.precision("base_change_amount"))
def on_submit(self):
if not self.recurring_id:
frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
@@ -110,6 +101,7 @@ class SalesInvoice(SellingController):
self.update_status_updater_args()
self.update_prevdoc_status()
self.update_billing_status_in_dn()
self.clear_unallocated_mode_of_payments()
# Updating stock ledger should always be called after updating prevdoc status,
# because updating reserved qty in bin depends upon updated delivered qty in SO
@@ -296,6 +288,12 @@ class SalesInvoice(SellingController):
frappe.throw(_("Debit To account must be a Receivable account"))
self.party_account_currency = account.account_currency
def clear_unallocated_mode_of_payments(self):
self.set("payments", self.get("payments", {"amount": ["not in", [0, None, ""]]}))
frappe.db.sql("""delete from `tabSales Invoice Payment` where parent = %s
and amount = 0""", self.name)
def validate_with_previous_doc(self):
super(SalesInvoice, self).validate_with_previous_doc({
@@ -504,6 +502,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_write_off_gl_entry(gl_entries)
@@ -578,27 +577,24 @@ class SalesInvoice(SellingController):
def make_pos_gl_entries(self, gl_entries):
if cint(self.is_pos) and self.paid_amount:
# POS, make payment entries
gl_entries.append(
self.get_gl_dict({
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against": self.cash_bank_account,
"credit": flt(self.base_paid_amount - self.base_change_amount),
"credit_in_account_currency": flt(self.base_paid_amount - self.base_change_amount) \
if self.party_account_currency==self.company_currency else flt(self.paid_amount - self.change_amount),
"against_voucher": self.return_against if cint(self.is_return) else self.name,
"against_voucher_type": self.doctype,
}, self.party_account_currency)
)
cash_account = ''
for payment_mode in self.payments:
if payment_mode.type == 'Cash':
cash_account = payment_mode.account
if payment_mode.base_amount > 0:
# POS, make payment entries
gl_entries.append(
self.get_gl_dict({
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against": payment_mode.account,
"credit": payment_mode.base_amount,
"credit_in_account_currency": payment_mode.base_amount \
if self.party_account_currency==self.company_currency \
else payment_mode.amount,
"against_voucher": self.return_against if cint(self.is_return) else self.name,
"against_voucher_type": self.doctype,
}, self.party_account_currency)
)
payment_mode_account_currency = get_account_currency(payment_mode.account)
gl_entries.append(
self.get_gl_dict({
@@ -609,20 +605,44 @@ class SalesInvoice(SellingController):
if payment_mode_account_currency==self.company_currency else payment_mode.amount
}, payment_mode_account_currency)
)
if self.change_amount:
cash_account = cash_account or self.payments[0].account
cash_account_currency = get_account_currency(cash_account)
def make_gle_for_change(self, gl_entries):
if cint(self.is_pos) and self.change_amount:
cash_account = self.get_cash_account()
if cash_account:
gl_entries.append(
self.get_gl_dict({
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
"against": cash_account,
"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),
"against_voucher": self.return_against if cint(self.is_return) else self.name,
"against_voucher_type": self.doctype
}, self.party_account_currency)
)
gl_entries.append(
self.get_gl_dict({
"account": cash_account,
"against": self.customer,
"credit": self.base_change_amount,
"credit_in_account_currency": self.base_change_amount \
if payment_mode_account_currency==self.company_currency else self.change_amount
}, payment_mode_account_currency)
"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
def make_write_off_gl_entry(self, gl_entries):
# write off entries, applicable if only pos
if self.write_off_account and self.write_off_amount:

View File

@@ -503,7 +503,8 @@ class TestSalesInvoice(unittest.TestCase):
[pos["taxes"][1]["account_head"], 0.0, 50.0],
[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
[pos["items"][0]["expense_account"], abs(sle.stock_value_difference), 0.0],
[si.debit_to, 0.0, si.paid_amount],
[si.debit_to, 0.0, 300.0],
[si.debit_to, 0.0, cash_amount],
["_Test Bank - _TC", 300.0, 0.0],
["Cash - _TC", cash_amount, 0.0]
])

View File

@@ -177,6 +177,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
doc = JSON.parse(localStorage.getItem('doc'))
if(this.frm.doc.payments.length == 0){
this.frm.doc.payments = doc.payments;
this.calculate_outstanding_amount();
}
if(this.frm.doc.customer){
@@ -869,6 +870,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
for(key in data){
if(data[key].docstatus == 1 && index < 50){
index++
data[key].docstatus = 0;
return data
}
}

View File

@@ -52,10 +52,10 @@ class ReceivablePayableReport(object):
if not "range3" in self.filters:
self.filters["range3"] = "90"
for label in ("0-{range1}".format(**self.filters),
"{range1}-{range2}".format(**self.filters),
"{range2}-{range3}".format(**self.filters),
"{range3}-{above}".format(range3=self.filters.range3, above=_("Above"))):
for label in ("0-{range1}".format(range1=self.filters["range1"]),
"{range1}-{range2}".format(range1=self.filters["range1"]+1, range2=self.filters["range2"]),
"{range2}-{range3}".format(range2=self.filters["range2"]+1, range3=self.filters["range3"]),
"{range3}-{above}".format(range3=self.filters["range3"] + 1, above=_("Above"))):
columns.append({
"label": label,
"fieldtype": "Currency",

View File

@@ -30,7 +30,7 @@ frappe.ui.form.on("Request for Quotation",{
},
onload: function(frm) {
frm.add_fetch('standard_reply', 'response', 'response');
frm.add_fetch('standard_reply', 'response', 'message_for_supplier');
if(!frm.doc.message_for_supplier) {
frm.set_value("message_for_supplier", __("Please supply the specified items at the best possible rates"))

View File

@@ -9,6 +9,7 @@
"docstatus": 0,
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 0,
"fields": [
{
"allow_on_submit": 0,
@@ -296,7 +297,7 @@
"options": "Standard Reply",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
@@ -638,7 +639,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-06-30 01:57:49.233065",
"modified": "2016-08-01 08:45:39.777405",
"modified_by": "Administrator",
"module": "Buying",
"name": "Request for Quotation",

View File

@@ -26,6 +26,12 @@ def get_data():
"name": "Payment Entry",
"description": _("Bank/Cash transactions against party or for internal transfer")
},
{
"type": "page",
"name": "pos",
"label": _("POS"),
"description": _("Point of Sale")
},
{
"type": "report",
"name": "Accounts Receivable",

View File

@@ -229,12 +229,12 @@ def get_data():
"type": "list"
},
{
"module_name": "Examination",
"module_name": "Assessment",
"color": "#8a70be",
"icon": "icon-file-text-alt",
"label": _("Examination"),
"link": "List/Examination",
"_doctype": "Examination",
"label": _("Assessment"),
"link": "List/Assessment",
"_doctype": "Assessment",
"type": "list"
},
{
@@ -261,7 +261,7 @@ def get_data():
"icon": "icon-map-marker",
"label": _("Room"),
"link": "List/Room",
"_doctype": "Examination",
"_doctype": "Room",
"type": "list"
},
{

View File

@@ -12,7 +12,7 @@ You can create Custom Form, Fields, Scripts and can also create your own Apps
to extend ERPNext functionality.
ERPNext is Open Source under the GNU General Public Licence v3 and has been
listed as one of the Best Open Source Softwares in the world by my online
listed as one of the Best Open Source Softwares in the world by many online
blogs."""
docs_version = "6.x.x"

View File

@@ -61,7 +61,11 @@ def get_data():
},
{
"type": "doctype",
"name": "Examination"
"name": "Assessment"
},
{
"type": "doctype",
"name": "Assessment Group"
},
{
"type": "doctype",

View File

@@ -38,6 +38,7 @@ class StockController(AccountsController):
gl_list = []
warehouse_with_no_account = []
for detail in voucher_details:
sle_list = sle_map.get(detail.name)
if sle_list:
@@ -266,10 +267,9 @@ def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for
voucher_obj = frappe.get_doc(voucher_type, voucher_no)
expected_gle = voucher_obj.get_gl_entries(warehouse_account)
if expected_gle:
if not existing_gle or not compare_existing_and_expected_gle(existing_gle,
expected_gle):
_delete_gl_entries(voucher_type, voucher_no)
voucher_obj.make_gl_entries(repost_future_gle=False)
if not existing_gle or not compare_existing_and_expected_gle(existing_gle, expected_gle):
_delete_gl_entries(voucher_type, voucher_no)
voucher_obj.make_gl_entries(repost_future_gle=False)
else:
_delete_gl_entries(voucher_type, voucher_no)

View File

@@ -440,33 +440,32 @@ 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.doc.outstanding_amount = 0
if total_amount_to_pay > paid_amount:
self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount),
self.doc.precision("outstanding_amount"))
self.change_amount()
self.calculate_change_amount()
self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) +
flt(self.doc.change_amount), self.doc.precision("outstanding_amount"))
elif self.doc.doctype == "Purchase Invoice":
self.doc.outstanding_amount = flt(total_amount_to_pay, self.doc.precision("outstanding_amount"))
def calculate_paid_amount(self):
paid_amount = base_paid_amount = 0.0
for payment in self.doc.get('payments'):
payment.base_amount = flt(payment.amount * self.doc.conversion_rate)
paid_amount += payment.amount
base_paid_amount += payment.base_amount
if flt(payment.amount) > 0:
payment.base_amount = flt(payment.amount * self.doc.conversion_rate)
paid_amount += payment.amount
base_paid_amount += payment.base_amount
self.doc.paid_amount = flt(paid_amount, self.doc.precision("paid_amount"))
self.doc.base_paid_amount = flt(base_paid_amount, self.doc.precision("base_paid_amount"))
def change_amount(self):
change_amount = 0.0
def calculate_change_amount(self):
self.doc.change_amount = 0.0
if self.doc.paid_amount > self.doc.grand_total:
change_amount = flt(self.doc.paid_amount - self.doc.grand_total,
self.doc.precision("change_amount"))
self.doc.change_amount = flt(self.doc.paid_amount - self.doc.grand_total +
self.doc.write_off_amount, self.doc.precision("change_amount"))
self.doc.change_amount = change_amount;
self.doc.base_change_amount = flt(change_amount * self.doc.conversion_rate,
self.doc.base_change_amount = flt(self.doc.change_amount * self.doc.conversion_rate,
self.doc.precision("base_change_amount"))
def calculate_margin(self, item):

View File

@@ -38,7 +38,8 @@ class Lead(SellingController):
frappe.throw(_("Campaign Name is required"))
if self.email_id:
validate_email_add(self.email_id, True)
if not self.flags.ignore_email_validation:
validate_email_add(self.email_id, True)
if self.email_id == self.lead_owner:
# Lead Owner cannot be same as the Lead

View File

@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe, json
from frappe.utils import cstr, cint, get_fullname, validate_email_add
from frappe.utils import cstr, cint, get_fullname
from frappe import msgprint, _
from frappe.model.mapper import get_mapped_doc
from erpnext.setup.utils import get_exchange_rate
@@ -43,7 +43,7 @@ class Opportunity(TransactionBase):
def make_new_lead_if_required(self):
"""Set lead against new opportunity"""
if not (self.lead or self.customer) and self.contact_email and validate_email_add(self.contact_email):
if not (self.lead or self.customer) and self.contact_email:
lead_name = frappe.db.get_value("Lead", {"email_id": self.contact_email})
if not lead_name:
sender_name = get_fullname(self.contact_email)
@@ -64,6 +64,7 @@ class Opportunity(TransactionBase):
"lead_name": sender_name
})
lead.flags.ignore_email_validation = True
lead.insert(ignore_permissions=True)
lead_name = lead.name

View File

@@ -53,7 +53,7 @@ def simulate():
if not runs_for:
runs_for = frappe.utils.date_diff(frappe.utils.nowdate(), current_date)
# runs_for = 100
fixed_asset.work()
for i in xrange(runs_for):
@@ -72,9 +72,6 @@ def simulate():
stock.work()
accounts.work()
projects.run_projects(current_date)
# run_stock()
# run_accounts()
# run_projects()
# run_messages()
current_date = frappe.utils.add_days(current_date, 1)

View File

@@ -212,7 +212,7 @@ def setup_user():
user = frappe.new_doc("User")
user.update(u)
user.flags.no_welcome_mail
user.password = 'demo'
user.new_password = 'demo'
user.insert()
def import_json(doctype, submit=False, values=None):
@@ -377,6 +377,12 @@ def setup_budget():
def setup_user_roles():
user = frappe.get_doc('User', 'demo@erpnext.com')
user.add_roles('HR User', 'HR Manager', 'Accounts User', 'Accounts Manager',
'Stock User', 'Stock Manager', 'Sales User', 'Sales Manager', 'Purchase User',
'Purchase Manager', 'Projects User', 'Manufacturing User', 'Manufacturing Manager',
'Support Team')
if not frappe.db.get_global('demo_hr_user'):
user = frappe.get_doc('User', 'CharmaineGaudreau@example.com')
user.add_roles('HR User', 'HR Manager', 'Accounts User')
@@ -439,7 +445,7 @@ def setup_leave_allocation():
for leave_type in leave_types:
if not leave_type.max_days_allowed:
leave_type.max_days_allowed = 10
leave_allocation = frappe.get_doc({
"doctype": "Leave Allocation",
"employee": employee.name,
@@ -450,4 +456,4 @@ def setup_leave_allocation():
})
leave_allocation.insert()
leave_allocation.submit()
frappe.db.commit()
frappe.db.commit()

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -38,7 +38,7 @@ You can create Custom Form, Fields, Scripts and can also create your own Apps
to extend ERPNext functionality.</p>
<p>ERPNext is Open Source under the GNU General Public Licence v3 and has been
listed as one of the Best Open Source Softwares in the world by my online
listed as one of the Best Open Source Softwares in the world by many online
blogs.</p>
</div>

View File

@@ -1,21 +1,19 @@
journal-entry
sales-invoice
purchase-invoice
payment-request
chart-of-accounts
opening-accounts
sales-invoice
point-of-sale-pos-invoice
purchase-invoice
journal-entry
payment-entry
multi-currency-accounting
advance-payment-entry
payment-request
credit-limit
opening-entry
accounting-reports
accounting-entries
managing-fixed-assets
budgeting
opening-accounts
item-wise-tax
point-of-sale-pos-invoice
multi-currency-accounting
item-wise-taxation
recurring-orders-and-invoices
pricing-rule
tools

View File

@@ -1,4 +1,3 @@
Taxes selected in the Tax and Other Charges in transactions are applied on all the items. If you need different taxes applied on items selected in the same transaction, you should setup you item and tax master as explained in the steps below.
####Step 1: Mention Tax Applicable in the Item master

View File

@@ -2,30 +2,33 @@ In ERPNext, you can maintain fixed asset records like Computers, Furnitures, Car
## Asset Category
To start first you should create an Asset Category, depending on the type of assets. For example, all your desktops and laptops can be part of an Asset Category named "Computers". Here, you can set default depreciation method, periodicity and depreciation related accounts, which will be applicable to all the assets under the category.
Based on the type of assets, create Asset Category. For example, all your desktops and laptops can be part of an Asset Category named "Computers". Here you can set default depreciation method, periodicity and depreciation related accounts, which will be applicable to all the assets under the category.
<img class="screenshot" alt="Asset Category" src="{{docs_base_url}}/assets/img/accounts/asset-category.png">
> **Note:** You can also set default depreciation related Accounts and Cost Centers in Company.
> **Note:** You can also set default depreciation related Accounts and Cost Centers in Company master.
## Asset
Next step will be creating the fixed asset record. Asset record is the heart of fixed asset management, all the activities like purchasing, depreciation, scrapping or sales are managed against it.
Asset master is the heart of fixed asset management feature. All the transactions related to Asset like purchasing, sales, depreciation, scrapping will be managed from the Asset master.
<img class="screenshot" alt="Asset" src="{{docs_base_url}}/assets/img/accounts/asset.png">
Explanation of the fields:
1. Asset Category: The category of assets it belongs to.
2. Is Existing Asset: Check if the asset is being carried forward from the previous Fiscal Year. The existing assets which are partially / fully depreciated can also be created/maintained for the future reference.
3. Status: The options are - Draft, Submitted, Partially Depreciated, Fully Depreciated, Sold and Scrapped.
4. Warehouse: Set the location of the asset.
5. Gross Purchase Amount: The purchase cost of the asset
6. Expected Value After Useful Life: Useful Life is the time period over in which the company expects that the asset will be productive. After that period, either the asset is scrapped or sold. In case it is sold, mention the estimated value here. This value is also known as Salvage Value, Scrap Value or Residual Value.
7. Opening Accumulated Depreciation: The accumulated depreciation amount which has already been booked for an existing asset.
8. Current Value (After Depreciation): In case you are creating record of an existing asset which has already been partially/fully depreciated, mention the currect value of the asset. In case of new asset, mention the purchase amount or leave it blank.
9. Depreciation Method: There are two options: Straight Line and Double Declining Balance.
1. Item Code: An Item for the Asset must be a non-stock item, with "Is Asset" field checked.
<img class="screenshot" alt="Asset Item" src="{{docs_base_url}}/assets/img/accounts/asset-item.png">
2. Asset Category: The category of assets it belongs to.
3. Is Existing Asset: Check if the asset is being carried forward from the previous Fiscal Year. The existing assets which are partially / fully depreciated can also be created/maintained for the future reference.
4. Status: The options are - Draft, Submitted, Partially Depreciated, Fully Depreciated, Sold and Scrapped.
5. Warehouse: Set the location of the asset.
6. Gross Purchase Amount: The purchase cost of the asset.
7. Expected Value After Useful Life: Useful Life is the time period over in which the company expects that the asset will be productive. After that period, either the asset is scrapped or sold. In case it is sold, mention the estimated value here. This value is also known as Salvage Value, Scrap Value or Residual Value.
8. Opening Accumulated Depreciation: The accumulated depreciation amount which has already been booked for an existing asset.
9. Current Value (After Depreciation): In case you are creating record of an existing asset which has already been partially/fully depreciated, mention the current value of the asset. In case of new asset, mention the purchase amount or leave it blank.
10. Depreciation Method: There are two options: Straight Line and Double Declining Balance.
- Straight Line: This method spreads the cost of the fixed asset evenly over its useful life.
- Double Declining Method: An accelerated method of depreciation, it results in higher depreciation expense in the earlier years of ownership.
10. Total Number of Depreciations: The total number of depreciations during the useful life. In case of existing assets which are partially depreciated, mention the number of pending depreciations.
@@ -52,16 +55,16 @@ For better visibility, net value of the asset on different depreciation dates ar
## Purchase an Asset
For purchasing a new asset, create and submit the asset record with all the depreciation settings. Then create a Purchase Invoice via "Make Purchase Invoice" button. On clicking the button, system will load a new Purchase Invoice form with pre-loaded items table. It will also set proper fixed asset account (defined in teh Asset Category) in the Expense Account field. You need to select Supplier and other necessary details and submit the Purchase Invoice.
For purchasing a new asset, create and submit the asset record with all the depreciation settings. Then create a Purchase Invoice via "Make Purchase Invoice" button. On clicking the button, system will load a new Purchase Invoice form with pre-loaded items table. It will also set proper fixed asset account (defined in the Asset Category) in the Expense Account field. You need to select Supplier and other necessary details and submit the Purchase Invoice.
<img class="screenshot" alt="Asset" src="{{docs_base_url}}/assets/img/accounts/asset-purchase-invoice.png">
On submission of the invoice, the "Fixed Asset Account" will be debited and payable account will be credited. It also updates purchase date, supplier and Purchase Invoice no in the Asset record.
On submission of the invoice, the "Fixed Asset Account" will be debited and payable account will be credited. It also updates purchase date, supplier and Purchase Invoice no. in the Asset master.
## Sale an Asset
To sale an asset, open the asset record and create a Sales Invoice using "Sale Asset" button. On submission of the Sales Invoice, following entries will take place:
To sale an asset, open the asset record and create a Sales Invoice by clicking on "Sale Asset". On submission of the Sales Invoice, following entries will take place:
- "Receivable Account" (Debtors) will be debited by the sales amount.
- "Fixed Asset Account" will be credited by the purchase amount of asset.

View File

@@ -1,82 +1,99 @@
Now that you have completed most of the setup, its time to start moving in!
#Updating Opening Balance in Accounts
There are two important sets of data you need to enter before you start your
operations.
If you are a new company you can start using ERPNext accounting module by going to chart of accounts. However, if you are migrating from a legacy accounting system like Tally or a Fox Pro based software
* Opening Account balances.
* Opening Stock balances.
We recommend that you start using accounting in a new financial year, but you could start midway too. To setup your accounts, you will need the following for the “day” you start using accounting in ERPNext:
To setup your accounts and stock correctly you will need accurate data to work
with. Make sure you have the data setup for this.
* Opening capital accounts - like your shareholders (or owner) capital, loans, bank balances on that day.
### Opening Accounts
* List of outstanding sales and purchase invoices (Payables and Receivables).
We usually recommend that you start using accounting in a new financial year,
but you could start midway too. To setup your accounts, you will need the
following for the “day” you start using accounting in ERPNext:
If you were using another accounting software before, firstly you should close financial statements in that software. The closing balance of the accounts should be updated as an opening balance in the ERPNext. Before starting to update opening balance, ensure that your [Chart of Accounts]({{docs_base_url}}/user/manual/en/accounts/chart-of-accounts.html) has all the Accounts required.
Opening capital accounts - like your shareholders (or owner) capital, loans,
bank balances on that day. List of outstanding sales and purchase invoices
(Payables and Receivables).
> Opening entry is only for Balance Sheet accounts and not for the Accounts in the Profit and Loss statement.
Based on Voucher Type
* For all assets (excluding Accounts Receivables): This entry will contain all your assets except the amounts you are expecting from your Customers against outstanding Sales Invoices. You will have to update your receivables by making an individual entry for each Invoice (this is because, the system will help you track the invoices which are yet to be paid). You can credit the sum of all these debits against the **Temporary Opening** account.
* For all liabilities: Similarly you need to pass a Journal Entry for your Opening Liabilities (except for the bills you have to pay) against **Temporary Opening** account.
You can select accounts based on the voucher type. In such a scenario, your balance sheet should be balanced.
###Opening Entry
####Step 1: New Journal Entry
To open new Journal Entry, go to:
`Explore > Accounts > Journal Entry`
####Step 2: Entry Type
If Entry Type is selected as Opening Entry, all the Balance Sheet Accounts will be auto-fetched in the Journal Entry.
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-account-1.png">
Also, note that if there are more than 300 ledgers, the system will crash. Thus to avoid such a situation, you can open accounts by using temporary accounts.
####Step 3: Posting Date
#### Temporary Accounts
Select Posting Date on which Accounts Opening Balance will be updated.
A nice way to simplify opening is to use a temporary account just for opening. These accounts will become zero once all your old invoices and opening balances of bank, debt stock etc are entered. In the standard chart of accounts, a **Temporary Opening** account is created under assets
####Step 4: Enter Debit/Credit Value
#### The Opening Entry
For each Account, enter opening value in the Debit or Credit column. As per the double entry valuation system, Total Debit value in a entry must be equal to Total Credit value.
In ERPNext Opening Accounts are setup by submitting a special Journal Entries
(Journal Entry).
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-6.png">
Note: Make sure to set “Is Opening” as “Yes” in the More Info section.
####Step 5: Is Opening
> Setup > Opening Accounts and Stock > Opening Accounting Entries.
Set field `Is Opening` as `Yes`.
Complete Journal Entries on the Debit and Credit side.
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-3.png">
![Opening Entry]({{docs_base_url}}/assets/old_images/erpnext/opening-entry-1.png)
####Step 6: Save and Submit
To update opening balance is to make Journal Entry for an individual/group of accounts.
After enter opening balance for each account, Save and Submit Journal Entry. To check if Opening Balance for an account is updated correctly, you can check Trial Balance report.
For example, if you want to update balance in three bank accounts, then make Journal Entrys in this manner.
###Selecting Accounts Manually
![Opening Temp Entry]({{docs_base_url}}/assets/old_images/erpnext/image-temp-opening.png)
If your Balance Sheet has many Accounts, then updating Account Opening balance from single Journal Entry can lead to performance issues. In such a scenario, you can multiple Journal Entries to update opening balance in all the Accounts.
![Opening Entry]({{docs_base_url}}/assets/old_images/erpnext/opening-entry-2.png)
If you are updating account opening balance in few accounts at a time, you can use **Temporary Opening** account for balancing purpose. In the standard chart of accounts, a Temporary Opening Account is auto-created under Assets.
Temporary Asset and Liability account is used for balancing purpose. When you update opening balance in Liability Account, you can use Temporary Asset Account for balancing.
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-7.png">
This way, you can update opening balance in Asset and Liability accounts.
In the Journal Entry, manually select an Account for which opening balance is to be updated. For each Account, enter opening balance value in the Debit or Credit column, based on it's Account Type (Asset or Liability).
You can make two Opening Journal Entrys:
For example, if you want to update balance in bank accounts, create Journal Entry as following.
* For all assets (excluding Accounts Receivables): This entry will contain all your assets except the amounts you are expecting from your Customers against outstanding Sales Invoices. You will have to update your receivables by making an individual entry for each Invoice (this is because, the system will help you track the invoices which are yet to be paid). You can credit the sum of all these debits against the **Temporary Opening** account.
* For all liabilities: Similarly you need to pass a Journal Entry for your Opening Liabilities (except for the bills you have to pay) against **Temporary Opening** account.
* In this method you can update opening balance of specific balancesheet accounts and not for all.
* Opening entry is only for balance sheet accounts and not for expense or Income accounts.
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-2.png">
Once all your invoices are entered, your **Temporary Opening** account will have a balance of zero!
###Trial Balance
After completing the accounting entries, the trial balance report will look like the one given below:
![Trial Balance]({{docs_base_url}}/assets/old_images/erpnext/trial-balance-1.png)
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-4.png">
#### Outstanding Invoices
###Stock Opening
After your Opening Journal Entrys are made, you will need to enter each Sales Invoice and Purchase Invoice that is yet to be paid.
To track stock balance in the Chart of Account, an Account is created for each Warehouse.
Since you have already booked the income or expense on these invoices in the previous period, select the temp opening account **Temporary Opening** in the “Income” and “Expense” accounts.
`Chart of Accounts > Assets > Current Asset > StocK Assets > (Warehouse Account)`
<img class="screenshot" alt="Opening Account" src="{{docs_base_url}}/assets/img/accounts/opening-5.png">
To update stock opening balance, create [Stock Reconciliation entry]({{docs_base_url}}/user/manual/en/stock/opening-stock.html). Based on the valuation of items's update in the Warehouse, balance will be updated in the Warehouse account.
###Fixed Asset Opening
Opening balance for the fixed asset account should be updated via Journal Entry. Assets which are not fully depreciated should be added in the [Asset master]({{docs_base_url}}/user/manual/en/accounts/managing-fixed-assets.html). For adding Assets in your possession, ensure to check **Is Existing Asset** field.
### Outstanding Invoices
After opening Journal Entries are made, you will need to enter each Sales Invoice and Purchase Invoice that is yet to be paid.
Since you have already booked the income or expense on these invoices in the previous period, select **Temporary Opening** in the “Income” and “Expense” accounts.
> Note: Make sure to set each invoice as “Is Opening”!
If you dont care what items are in that invoice, just make a dummy item entry in the Invoice. Item code in the Invoice is not necessary, so it should not be such a problem.
Once all your invoices are entered, your **Temporary Opening** account will have a balance of zero!
{next}

View File

@@ -1,7 +0,0 @@
If you are a new company you can start using ERPNext accounting module by
going to chart of accounts.
However, if you are migrating from a legacy accounting system like Tally or a
Fox Pro based software, please visit [Opening Entry.]({{docs_base_url}}/user/manual/en/accounts/opening-accounts.html)
{next}

Some files were not shown because too many files have changed in this diff Show More