Compare commits

...

94 Commits

Author SHA1 Message Date
Nabin Hait
1bdffbff57 Merge branch 'hotfix' 2016-09-07 17:01:17 +05:30
Nabin Hait
094d3adba3 bumped to version 7.0.41 2016-09-07 17:31:17 +06:00
Nabin Hait
6a5751e91c Merge pull request #6311 from nabinhait/patch_hotfix_1
Patch fixed
2016-09-07 17:00:29 +05:30
Nabin Hait
23147ff881 Patch fixed 2016-09-07 16:59:55 +05:30
Nabin Hait
c16c0ca944 Merge pull request #6310 from rohitwaghchaure/pos_itemwise_tax_issue
[Fix] Item level taxes are not getting calculated in POS
2016-09-07 15:59:32 +05:30
Rohit Waghchaure
525900c5c1 [Fix] Item level taxes are not getting calculated in POS 2016-09-07 15:01:08 +05:30
Nabin Hait
75a41a6f75 Merge branch 'hotfix' 2016-09-06 17:55:55 +05:30
Nabin Hait
9b54b78794 bumped to version 7.0.40 2016-09-06 18:25:55 +06:00
Nabin Hait
93851df048 Merge pull request #6299 from nabinhait/patch_fix_800
Patch fixed
2016-09-06 17:49:53 +05:30
Nabin Hait
f79d7188de Patch fixed 2016-09-06 17:47:19 +05:30
Nabin Hait
3cdc74e3b0 Merge pull request #6286 from rohitwaghchaure/pos_name
[POS] Added offline_pos_name in print format
2016-09-06 11:38:51 +05:30
Rohit Waghchaure
377c7acd53 [POS] Added offline_pos_name in print format 2016-09-05 17:59:01 +05:30
Nabin Hait
05621ed564 Merge pull request #6284 from nabinhait/advance_fetch
[fix] Fetch advance journal entry in invoice if it is tagged against linked order
2016-09-05 17:02:44 +05:30
Nabin Hait
ca627fb806 [fix] Fetch advance journal entry in invoice if it is tagged against linked order 2016-09-05 16:17:08 +05:30
Nabin Hait
6e4ab60e4c Merge branch 'hotfix' 2016-09-05 15:43:48 +05:30
Nabin Hait
911e9caa43 bumped to version 7.0.39 2016-09-05 16:13:48 +06:00
Nabin Hait
b239a09951 Merge pull request #6282 from nabinhait/maintenance_schedule_fix
Minor fix in maintenance schedule
2016-09-05 15:39:54 +05:30
Nabin Hait
d223a03814 Merge pull request #6281 from nabinhait/notifications
Notifications filters for DN, PR and PI
2016-09-05 15:26:23 +05:30
Nabin Hait
4cb58c410a Minor fix in maintenance schedule 2016-09-05 15:14:26 +05:30
Nabin Hait
906552a401 Notifications filters for DN, PR and PI 2016-09-05 14:35:40 +05:30
Nabin Hait
3bd5014b7b Merge pull request #6280 from nabinhait/minorfixes
Minor fixes
2016-09-05 12:32:09 +05:30
Nabin Hait
8693b5c93a Minor fixes 2016-09-05 11:51:45 +05:30
Nabin Hait
36830016ee Merge branch 'hotfix' 2016-09-02 16:19:21 +05:30
Nabin Hait
533e564867 bumped to version 7.0.38 2016-09-02 16:49:21 +06:00
Nabin Hait
88d7e419ad Merge pull request #6263 from nabinhait/timesheet_fix_101
Migrate employee field to timesheet only if it exists in time log
2016-09-02 16:18:12 +05:30
Nabin Hait
54254cca58 Update set_party_name_in_payment_entry.py 2016-09-02 16:17:42 +05:30
Nabin Hait
142f14dd5c Migrate employee field to timesheet only if it exists in time log 2016-09-02 14:47:14 +05:30
Nabin Hait
0f0c131ba4 Merge branch 'hotfix' 2016-09-02 14:26:33 +05:30
Nabin Hait
e1e187bee1 bumped to version 7.0.37 2016-09-02 14:56:33 +06:00
Nabin Hait
c946c730da Merge pull request #6258 from nabinhait/party_name_in_pe
Party name in Payment Entry and cheque print format
2016-09-02 14:20:22 +05:30
Nabin Hait
5a4ca64c4a Party name in Payment Entry and cheque print format 2016-09-02 14:20:01 +05:30
Nabin Hait
47fd4c6521 Merge pull request #6261 from nabinhait/order_trends_fix
Ignore closed sales/purchase order in trends report
2016-09-02 14:17:30 +05:30
Nabin Hait
e58031ab49 Merge pull request #6249 from rohitwaghchaure/rfq_webform_issue
[RFQ] Web form alignment issue
2016-09-02 14:17:22 +05:30
Nabin Hait
f8e374643c Merge pull request #6257 from nabinhait/letter_head_in_report
Default letter head in report printing based on selected company
2016-09-02 14:17:12 +05:30
Nabin Hait
0ef9da65dc Merge pull request #6260 from rohitwaghchaure/timesheet_status_and_date_issue
[Fix] Updated timesheet status, start date, end date
2016-09-02 14:16:53 +05:30
Nabin Hait
98d58b5ed1 Merge pull request #6262 from saurabh6790/hotfix
[fix] set is_group filter in get query for warehouse
2016-09-02 14:14:47 +05:30
Saurabh
ff910f4c72 [fixes] set filter for warehouse 2016-09-02 13:39:05 +05:30
Nabin Hait
5c69fed218 Ignore closed sales/purchase order in trends report 2016-09-02 12:53:18 +05:30
Rohit Waghchaure
d07557eaf6 [Fix] Updated timesheet status 2016-09-02 12:24:54 +05:30
Nabin Hait
13b37c6346 Default letter head in report printing based on selected company 2016-09-02 11:25:42 +05:30
Rohit Waghchaure
b34ba6bd6e [RFQ] Web form alignment issue 2016-09-01 19:10:58 +05:30
Nabin Hait
94dbc14f8a Merge branch 'hotfix' 2016-09-01 12:42:29 +05:30
Nabin Hait
600ab0f7a0 bumped to version 7.0.36 2016-09-01 13:12:29 +06:00
Nabin Hait
9afee28c36 Merge pull request #6243 from rohitwaghchaure/timesheet_issue
[Patch] Check table exist
2016-09-01 12:38:30 +05:30
Rohit Waghchaure
86f143863f [Patch] Check table exist 2016-09-01 12:37:20 +05:30
Nabin Hait
c7be851bf8 Merge branch 'hotfix' 2016-09-01 12:26:11 +05:30
Nabin Hait
b6f33c7c4f bumped to version 7.0.35 2016-09-01 12:56:11 +06:00
Nabin Hait
bb2bceef62 Merge pull request #6229 from rohitwaghchaure/pos_payment_issue
[POS] Fixed POS Sales Invoice when Payment Table is Empty
2016-09-01 12:25:31 +05:30
Nabin Hait
3e805708dc Merge pull request #6237 from rohitwaghchaure/timesheet_employee_missing_issue
[Fix] Timesheet, employee is missing in patch
2016-09-01 12:15:06 +05:30
Rohit Waghchaure
7f165f19d2 [Fix] Timesheet employee is missing in patch 2016-09-01 12:07:21 +05:30
Rohit Waghchaure
774ce63b75 remove mode of payment, migrate mode of payment from v6 to v7 2016-08-31 21:21:41 +05:30
Rohit Waghchaure
879cb6ebee [POS] Fixed POS Sales Invoice when Payment Table is Empty 2016-08-31 14:41:48 +05:30
Nabin Hait
16e15283b5 Imported unicode literals 2016-08-31 12:33:22 +05:30
Nabin Hait
ef16d657ff Merge pull request #6226 from rohitwaghchaure/pos_fixes_and_cleanups
[POS] Currency format issue, added zero value condition
2016-08-31 11:02:16 +05:30
Rohit Waghchaure
d39f53319d Added zero value condition 2016-08-31 02:09:15 +05:30
Rohit Waghchaure
609e2b4ca3 [POS] Currency format issue 2016-08-31 02:04:53 +05:30
Nabin Hait
4f71190a85 Merge pull request #6215 from rohitwaghchaure/pos_precision_issue
[Fix] Precision issue for field conversion rate in POS
2016-08-30 09:52:55 +05:30
Rohit Waghchaure
a57bf5ee2e [fix] Precision issue for field conversion rate in POS 2016-08-30 01:05:01 +05:30
Nabin Hait
51a236f38b Merge branch 'hotfix' 2016-08-29 11:47:30 +05:30
Nabin Hait
11c2207a8a bumped to version 7.0.34 2016-08-29 12:17:30 +06:00
Nabin Hait
a0da708d51 Merge pull request #6185 from rohitwaghchaure/fixes_and_cleanup_pos
[POS] Fixes and cleanup
2016-08-29 11:42:09 +05:30
Nabin Hait
84e88b5d63 Merge pull request #6198 from rmehta/hotfix
[minor] validate permission in Process Payroll and all products fix for home page
2016-08-29 11:23:50 +05:30
Rushabh Mehta
9d1b56f423 [minor] validate permission in Process Payroll and all products fix for home page 2016-08-29 11:03:10 +05:30
Rohit Waghchaure
63bdd679d0 [POS] Fixes and cleanup 2016-08-27 02:53:36 +05:30
Nabin Hait
f92f04bffc Merge branch 'hotfix' 2016-08-26 12:37:19 +05:30
Nabin Hait
6592899741 bumped to version 7.0.33 2016-08-26 13:07:19 +06:00
Nabin Hait
06b27757ab Merge pull request #6179 from rohitwaghchaure/minor_fix_patch
[Sales Return] Minor fix in patch
2016-08-26 12:33:33 +05:30
Rohit Waghchaure
e21e1ebae2 [Sales Return] Minor fix in patch 2016-08-26 12:31:41 +05:30
Nabin Hait
a26bb96d2d Merge pull request #6178 from nabinhait/status_updater_fix
Ignore validating billed amount against order if order item amount is zero
2016-08-26 12:09:39 +05:30
Nabin Hait
fbe1563101 Merge pull request #6168 from rohitwaghchaure/hotfix
[POS] Fixed payment gl entry for sales return
2016-08-26 11:58:46 +05:30
Nabin Hait
47a3f639ed Ignore validating billed amount against order if order item amount is zero 2016-08-26 11:39:39 +05:30
Rohit Waghchaure
efb5bf2cfc [POS] Fixed payment gl entry for sales return 2016-08-25 16:23:47 +05:30
Nabin Hait
385311c8a2 Merge pull request #6170 from rohitwaghchaure/patch_fix
[Fix] 'SalesInvoice' object has no attribute 'account_for_change_amount'
2016-08-25 14:41:47 +05:30
Rohit Waghchaure
0788ee62c1 Fixed patch, 'SalesInvoice' object has no attribute 'account_for_change_amount' 2016-08-25 12:46:34 +05:30
Nabin Hait
ec6267e82a Merge branch 'hotfix' 2016-08-23 12:10:56 +05:30
Nabin Hait
db05ac2414 bumped to version 7.0.32 2016-08-23 12:40:56 +06:00
Nabin Hait
f862505bf9 Merge pull request #6153 from rohitwaghchaure/hotfix
[POS] Fixed decimal button not working
2016-08-23 12:07:40 +05:30
Rohit Waghchaure
ea6d7e9b09 [Fix] decimal button not working 2016-08-23 11:39:44 +05:30
Nabin Hait
8f782e71af Merge pull request #6149 from nabinhait/change_log_v7
Change logs for v7
2016-08-22 15:56:32 +05:30
Nabin Hait
dac204b1e3 Merge pull request #6124 from rohitwaghchaure/hotfix
[POS] Fixed issue of paid amount, write off account
2016-08-22 15:56:20 +05:30
Nabin Hait
9c786948d5 Merge pull request #6125 from nabinhait/lcv_hotfix
[fix] Repost only distinct purchase receipts and invoices
2016-08-22 15:53:21 +05:30
Nabin Hait
6f1795cb3d Merge pull request #6146 from neilLasrado/operation
Operations related fixes
2016-08-22 15:52:57 +05:30
Nabin Hait
01b555edc7 Change logs for v7 2016-08-22 15:50:21 +05:30
Neil Trini Lasrado
20b01873ab Made operation mandatory and removed mandatory from operation desc in Production Order Operation, set operation name as desc in operation master if desc is blank 2016-08-22 15:05:50 +05:30
Nabin Hait
43accf4c07 Merge pull request #6144 from nabinhait/timesheet_patch_fix
Ignore validating mandatory fields on converting timelogs to timesheets
2016-08-22 14:39:01 +05:30
Nabin Hait
9239ed5c44 Ignore validating mandatory fields on converting timelogs to timesheets 2016-08-22 14:35:06 +05:30
Rohit Waghchaure
713e2b7b62 [POS] Fixed issue of paid amount, write off account 2016-08-19 19:27:16 +05:30
Nabin Hait
3b6dc141c6 [fix] Repost only distinct purchase receipts and invoices 2016-08-19 16:39:50 +05:30
Nabin Hait
e4fb7b1b2f Merge branch 'hotfix' 2016-08-18 16:15:49 +05:30
Nabin Hait
9a1bcac576 bumped to version 7.0.31 2016-08-18 16:45:49 +06:00
Nabin Hait
e68b089187 Query for warehouse in delivery note 2016-08-18 16:14:23 +05:30
Nabin Hait
d8a372587d [fix] Legend in support analytics chart 2016-08-18 16:14:23 +05:30
Nabin Hait
f04ce3c5a6 [fix] check expense agaist budget 2016-08-18 16:14:23 +05:30
Nabin Hait
50f8262ac7 Currency fix in reports 2016-08-18 16:14:23 +05:30
62 changed files with 994 additions and 455 deletions

View File

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

View File

@@ -18,7 +18,8 @@ frappe.ui.form.on('Asset', {
frm.set_query("warehouse", function() {
return {
"filters": {
"company": frm.doc.company
"company": frm.doc.company,
"is_group": 0
}
};
});
@@ -232,7 +233,10 @@ erpnext.asset.transfer_asset = function(frm) {
"options": "Warehouse",
"get_query": function () {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
},
"reqd": 1

View File

@@ -7,7 +7,10 @@ frappe.ui.form.on('Asset Movement', {
frm.set_query("target_warehouse", function() {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
})

View File

@@ -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",

View File

@@ -73,13 +73,14 @@ 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)

View File

@@ -43,7 +43,7 @@ def create_or_update_cheque_print_format(template_name):
</span>
<span style="top:%(payer_name_from_top_edge)scm;left: %(payer_name_from_left_edge)scm;
position: absolute;">
{{doc.party}}
{{doc.party_name}}
</span>
<span style="top:%(amt_in_words_from_top_edge)scm; left:%(amt_in_words_from_left_edge)scm;
position: absolute; display: block; width: %(amt_in_word_width)scm;

View File

@@ -226,6 +226,12 @@ frappe.ui.form.on('Payment Entry', {
party: function(frm) {
if(frm.doc.payment_type && frm.doc.party_type && frm.doc.party) {
if(!frm.doc.posting_date) {
frappe.msgprint(__("Please select Posting Date before selecting Party"))
frm.set_value("party", "");
return ;
}
frm.set_party_account_based_on_party = true;
return frappe.call({

View File

@@ -15,6 +15,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "type_of_payment",
"fieldtype": "Section Break",
"hidden": 0,
@@ -40,6 +41,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 0,
@@ -66,13 +68,14 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_type",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"in_list_view": 1,
"label": "Payment Type",
"length": 0,
"no_copy": 0,
@@ -92,6 +95,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type)",
"fieldname": "party_type",
"fieldtype": "Select",
@@ -119,6 +123,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type) && doc.party_type",
"fieldname": "party",
"fieldtype": "Dynamic Link",
@@ -146,6 +151,33 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "party_name",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Party Name",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"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,
"columns": 0,
"fieldname": "column_break_5",
"fieldtype": "Column Break",
"hidden": 0,
@@ -170,6 +202,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"default": "Today",
"fieldname": "posting_date",
"fieldtype": "Date",
@@ -196,6 +229,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -222,6 +256,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "mode_of_payment",
"fieldtype": "Link",
"hidden": 0,
@@ -248,6 +283,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
"columns": 0,
"fieldname": "payment_accounts_section",
"fieldtype": "Section Break",
"hidden": 0,
@@ -273,6 +309,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "party",
"fieldname": "party_balance",
"fieldtype": "Currency",
@@ -299,6 +336,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(in_list([\"Internal Transfer\", \"Pay\"], doc.payment_type) || doc.party)",
"fieldname": "paid_from",
"fieldtype": "Link",
@@ -326,6 +364,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "paid_from",
"fieldname": "paid_from_account_currency",
"fieldtype": "Link",
@@ -353,6 +392,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "paid_from",
"fieldname": "paid_from_account_balance",
"fieldtype": "Currency",
@@ -380,6 +420,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_18",
"fieldtype": "Column Break",
"hidden": 0,
@@ -404,6 +445,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(in_list([\"Internal Transfer\", \"Receive\"], doc.payment_type) || doc.party)",
"fieldname": "paid_to",
"fieldtype": "Link",
@@ -431,6 +473,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "paid_to",
"fieldname": "paid_to_account_currency",
"fieldtype": "Link",
@@ -458,6 +501,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "paid_to",
"fieldname": "paid_to_account_balance",
"fieldtype": "Currency",
@@ -486,6 +530,7 @@
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "eval:(doc.paid_to && doc.paid_from)",
"fieldname": "payment_amounts_section",
"fieldtype": "Section Break",
@@ -512,6 +557,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "paid_amount",
"fieldtype": "Currency",
@@ -539,6 +585,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "source_exchange_rate",
"fieldtype": "Float",
@@ -565,6 +612,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "base_paid_amount",
"fieldtype": "Currency",
@@ -592,6 +640,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_21",
"fieldtype": "Column Break",
"hidden": 0,
@@ -616,6 +665,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "received_amount",
"fieldtype": "Currency",
@@ -643,6 +693,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "target_exchange_rate",
"fieldtype": "Float",
@@ -669,6 +720,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "base_received_amount",
"fieldtype": "Currency",
@@ -697,6 +749,7 @@
"bold": 0,
"collapsible": 1,
"collapsible_depends_on": "references",
"columns": 0,
"depends_on": "eval:(doc.party && doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)",
"fieldname": "section_break_14",
"fieldtype": "Section Break",
@@ -723,6 +776,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "references",
"fieldtype": "Table",
@@ -750,6 +804,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "section_break_34",
"fieldtype": "Section Break",
@@ -776,6 +831,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.paid_amount && doc.received_amount && doc.references)",
"fieldname": "total_allocated_amount",
"fieldtype": "Currency",
@@ -802,6 +858,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "base_total_allocated_amount",
"fieldtype": "Currency",
@@ -829,6 +886,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "set_exchange_gain_loss",
"fieldtype": "Button",
"hidden": 0,
@@ -854,6 +912,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_36",
"fieldtype": "Column Break",
"hidden": 0,
@@ -878,6 +937,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.paid_amount && doc.received_amount && doc.references)",
"fieldname": "unallocated_amount",
"fieldtype": "Currency",
@@ -904,6 +964,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.paid_amount && doc.received_amount)",
"fieldname": "difference_amount",
"fieldtype": "Currency",
@@ -931,6 +992,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "difference_amount",
"fieldname": "write_off_difference_amount",
"fieldtype": "Button",
@@ -958,6 +1020,7 @@
"bold": 0,
"collapsible": 1,
"collapsible_depends_on": "deductions",
"columns": 0,
"depends_on": "eval:(doc.paid_amount && doc.received_amount)",
"fieldname": "deductions_or_loss_section",
"fieldtype": "Section Break",
@@ -984,6 +1047,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "deductions",
"fieldtype": "Table",
"hidden": 0,
@@ -1010,6 +1074,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "transaction_references",
"fieldtype": "Section Break",
"hidden": 0,
@@ -1035,6 +1100,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.paid_from && doc.paid_to)",
"fieldname": "reference_no",
"fieldtype": "Data",
@@ -1061,6 +1127,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_23",
"fieldtype": "Column Break",
"hidden": 0,
@@ -1085,6 +1152,7 @@
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.paid_from && doc.paid_to)",
"fieldname": "reference_date",
"fieldtype": "Date",
@@ -1111,6 +1179,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.docstatus==1",
"fieldname": "clearance_date",
"fieldtype": "Date",
@@ -1138,6 +1207,7 @@
"bold": 0,
"collapsible": 1,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "eval:(doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)",
"fieldname": "section_break_12",
"fieldtype": "Section Break",
@@ -1164,6 +1234,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "project",
"fieldtype": "Link",
@@ -1191,6 +1262,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "remarks",
"fieldtype": "Small Text",
"hidden": 0,
@@ -1216,6 +1288,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_16",
"fieldtype": "Column Break",
"hidden": 0,
@@ -1240,6 +1313,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "letter_head",
"fieldtype": "Link",
"hidden": 0,
@@ -1266,6 +1340,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "print_heading",
"fieldtype": "Link",
"hidden": 0,
@@ -1292,6 +1367,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
@@ -1317,6 +1393,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "title",
"fieldtype": "Data",
"hidden": 1,
@@ -1349,8 +1426,8 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-07-11 08:06:33.121527",
"modified_by": "NuranVerkleij@example.com",
"modified": "2016-09-05 11:06:18.183458",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",
"name_case": "",

View File

@@ -73,6 +73,9 @@ class PaymentEntry(AccountsController):
if not self.party:
frappe.throw(_("Party is mandatory"))
self.party_name = frappe.db.get_value(self.party_type, self.party,
self.party_type.lower() + "_name")
if self.party:
if not self.party_balance:

View File

@@ -1,6 +0,0 @@
frappe.listview_settings['Payment Entry'] = {
add_fields: ["payment_type"],
get_indicator: function(doc) {
return [__(doc.payment_type), (doc.docstatus==0 ? 'red' : 'blue'), 'status=' + doc.payment_type]
}
}

View File

@@ -171,7 +171,7 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"in_list_view": 1,
"label": "Allocated",
"length": 0,
"no_copy": 0,

View File

@@ -340,14 +340,20 @@ frappe.ui.form.on("Purchase Invoice", {
$.each(["warehouse", "rejected_warehouse"], function(i, field) {
frm.set_query(field, "items", function() {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
})
})
frm.set_query("supplier_warehouse", function() {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
})
},

View File

@@ -252,17 +252,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,
@@ -278,17 +278,17 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "due_date",
"fieldname": "bill_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 1,
"in_list_view": 0,
"label": "Due Date",
"label": "Supplier Invoice Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "due_date",
"oldfieldname": "bill_date",
"oldfieldtype": "Date",
"permlevel": 0,
"print_hide": 1,
@@ -3032,7 +3032,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
"modified": "2016-08-10 02:45:28.746569",
"modified": "2016-08-24 12:50:15.777689",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",

View File

@@ -23,7 +23,8 @@ def get_pos_data():
frappe.msgprint('<a href="#List/POS Profile">'
+ _("Welcome to POS: Create your POS Profile") + '</a>');
update_pos_profile_data(doc, pos_profile)
company_data = get_company_data(doc.company)
update_pos_profile_data(doc, pos_profile, company_data)
update_multi_mode_option(doc, pos_profile)
default_print_format = pos_profile.get('print_format') or "Point of Sale"
print_template = frappe.db.get_value('Print Format', default_print_format, 'html')
@@ -32,7 +33,7 @@ def get_pos_data():
'doc': doc,
'default_customer': pos_profile.get('customer'),
'items': get_items(doc, pos_profile),
'customers': get_customers(pos_profile, doc),
'customers': get_customers(pos_profile, doc, company_data.default_currency),
'pricing_rules': get_pricing_rules(doc),
'print_template': print_template,
'meta': {
@@ -42,8 +43,10 @@ def get_pos_data():
}
}
def update_pos_profile_data(doc, pos_profile):
company_data = frappe.db.get_value('Company', doc.company, '*', as_dict=1)
def get_company_data(company):
return frappe.get_all('Company', fields = ["*"], filters= {'name': company})[0]
def update_pos_profile_data(doc, pos_profile, company_data):
doc.campaign = pos_profile.get('campaign')
doc.write_off_account = pos_profile.get('write_off_account') or \
@@ -148,14 +151,14 @@ def get_serial_nos(item, pos_profile, company):
return serial_no_list
def get_customers(pos_profile, doc):
def get_customers(pos_profile, doc, company_currency):
filters = {'disabled': 0}
customer_list = []
customers = frappe.get_all("Customer", fields=["*"], filters = filters)
for customer in customers:
customer_currency = get_party_account_currency('Customer', customer.name, doc.company) or doc.currency
if customer_currency == doc.currency:
if customer_currency == doc.currency or customer_currency == company_currency:
customer_list.append(customer)
return customer_list

File diff suppressed because it is too large Load Diff

View File

@@ -65,8 +65,8 @@ class SalesInvoice(SellingController):
self.validate_fixed_asset()
self.set_income_account_for_fixed_assets()
# if cint(self.is_pos):
# self.validate_pos()
if cint(self.is_pos):
self.validate_pos()
if cint(self.update_stock):
self.validate_dropship_item()
@@ -89,6 +89,8 @@ class SalesInvoice(SellingController):
set_account_for_mode_of_payment(self)
def on_submit(self):
self.validate_pos_paid_amount()
if not self.recurring_id:
frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
self.company, self.base_grand_total, self)
@@ -121,6 +123,10 @@ class SalesInvoice(SellingController):
self.update_time_sheet(self.name)
def validate_pos_paid_amount(self):
if len(self.payments) == 0 and self.is_pos:
frappe.throw(_("At least one mode of payment is required for POS invoice."))
def before_cancel(self):
self.update_time_sheet(None)
@@ -219,6 +225,20 @@ class SalesInvoice(SellingController):
timesheet.set_status()
timesheet.save()
def on_update(self):
self.set_paid_amount()
def set_paid_amount(self):
paid_amount = 0.0
base_paid_amount = 0.0
for data in self.payments:
data.base_amount = flt(data.amount*self.conversion_rate, self.precision("base_paid_amount"))
paid_amount += data.amount
base_paid_amount += data.base_amount
self.paid_amount = paid_amount
self.base_paid_amount = base_paid_amount
def validate_time_sheets_are_submitted(self):
for data in self.timesheets:
if data.time_sheet:
@@ -234,7 +254,7 @@ 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'):
if not self.get('payments') and not for_validate:
pos_profile = frappe.get_doc('POS Profile', pos.name) if pos else None
update_multi_mode_option(self, pos_profile)
@@ -356,11 +376,8 @@ class SalesInvoice(SellingController):
throw(_("Customer {0} does not belong to project {1}").format(self.customer,self.project))
def validate_pos(self):
if not self.cash_bank_account and flt(self.paid_amount):
frappe.throw(_("Cash or Bank Account is mandatory for making payment entry"))
if flt(self.paid_amount) + flt(self.write_off_amount) \
- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)):
- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)) and self.is_return:
frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total"""))
@@ -381,8 +398,10 @@ 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)
@@ -586,35 +605,34 @@ class SalesInvoice(SellingController):
gl_entries += super(SalesInvoice, self).get_gl_entries()
def make_pos_gl_entries(self, gl_entries):
if cint(self.is_pos) and self.paid_amount:
if cint(self.is_pos):
for payment_mode in self.payments:
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({
"account": payment_mode.account,
"against": self.customer,
"debit": payment_mode.base_amount,
"debit_in_account_currency": payment_mode.base_amount \
if payment_mode_account_currency==self.company_currency else payment_mode.amount
}, payment_mode_account_currency)
)
# 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({
"account": payment_mode.account,
"against": self.customer,
"debit": payment_mode.base_amount,
"debit_in_account_currency": payment_mode.base_amount \
if payment_mode_account_currency==self.company_currency else payment_mode.amount
}, payment_mode_account_currency)
)
def make_gle_for_change_amount(self, gl_entries):
if cint(self.is_pos) and self.change_amount:

View File

@@ -509,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(){
@@ -591,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() {
@@ -614,6 +614,15 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.child.batch_no = this.item_batch_no[this.child.item_code];
this.child.serial_no = (this.item_serial_no[this.child.item_code]
? this.item_serial_no[this.child.item_code][0] : '');
this.child.item_tax_rate = this.items[0].taxes;
},
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) {
@@ -623,6 +632,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;
@@ -698,7 +708,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");
@@ -765,6 +776,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
this.update_invoice()
}else{
this.name = $.now();
this.frm.doc.offline_pos_name = this.name;
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

View File

@@ -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\">{{ 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>",
"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{{ __(\"POS No : \") }}{{offline_pos_name}}<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-08-11 07:23:04.530676",
"modified": "2016-09-05 08:28:42.308782",
"modified_by": "Administrator",
"name": "Point of Sale",
"owner": "Administrator",

View File

@@ -1,5 +1,5 @@
<div style="margin-bottom: 7px;" class="text-center">
{%= frappe.boot.letter_heads[frappe.defaults.get_default("letter_head")] %}
{%= frappe.boot.letter_heads[frappe.get_doc(":Company", filters.company).default_letter_head || frappe.defaults.get_default("letter_head")] %}
</div>
<h2 class="text-center">{%= __(report.report_name) %}</h2>
<h4 class="text-center">{%= filters.customer || filters.supplier %} </h4>

View File

@@ -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":

View File

@@ -34,7 +34,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
columns.append({
"fieldname": "currency",
"label": _("Currency"),
"fieldtype": "Data",
"fieldtype": "Link",
"options": "Currency",
"width": 80
})

View File

@@ -13,7 +13,9 @@
height: 37px;
}
</style>
<div style="margin-bottom: 7px;" class="text-center">
{%= frappe.boot.letter_heads[frappe.get_doc(":Company", filters.company).default_letter_head || frappe.defaults.get_default("letter_head")] %}
</div>
<h2 class="text-center">{%= __(report.report_name) %}</h2>
<h4 class="text-center">{%= filters.company %}</h3>
<h4 class="text-center">{%= filters.fiscal_year %}</h3>

View File

@@ -1,5 +1,5 @@
<div style="margin-bottom: 7px;" class="text-center">
{%= frappe.boot.letter_heads[filters.letter_head || frappe.defaults.get_default("letter_head")] %}
{%= frappe.boot.letter_heads[filters.letter_head || frappe.get_doc(":Company", filters.company).default_letter_head || frappe.defaults.get_default("letter_head")] %}
</div>
<h2 class="text-center">{%= __("Statement of Account") %}</h2>
<h4 class="text-center">{%= (filters.party || filters.account) && ((filters.party || filters.account) + ", ") || "" %} {%= filters.company %}</h4>

View 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

View File

@@ -662,7 +662,7 @@ def get_advance_journal_entries(party_type, party, party_account, amount_field,
.format(order_doctype, order_condition))
reference_condition = " and (" + " or ".join(conditions) + ")" if conditions else ""
journal_entries = frappe.db.sql("""
select
"Journal Entry" as reference_type, t1.name as reference_name,
@@ -674,8 +674,7 @@ def get_advance_journal_entries(party_type, party, party_account, amount_field,
t1.name = t2.parent and t2.account = %s
and t2.party_type = %s and t2.party = %s
and t2.is_advance = 'Yes' and t1.docstatus = 1
and {1} > 0
and (ifnull(t2.reference_name, '')='' {2})
and {1} > 0 {2}
order by t1.posting_date""".format(amount_field, dr_or_cr, reference_condition),
[party_account, party_type, party] + order_list, as_dict=1)

View File

@@ -17,7 +17,8 @@ def get_filters_cond(doctype, filters, conditions):
if isinstance(f[1], basestring) and f[1][0] == '!':
flt.append([doctype, f[0], '!=', f[1][1:]])
else:
flt.append([doctype, f[0], '=', f[1]])
value = frappe.db.escape(f[1]) if isinstance(f[1], basestring) else f[1]
flt.append([doctype, f[0], '=', value])
query = DatabaseQuery(doctype)
query.filters = flt

View File

@@ -142,7 +142,7 @@ class StatusUpdater(Document):
if item['reduce_by'] > .01:
self.limits_crossed_error(args, item)
else:
elif item[args['target_ref_field']]:
self.check_overflow_with_tolerance(item, args)
def check_overflow_with_tolerance(self, item, args):

View File

@@ -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)

View File

@@ -420,8 +420,10 @@ class calculate_taxes_and_totals(object):
# NOTE:
# write_off_amount is only for POS Invoice
# total_advance is only for non POS Invoice
if self.doc.is_return:
return
if self.doc.doctype == "Sales Invoice":
self.calculate_paid_amount()
if self.doc.is_return: return
self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"])
self._set_in_company_currency(self.doc, ['write_off_amount'])
@@ -435,43 +437,46 @@ class calculate_taxes_and_totals(object):
- flt(self.doc.base_write_off_amount), self.doc.precision("grand_total"))
if self.doc.doctype == "Sales Invoice":
self.calculate_paid_amount()
self.doc.round_floats_in(self.doc, ["paid_amount"])
paid_amount = self.doc.paid_amount \
if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount
change_amount = self.doc.change_amount \
if self.doc.party_account_currency == self.doc.currency else self.doc.base_change_amount
self.calculate_write_off_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"))
flt(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'):
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
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 calculate_change_amount(self):
self.doc.change_amount = 0.0
self.doc.base_change_amount = 0.0
if self.doc.paid_amount > self.doc.grand_total:
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.base_change_amount = flt(self.doc.change_amount * self.doc.conversion_rate,
self.doc.precision("base_change_amount"))
self.doc.base_change_amount = flt(self.doc.base_paid_amount - self.doc.base_grand_total +
self.doc.base_write_off_amount, self.doc.precision("base_change_amount"))
def calculate_write_off_amount(self):
if flt(self.doc.change_amount) > 0:
self.doc.write_off_amount = self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount
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"))

View File

@@ -39,6 +39,7 @@ def validate_filters(filters):
frappe.throw(_("'Based On' and 'Group By' can not be same"))
def get_data(filters, conditions):
data = []
inc, cond= '',''
query_details = conditions["based_on_select"] + conditions["period_wise_select"]
@@ -49,6 +50,9 @@ def get_data(filters, conditions):
if conditions["based_on_select"] in ["t1.project,", "t2.project,"]:
cond = 'and '+ conditions["based_on_select"][:-1] +' IS Not NULL'
if conditions.get('trans') in ['Sales Order', 'Purchase Order']:
cond += "and t1.status != 'Closed'"
year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
filters.get('fiscal_year'), ["year_start_date", "year_end_date"])
@@ -85,10 +89,10 @@ def get_data(filters, conditions):
#to get distinct value of col specified by group_by in filter
row = frappe.db.sql("""select DISTINCT(%s) from `tab%s` t1, `tab%s Item` t2 %s
where t2.parent = t1.name and t1.company = %s and %s between %s and %s
and t1.docstatus = 1 and %s = %s %s
and t1.docstatus = 1 and %s = %s %s %s
""" %
(sel_col, conditions["trans"], conditions["trans"], conditions["addl_tables"],
"%s", posting_date, "%s", "%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond")),
"%s", posting_date, "%s", "%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond"), cond),
(filters.get("company"), year_start_date, year_end_date, data1[d][0]), as_list=1)
for i in range(len(row)):
@@ -97,11 +101,11 @@ def get_data(filters, conditions):
#get data for group_by filter
row1 = frappe.db.sql(""" select %s , %s from `tab%s` t1, `tab%s Item` t2 %s
where t2.parent = t1.name and t1.company = %s and %s between %s and %s
and t1.docstatus = 1 and %s = %s and %s = %s %s
and t1.docstatus = 1 and %s = %s and %s = %s %s %s
""" %
(sel_col, conditions["period_wise_select"], conditions["trans"],
conditions["trans"], conditions["addl_tables"], "%s", posting_date, "%s","%s", sel_col,
"%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond")),
"%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond"), cond),
(filters.get("company"), year_start_date, year_end_date, row[i][0],
data1[d][0]), as_list=1)

View File

@@ -57,6 +57,8 @@ class ProcessPayroll(Document):
Creates salary slip for selected employees if already not created
"""
self.check_permission('write')
emp_list = self.get_emp_list()
ss_list = []
for emp in emp_list:
@@ -102,6 +104,8 @@ class ProcessPayroll(Document):
"""
Submit all salary slips based on selected criteria
"""
self.check_permission('write')
ss_list = self.get_sal_slip_list()
not_submitted_ss = []
for ss in ss_list:
@@ -159,6 +163,8 @@ class ProcessPayroll(Document):
def make_journal_entry(self, salary_account = None):
self.check_permission('write')
amount = self.get_total_salary()
default_bank_account = frappe.db.get_value("Company", self.company,
"default_bank_account")

View File

@@ -58,7 +58,7 @@ class MaintenanceSchedule(TransactionBase):
if no_email_sp:
frappe.msgprint(
frappe._("Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}").format(
self.owner, "<br>"+no_email_sp.join("<br>")
self.owner, "<br>" + "<br>".join(no_email_sp)
))
scheduled_date = frappe.db.sql("""select scheduled_date from
@@ -187,14 +187,17 @@ class MaintenanceSchedule(TransactionBase):
if not sr_details:
frappe.throw(_("Serial No {0} not found").format(serial_no))
if sr_details.warranty_expiry_date and sr_details.warranty_expiry_date>=amc_start_date:
throw(_("Serial No {0} is under warranty upto {1}").format(serial_no, sr_details.warranty_expiry_date))
if sr_details.warranty_expiry_date \
and getdate(sr_details.warranty_expiry_date) >= getdate(amc_start_date):
throw(_("Serial No {0} is under warranty upto {1}")
.format(serial_no, sr_details.warranty_expiry_date))
if sr_details.amc_expiry_date and sr_details.amc_expiry_date >= amc_start_date:
throw(_("Serial No {0} is under maintenance contract upto {1}").format(serial_no, sr_details.amc_start_date))
if sr_details.amc_expiry_date and getdate(sr_details.amc_expiry_date) >= getdate(amc_start_date):
throw(_("Serial No {0} is under maintenance contract upto {1}")
.format(serial_no, sr_details.amc_start_date))
if not sr_details.warehouse and sr_details.delivery_date and \
sr_details.delivery_date >= amc_start_date:
getdate(sr_details.delivery_date) >= getdate(amc_start_date):
throw(_("Maintenance start date can not be before delivery date for Serial No {0}")
.format(serial_no))

View File

@@ -2,13 +2,9 @@
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
class Operation(Document):
def calculate_op_cost(self):
if self.hour_rate and self.time_in_mins:
self.operating_cost = flt(self.hour_rate) * flt(self.time_in_mins) / 60.0
else :
self.operating_cost = 0
def validate(self):
if not self.description:
self.description = self.name

View File

@@ -174,7 +174,8 @@ erpnext.production_order = {
var company_filter = function(doc) {
return {
filters: {
'company': frm.doc.company
'company': frm.doc.company,
'is_group': 0
}
}
}

View File

@@ -58,7 +58,7 @@
"print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -85,7 +85,7 @@
"print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 1,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -539,7 +539,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2016-07-11 03:28:04.235889",
"modified": "2016-08-22 03:41:42.356833",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Order Operation",

View File

@@ -9,7 +9,7 @@ erpnext.patches.v4_0.move_warehouse_user_to_restrictions
erpnext.patches.v4_0.global_defaults_to_system_settings
erpnext.patches.v4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
execute:frappe.reload_doc('stock', 'doctype', 'warehouse')
execute:frappe.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-29
execute:frappe.reload_doc('accounts', 'doctype', 'sales_invoice') # 2016-08-31
execute:frappe.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-29
execute:frappe.reload_doc('selling', 'doctype', 'quotation') # 2014-01-29
execute:frappe.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-29
@@ -276,6 +276,7 @@ execute:frappe.db.sql('update tabQuotation set status="Cancelled" where docstatu
execute:frappe.rename_doc("DocType", "Payments", "Sales Invoice Payment", force=True)
erpnext.patches.v7_0.update_mins_to_first_response
erpnext.patches.v6_20x.repost_valuation_rate_for_negative_inventory
erpnext.patches.v7_0.migrate_mode_of_payments_v6_to_v7
erpnext.patches.v7_0.system_settings_setup_complete
erpnext.patches.v7_0.set_naming_series_for_timesheet #2016-07-27
execute:frappe.reload_doc('projects', 'doctype', 'project')
@@ -310,4 +311,8 @@ erpnext.patches.v7_0.set_material_request_type_in_item
erpnext.patches.v7_0.rename_examination_to_assessment
erpnext.patches.v7_0.set_portal_settings
erpnext.patches.v7_0.repost_future_gle_for_purchase_invoice
erpnext.patches.v7_0.fix_duplicate_icons
erpnext.patches.v7_0.fix_duplicate_icons
erpnext.patches.v7_0.repost_gle_for_pos_sales_return
erpnext.patches.v7_0.update_missing_employee_in_timesheet
erpnext.patches.v7_0.update_status_for_timesheet
erpnext.patches.v7_0.set_party_name_in_payment_entry

View File

@@ -4,8 +4,10 @@ from erpnext.manufacturing.doctype.production_order.production_order \
def execute():
frappe.reload_doc('projects', 'doctype', 'timesheet')
if not frappe.db.table_exists("Time Log"):
return
for data in frappe.get_all('Time Log', fields=["*"], filters = [["docstatus", "<", "2"]]):
for data in frappe.db.sql("select * from `tabTime Log` where where docstatus < 2", as_dict=1):
if data.task:
company = frappe.db.get_value("Task", data.task, "company")
elif data.production_order:
@@ -16,16 +18,25 @@ def execute():
time_sheet = make_timesheet(data.production_order)
args = get_timelog_data(data)
add_timesheet_detail(time_sheet, args)
time_sheet.docstatus = data.docstatus
time_sheet.employee = data.employee
time_sheet.note = data.note
time_sheet.company = company
time_sheet.set_status()
time_sheet.set_dates()
time_sheet.update_cost()
time_sheet.calculate_total_amounts()
time_sheet.flags.ignore_validate = True
time_sheet.save(ignore_permissions=True)
# To ignore validate_mandatory_fields function
if data.docstatus == 1:
time_sheet.db_set("docstatus", 1)
for d in time_sheet.get("time_logs"):
d.db_set("docstatus", 1)
time_sheet.update_production_order(time_sheet.name)
time_sheet.update_task_and_project()
def get_timelog_data(data):
return {
'billable': data.billable,

View File

@@ -1,3 +1,5 @@
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.utils import cint

View File

@@ -0,0 +1,38 @@
from __future__ import unicode_literals
import frappe
def execute():
frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet')
frappe.reload_doc('accounts', 'doctype', 'sales_invoice_payment')
frappe.reload_doc('accounts', 'doctype', 'mode_of_payment')
count = 0
for data in frappe.db.sql("""select name, mode_of_payment, cash_bank_account, paid_amount, company
from `tabSales Invoice` si
where si.is_pos = 1 and si.docstatus < 2
and si.cash_bank_account is not null and si.cash_bank_account != ''
and not exists(select name from `tabSales Invoice Payment` where parent=si.name)""", as_dict=1):
if not data.mode_of_payment and not frappe.db.exists("Mode of Payment", "Cash"):
mop = frappe.new_doc("Mode of Payment")
mop.mode_of_payment = "Cash"
mop.type = "Cash"
mop.save()
si_doc = frappe.get_doc('Sales Invoice', data.name)
row = si_doc.append('payments', {
'mode_of_payment': data.mode_of_payment or 'Cash',
'account': data.cash_bank_account,
'type': frappe.db.get_value('Mode of Payment', data.mode_of_payment, 'type') or 'Cash',
'amount': data.paid_amount
})
row.db_update()
si_doc.set_paid_amount()
si_doc.db_set("paid_amount", si_doc.paid_amount)
si_doc.db_set("base_paid_amount", si_doc.base_paid_amount)
count +=1
if count % 200 == 0:
frappe.db.commit()

View File

@@ -9,12 +9,13 @@ def execute():
frappe.reload_doc('website', 'doctype', 'portal_menu_item')
frappe.reload_doc('buying', 'doctype', 'request_for_quotation')
if 'schools' in frappe.get_installed_apps():
if frappe.db.exists("Module Def", "Academics") \
and frappe.db.get_value("Module Def", "Academics", "app_name") == "schools":
frappe.db.sql("""delete from `tabDesktop Icon`""")
if not frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Academics'):
frappe.rename_doc("Module Def", "Academics", "Schools")
remove_from_installed_apps("schools")
def reload_doctypes_for_schools_icons():

View File

@@ -9,6 +9,8 @@ from erpnext.controllers.stock_controller import get_warehouse_account, update_g
def execute():
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
return
frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
frappe.reload_doctype("Purchase Invoice")
wh_account = get_warehouse_account()

View File

@@ -0,0 +1,24 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from frappe.utils import cint, flt
def execute():
frappe.reload_doctype("Sales Invoice")
for si in frappe.get_all("Sales Invoice", fields = ["name"],
filters={"docstatus": 1, "is_pos": 1, "is_return": 1}):
si_doc = frappe.get_doc("Sales Invoice", si.name)
if len(si_doc.payments) > 0:
si_doc.set_paid_amount()
si_doc.flags.ignore_validate_update_after_submit = True
si_doc.save()
if si_doc.grand_total <= si_doc.paid_amount and si_doc.paid_amount < 0:
delete_gle_for_voucher(si_doc.name)
si_doc.run_method("make_gl_entries")
def delete_gle_for_voucher(voucher_no):
frappe.db.sql("""delete from `tabGL Entry` where voucher_no = %(voucher_no)s""",
{'voucher_no': voucher_no})

View File

@@ -0,0 +1,20 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
def execute():
customers = frappe._dict(frappe.db.sql("select name, customer_name from tabCustomer"))
suppliers = frappe._dict(frappe.db.sql("select name, supplier_name from tabSupplier"))
frappe.reload_doc('accounts', 'doctype', 'payment_entry')
pe_list = frappe.db.sql("""select name, party_type, party from `tabPayment Entry`
where party is not null and party != ''""", as_dict=1)
for pe in pe_list:
party_name = customers.get(pe.party) if pe.party_type=="Customer" else suppliers.get(pe.party)
frappe.db.set_value("Payment Entry", pe.name, "party_name", party_name, update_modified=False)

View File

@@ -9,7 +9,8 @@ def execute():
return
for expense_claim_type in frappe.get_all("Expense Claim Type", fields=["name", "default_account"]):
if expense_claim_type.default_account:
if expense_claim_type.default_account \
and frappe.db.exists("Account", expense_claim_type.default_account):
doc = frappe.get_doc("Expense Claim Type", expense_claim_type.name)
doc.append("accounts", {
"company": frappe.db.get_value("Account", expense_claim_type.default_account, "company"),

View File

@@ -0,0 +1,20 @@
from __future__ import unicode_literals
import frappe
def execute():
if frappe.db.table_exists("Time Log") and "employee" in frappe.db.get_table_columns("Time Log"):
timesheet = frappe.db.sql("""select tl.employee as employee, ts.name as name,
tl.modified as modified, tl.modified_by as modified_by, tl.creation as creation, tl.owner as owner
from
`tabTimesheet` ts, `tabTimesheet Detail` tsd, `tabTime Log` tl
where
tsd.parent = ts.name and tl.from_time = tsd.from_time and tl.to_time = tsd.to_time
and tl.hours = tsd.hours and tl.billing_rate = tsd.billing_rate and tsd.idx=1
and tl.docstatus < 2 and (ts.employee = '' or ts.employee is null)""", as_dict=1)
for data in timesheet:
ts_doc = frappe.get_doc('Timesheet', data.name)
if len(ts_doc.time_logs) == 1:
frappe.db.sql(""" update `tabTimesheet` set creation = %(creation)s,
owner = %(owner)s, modified = %(modified)s, modified_by = %(modified_by)s,
employee = %(employee)s where name = %(name)s""", data)

View File

@@ -0,0 +1,11 @@
from __future__ import unicode_literals
import frappe
def execute():
frappe.db.sql("""update
`tabTimesheet` as ts,
(
select min(from_time)as from_time, max(to_time) as to_time, parent from `tabTimesheet Detail` group by parent
) as tsd
set ts.status = 'Submitted', ts.start_date = tsd.from_time, ts.end_date = tsd.to_time
where tsd.parent = ts.name and ts.status = 'Draft' and ts.docstatus =1""")

View File

@@ -1,236 +1,262 @@
{
"allow_copy": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "",
"beta": 1,
"creation": "2016-04-22 05:27:52.109319",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Setup",
"editable_grid": 0,
"allow_copy": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "",
"beta": 1,
"creation": "2016-04-22 05:27:52.109319",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Setup",
"editable_grid": 0,
"fields": [
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "title",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "TItle",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "title",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "TItle",
"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,
"description": "Company Tagline for website homepage",
"fieldname": "tag_line",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Tag Line",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"description": "Company Tagline for website homepage",
"fieldname": "tag_line",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Tag Line",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"description": "Company Description for website homepage",
"fieldname": "description",
"fieldtype": "Text",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Description",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"description": "Company Description for website homepage",
"fieldname": "description",
"fieldtype": "Text",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Description",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "products_section",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Products",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "products_section",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Products",
"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,
"description": "Products to be shown on website homepage",
"fieldname": "products",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Products",
"length": 0,
"no_copy": 0,
"options": "Homepage Featured Product",
"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,
"default": "/products",
"fieldname": "products_url",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "URL for \"All Products\"",
"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,
"description": "Products to be shown on website homepage",
"fieldname": "products",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Products",
"length": 0,
"no_copy": 0,
"options": "Homepage Featured Product",
"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,
"width": "40px"
}
],
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"in_dialog": 0,
"is_submittable": 0,
"issingle": 1,
"istable": 0,
"max_attachments": 0,
"modified": "2016-08-09 05:01:30.287861",
"modified_by": "Administrator",
"module": "Portal",
"name": "Homepage",
"name_case": "",
"owner": "Administrator",
],
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"in_dialog": 0,
"is_submittable": 0,
"issingle": 1,
"istable": 0,
"max_attachments": 0,
"modified": "2016-08-29 01:28:00.961623",
"modified_by": "Administrator",
"module": "Portal",
"name": "Homepage",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 0,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 0,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
},
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 0,
"role": "Administrator",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 0,
"role": "Administrator",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "company",
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "company",
"track_seen": 0
}

View File

@@ -5,6 +5,7 @@
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe.website.utils import delete_page_cache
class Homepage(Document):
def validate(self):
@@ -12,6 +13,7 @@ class Homepage(Document):
self.setup_items()
if not self.description:
self.description = frappe._("This is an example website auto-generated from ERPNext")
delete_page_cache('home')
def setup_items(self):
for d in frappe.get_all('Item', fields=['name', 'item_name', 'description', 'image'],

View File

@@ -16,6 +16,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "naming_series",
"fieldtype": "Select",
"hidden": 0,
@@ -41,6 +42,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -67,6 +69,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"description": "",
"fieldname": "sales_invoice",
@@ -94,6 +97,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"hidden": 0,
@@ -117,6 +121,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"fieldname": "salary_slip",
"fieldtype": "Link",
@@ -144,6 +149,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Draft",
"fieldname": "status",
"fieldtype": "Select",
@@ -171,7 +177,8 @@
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": "",
"depends_on": "eval:!doc.production_order",
"columns": 0,
"depends_on": "eval:!doc.production_order || doc.docstatus == 1",
"fieldname": "employee_detail",
"fieldtype": "Section Break",
"hidden": 0,
@@ -197,6 +204,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
"description": "List of employee which has \"Salary Slip Based on Timesheet\" is enabled in salary structure.",
"fieldname": "employee",
@@ -225,6 +233,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "employee",
"fieldname": "employee_name",
"fieldtype": "Data",
@@ -252,6 +261,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "user",
"fieldtype": "Link",
"hidden": 0,
@@ -278,6 +288,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_9",
"fieldtype": "Column Break",
"hidden": 0,
@@ -302,6 +313,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "start_date",
"fieldtype": "Date",
"hidden": 0,
@@ -327,6 +339,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "end_date",
"fieldtype": "Date",
"hidden": 0,
@@ -353,6 +366,7 @@
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "production_order",
"fieldname": "production_detail",
"fieldtype": "Section Break",
@@ -379,6 +393,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "production_order",
"fieldtype": "Link",
"hidden": 0,
@@ -405,6 +420,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_5",
"fieldtype": "Section Break",
"hidden": 0,
@@ -428,6 +444,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "time_logs",
"fieldtype": "Table",
"hidden": 0,
@@ -453,6 +470,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_8",
"fieldtype": "Section Break",
"hidden": 0,
@@ -477,6 +495,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"description": "",
"fieldname": "total_hours",
@@ -503,6 +522,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_10",
"fieldtype": "Column Break",
"hidden": 0,
@@ -527,6 +547,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0",
"depends_on": "",
"description": "",
@@ -555,6 +576,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "total_costing_amount",
"fieldtype": "Float",
"hidden": 0,
@@ -580,6 +602,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_18",
"fieldtype": "Section Break",
"hidden": 0,
@@ -604,6 +627,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "note",
"fieldtype": "Text Editor",
"hidden": 0,
@@ -629,6 +653,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 0,
@@ -662,7 +687,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-08-01 08:54:31.840829",
"modified": "2016-09-01 11:33:38.110421",
"modified_by": "Administrator",
"module": "Projects",
"name": "Timesheet",

View File

@@ -12,8 +12,9 @@ def execute(filters=None):
filters["from_time"] = "00:00:00"
filters["to_time"] = "24:00:00"
columns = [_("Timesheet") + ":Link/Timesheet:120", _("Employee") + "::150", _("From Datetime") + "::140",
_("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
columns = [_("Timesheet") + ":Link/Timesheet:120", _("Employee") + "::150", _("Employee Name") + "::150",
_("From Datetime") + "::140", _("To Datetime") + "::140", _("Hours") + "::70",
_("Activity Type") + "::120", _("Task") + ":Link/Task:150",
_("Project") + ":Link/Project:120", _("Status") + "::70"]
conditions = "ts.docstatus = 1"
@@ -27,7 +28,8 @@ def execute(filters=None):
return columns, data
def get_data(conditions, filters):
time_sheet = frappe.db.sql(""" select ts.name, ts.employee, tsd.from_time, tsd.to_time, tsd.hours,
time_sheet = frappe.db.sql(""" select ts.name, ts.employee, ts.employee_name,
tsd.from_time, tsd.to_time, tsd.hours,
tsd.activity_type, tsd.task, tsd.project, ts.status from `tabTimesheet Detail` tsd,
`tabTimesheet` ts where ts.name = tsd.parent and %s order by ts.name"""%(conditions), filters, as_list=1)

View File

@@ -72,7 +72,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
},
validate_conversion_rate: function() {
this.frm.doc.conversion_rate = flt(this.frm.doc.conversion_rate, precision("conversion_rate"));
this.frm.doc.conversion_rate = flt(this.frm.doc.conversion_rate, (cur_frm) ? precision("conversion_rate") : 9);
var conversion_rate_label = frappe.meta.get_label(this.frm.doc.doctype, "conversion_rate",
this.frm.doc.name);
var company_currency = this.frm.doc.currency || this.get_company_currency();
@@ -532,6 +532,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
// NOTE:
// paid_amount and write_off_amount is only for POS Invoice
// total_advance is only for non POS Invoice
if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.is_return){
this.calculate_paid_amount()
}
if(this.frm.doc.is_return || this.frm.doc.docstatus > 0) return;
frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount"]);
@@ -567,8 +572,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
var paid_amount = (this.frm.doc.party_account_currency == this.frm.doc.currency) ?
this.frm.doc.paid_amount : this.frm.doc.base_paid_amount;
this.frm.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) +
flt(this.frm.doc.change_amount), precision("outstanding_amount"));
var change_amount = (this.frm.doc.party_account_currency == this.frm.doc.currency) ?
this.frm.doc.change_amount : this.frm.doc.base_change_amount;
this.frm.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) +
flt(this.frm.doc.change_amount * this.frm.doc.conversion_rate), precision("outstanding_amount"));
} else if(this.frm.doc.doctype == "Purchase Invoice") {
this.frm.doc.outstanding_amount = flt(total_amount_to_pay, precision("outstanding_amount"));
@@ -580,8 +588,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
payment_status = true;
if(this.frm.doc.is_pos && (update_paid_amount===undefined || update_paid_amount)){
$.each(this.frm.doc['payments'] || [], function(index, data){
if(data.type == "Cash" && payment_status) {
data.amount = total_amount_to_pay;
if(data.type == "Cash" && payment_status && total_amount_to_pay > 0) {
data.base_amount = flt(total_amount_to_pay, precision("base_amount"));
data.amount = flt(total_amount_to_pay / me.frm.doc.conversion_rate, precision("amount"));
payment_status = false;
}else if(me.frm.doc.paid_amount){
data.amount = 0.0;
@@ -594,11 +603,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
var me = this;
var paid_amount = base_paid_amount = 0.0;
$.each(this.frm.doc['payments'] || [], function(index, data){
if(data.amount > -1){
data.base_amount = flt(data.amount * me.frm.doc.conversion_rate);
paid_amount += data.amount;
base_paid_amount += data.base_amount;
}
data.base_amount = flt(data.amount * me.frm.doc.conversion_rate, precision("base_amount"));
paid_amount += data.amount;
base_paid_amount += data.base_amount;
})
this.frm.doc.paid_amount = flt(paid_amount, precision("paid_amount"));
@@ -607,13 +614,12 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
calculate_change_amount: function(){
this.frm.doc.change_amount = 0.0;
if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total +
if(this.frm.doc.paid_amount > this.frm.doc.grand_total && !this.frm.doc.is_return){
this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total +
this.frm.doc.write_off_amount, precision("change_amount"));
this.frm.doc.base_change_amount = flt(this.frm.doc.base_paid_amount - this.frm.doc.base_grand_total +
this.frm.doc.base_write_off_amount, precision("base_change_amount"));
}
this.frm.doc.base_change_amount = flt(this.frm.doc.change_amount * this.frm.doc.conversion_rate,
precision("base_change_amount"));
},
calculate_write_off_amount: function(){

View File

@@ -2,7 +2,7 @@
<div class="col-xs-6" style="padding:20px">{{mode_of_payment}}</div>
<div class="col-xs-6">
<div class="input-group">
<input disabled class="form-control text-right amount" idx="{{idx}}" type="text" value="{{format_number(amount, 2)}}">
<input disabled class="form-control text-right amount" idx="{{idx}}" type="text" value="{%= format_currency(amount, currency) %}">
<span class="input-group-btn">
<button type="button" class="btn btn-default clr" idx="{{idx}}" style="border:1px solid #d1d8dd">C</button>
</span>

View File

@@ -84,8 +84,8 @@ erpnext.payments = erpnext.stock.StockController.extend({
this.payment_val = 0.0
if(this.frm.doc.outstanding_amount > 0 && flt(this.selected_mode.val()) == 0.0){
//When user first time click on row
this.payment_val = flt(this.frm.doc.outstanding_amount)
this.selected_mode.val(format_number(this.payment_val, 2));
this.payment_val = flt(this.frm.doc.outstanding_amount / this.frm.doc.conversion_rate, precision("outstanding_amount"))
this.selected_mode.val(format_currency(this.payment_val, this.frm.doc.currency));
this.update_payment_amount()
}else if(flt(this.selected_mode.val()) > 0){
//If user click on existing row which has value
@@ -112,15 +112,15 @@ erpnext.payments = erpnext.stock.StockController.extend({
$(this.$body).find('.form-control').click(function(){
me.idx = $(this).attr("idx");
me.set_outstanding_amount();
me.update_paid_amount();
me.update_paid_amount(true);
})
$(this.$body).find('.write_off_amount').change(function(){
me.write_off_amount(flt($(this).val()));
me.write_off_amount(flt($(this).val()), precision("write_off_amount"));
})
$(this.$body).find('.change_amount').change(function(){
me.change_amount(flt($(this).val()));
me.change_amount(flt($(this).val()), precision("change_amount"));
})
},
@@ -137,14 +137,14 @@ erpnext.payments = erpnext.stock.StockController.extend({
var me = this;
$(this.$body).find('.pos-keyboard-key').click(function(){
me.payment_val += $(this).text();
me.selected_mode.val(format_number(me.payment_val, 2))
me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency))
me.idx = me.selected_mode.attr("idx")
me.selected_mode.change()
me.update_paid_amount()
})
$(this.$body).find('.delete-btn').click(function(){
me.payment_val = cstr(flt(me.selected_mode.val())).slice(0, -1);
me.selected_mode.val(format_number(me.payment_val, 2));
me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency));
me.idx = me.selected_mode.attr("idx")
me.update_paid_amount();
})
@@ -155,7 +155,7 @@ erpnext.payments = erpnext.stock.StockController.extend({
var me = this;
this.selected_mode.change(function(){
me.payment_val = flt($(this).val()) || 0.0;
me.selected_mode.val(format_number(me.payment_val, 2))
me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency))
me.idx = me.selected_mode.attr("idx")
me.update_payment_amount()
})
@@ -177,32 +177,30 @@ erpnext.payments = erpnext.stock.StockController.extend({
write_off_amount: function(write_off_amount) {
var me = this;
if(this.frm.doc.paid_amount > 0){
this.frm.doc.write_off_amount = write_off_amount;
this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate,
precision("base_write_off_amount"));
this.calculate_outstanding_amount(false)
this.show_amounts()
}
this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount"));
this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate,
precision("base_write_off_amount"));
this.calculate_outstanding_amount(false)
this.show_amounts()
},
change_amount: function(change_amount) {
var me = this;
this.frm.doc.change_amount = change_amount;
this.frm.doc.change_amount = flt(change_amount, precision("change_amount"));
this.calculate_write_off_amount()
this.show_amounts()
},
update_paid_amount: function() {
update_paid_amount: function(update_write_off) {
var me = this;
if(in_list(['change_amount', 'write_off_amount'], this.idx)){
value = flt(me.selected_mode.val(), 2)
value = me.selected_mode.val();
if(me.idx == 'change_amount'){
me.change_amount(value)
} else{
if(value == 0) {
value = me.frm.doc.outstanding_amount;
if(flt(value) == 0 && update_write_off && me.frm.doc.outstanding_amount > 0) {
value = flt(me.frm.doc.outstanding_amount / me.frm.doc.conversion_rate, precision(me.idx));
}
me.write_off_amount(value)
}
@@ -226,10 +224,10 @@ erpnext.payments = erpnext.stock.StockController.extend({
show_amounts: function(){
var me = this;
$(this.$body).find(".write_off_amount").val(format_number(this.frm.doc.write_off_amount, 2));
$(this.$body).find(".write_off_amount").val(format_currency(this.frm.doc.write_off_amount, this.frm.doc.currency));
$(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency));
$(this.$body).find('.change_amount').val(format_number(this.frm.doc.change_amount, 2))
$(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, this.frm.doc.currency))
$(this.$body).find('.change_amount').val(format_currency(this.frm.doc.change_amount, this.frm.doc.currency))
$(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, frappe.get_doc(":Company", this.frm.doc.company).default_currency))
this.update_invoice();
}
})

View File

@@ -22,12 +22,21 @@ def get_notification_config():
"docstatus": ("<", 2)
},
"Journal Entry": {"docstatus": 0},
"Sales Invoice": { "outstanding_amount": (">", 0), "docstatus": ("<", 2) },
"Purchase Invoice": {"docstatus": 0},
"Sales Invoice": {
"outstanding_amount": (">", 0),
"docstatus": ("<", 2)
},
"Purchase Invoice": {
"outstanding_amount": (">", 0),
"docstatus": ("<", 2)
},
"Leave Application": {"status": "Open"},
"Expense Claim": {"approval_status": "Draft"},
"Job Applicant": {"status": "Open"},
"Delivery Note": {"docstatus": 0},
"Delivery Note": {
"status": ("not in", ("Completed", "Closed")),
"docstatus": ("<", 2)
},
"Stock Entry": {"docstatus": 0},
"Material Request": {
"docstatus": ("<", 2),
@@ -40,7 +49,10 @@ def get_notification_config():
"status": ("not in", ("Completed", "Closed")),
"docstatus": ("<", 2)
},
"Purchase Receipt": {"docstatus": 0},
"Purchase Receipt": {
"status": ("not in", ("Completed", "Closed")),
"docstatus": ("<", 2)
},
"Production Order": { "status": ("in", ("Draft", "Not Started", "In Process")) },
"BOM": {"docstatus": 0},
"Timesheet": {"status": "Draft"}

View File

@@ -12,6 +12,9 @@ frappe.ui.form.on('Delivery Note', 'onload', function(frm) {
return (doc.docstatus==1 || doc.qty<=doc.actual_qty) ? "green" : "orange"
})
erpnext.queries.setup_queries(frm, "Warehouse", function() {
return erpnext.queries.warehouse(frm.doc);
});
})
erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend({

View File

@@ -84,7 +84,7 @@ class LandedCostVoucher(Document):
self.update_landed_cost()
def update_landed_cost(self):
for d in self.get("items"):
for d in self.get("purchase_receipts"):
doc = frappe.get_doc(d.receipt_document_type, d.receipt_document)
# set landed cost voucher amount in pr item
@@ -103,7 +103,7 @@ class LandedCostVoucher(Document):
# update stock & gl entries for cancelled state of PR
doc.docstatus = 2
doc.update_stock_ledger(allow_negative_stock=True, via_landed_cost_voucher=True)
doc.make_gl_entries_on_cancel()
doc.make_gl_entries_on_cancel(repost_future_gle=False)
# update stock & gl entries for submit state of PR

View File

@@ -25,14 +25,20 @@ frappe.ui.form.on("Purchase Receipt", {
$.each(["warehouse", "rejected_warehouse"], function(i, field) {
frm.set_query(field, "items", function() {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
})
})
frm.set_query("supplier_warehouse", function() {
return {
filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
filters: [
["Warehouse", "company", "in", ["", cstr(frm.doc.company)]],
["Warehouse", "is_group", "=", 0]
]
}
})
}

View File

@@ -44,7 +44,7 @@ erpnext.SupportAnalytics = frappe.views.GridReportWithPlot.extend({
var std_columns = [
{id: "_check", name: __("Plot"), field: "_check", width: 30,
formatter: this.check_formatter},
{id: "status", name: __("Status"), field: "status", width: 100},
{id: "name", name: __("Status"), field: "name", width: 100},
];
this.make_date_range_columns();
this.columns = std_columns.concat(this.columns);
@@ -54,14 +54,14 @@ erpnext.SupportAnalytics = frappe.views.GridReportWithPlot.extend({
// add Opening, Closing, Totals rows
// if filtered by account and / or voucher
var me = this;
var total_tickets = {status:"All Tickets", "id": "all-tickets",
var total_tickets = {name:"All Tickets", "id": "all-tickets",
checked:true};
var days_to_close = {status:"Days to Close", "id":"days-to-close",
var days_to_close = {name:"Days to Close", "id":"days-to-close",
checked:false};
var total_closed = {};
var hours_to_close = {status:"Hours to Close", "id":"hours-to-close",
var hours_to_close = {name:"Hours to Close", "id":"hours-to-close",
checked:false};
var hours_to_respond = {status:"Hours to Respond", "id":"hours-to-respond",
var hours_to_respond = {name:"Hours to Respond", "id":"hours-to-respond",
checked:false};
var total_responded = {};

View File

@@ -30,9 +30,10 @@ rfq = Class.extend({
var me = this;
$('.rfq-items').on("change", ".rfq-qty", function(){
me.idx = parseFloat($(this).attr('data-idx'));
me.qty = parseFloat($(this).val());
me.qty = parseFloat($(this).val()) || 0;
me.rate = parseFloat($(repl('.rfq-rate[data-idx=%(idx)s]',{'idx': me.idx})).val());
me.update_qty_rate();
$(this).val(format_number(me.qty, 2));
})
},
@@ -40,9 +41,10 @@ rfq = Class.extend({
var me = this;
$(".rfq-items").on("change", ".rfq-rate", function(){
me.idx = parseFloat($(this).attr('data-idx'));
me.rate = parseFloat($(this).val());
me.rate = parseFloat($(this).val()) || 0;
me.qty = parseFloat($(repl('.rfq-qty[data-idx=%(idx)s]',{'idx': me.idx})).val());
me.update_qty_rate();
$(this).val(format_number(me.rate, 2));
})
},

View File

@@ -3,26 +3,26 @@
{% for d in doc.items %}
<div class="rfq-item">
<div class="row">
<div class="col-sm-6 col-xs-6" style="margin-bottom: 10px;margin-top: 5px;">
<div class="col-sm-5 col-xs-12" style="margin-bottom: 10px;margin-top: 5px;">
{{ item_name_and_description(d, doc) }}
</div>
<!-- <div class="col-sm-2 col-xs-2" style="margin-bottom: 10px;">
<textarea type="text" style="margin-top: 5px;" class="input-with-feedback form-control rfq-offer_detail" ></textarea>
</div> -->
<div class="col-sm-2 col-xs-2 text-right">
<input type="number" class="form-control text-right rfq-qty" style="margin-top: 5px; max-width: 70px;display: inline-block"
<div class="col-sm-2 col-xs-4 text-right">
<input type="text" class="form-control text-right rfq-qty" style="margin-top: 5px;display: inline-block"
value = "{{ d.get_formatted('qty') }}"
data-idx="{{ d.idx }}">
<p class="text-muted small" style="margin-top: 10px;">
{{_("UOM") + ": "+ d.uom}}
{{_("UOM") + ":"+ d.uom}}
</p>
</div>
<div class="col-sm-2 col-xs-2 text-right">
{{doc.currency_symbol}} <input type="number" class="form-control text-right rfq-rate"
style="margin-top: 5px; max-width: 70px;display: inline-block" value="0.00"
<div class="col-sm-2 col-xs-4 text-right">
<input type="text" class="form-control text-right rfq-rate"
style="margin-top: 5px;display: inline-block" value="0.00"
data-idx="{{ d.idx }}">
</div>
<div class="col-sm-2 col-xs-2 text-right" style="padding-top: 9px;">
<div class="col-sm-3 col-xs-4 text-right" style="padding-top: 9px;">
{{doc.currency_symbol}} <span class="rfq-amount" data-idx="{{ d.idx }}">0.00</span>
</div>
</div>

View File

@@ -26,9 +26,8 @@
{% endfor %}
</div>
</div>
<!-- TODO: remove hardcoding of /products -->
<div class="text-center padding">
<a href="/products" class="btn btn-primary all-products">
<a href="{{ homepage.products_url or "/products" }}" class="btn btn-primary all-products">
{{ _("View All Products") }}</a></div>
</div>
{% endif %}

View File

@@ -33,16 +33,16 @@
<div id="order-container">
<div id="rfq-items">
<div class="row cart-item-header">
<div class="col-sm-6 col-xs-6">
<div class="col-sm-5 col-xs-12">
Items
</div>
<div class="col-sm-2 col-xs-2 text-right">
<div class="col-sm-2 col-xs-4 text-right">
Qty
</div>
<div class="col-sm-2 col-xs-2 text-right">
<div class="col-sm-2 col-xs-4 text-right">
Rate
</div>
<div class="col-sm-2 col-xs-2 text-right">
<div class="col-sm-3 col-xs-4 text-right">
Amount
</div>
</div>
@@ -55,8 +55,8 @@
</div>
{% if doc.items %}
<div class="row grand-total-row">
<div class="col-xs-10 text-right">{{ _("Grand Total") }}</div>
<div class="col-xs-2 text-right">
<div class="col-xs-9 text-right">{{ _("Grand Total") }}</div>
<div class="col-xs-3 text-right">
{{doc.currency_symbol}} <span class="tax-grand-total">0.0</span>
</div>
</div>