Merge branch 'develop' into new-subscription
@@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '10.1.7'
|
__version__ = '10.1.23'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@@ -17,18 +17,13 @@ frappe.ui.form.on('Account', {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
if (frm.doc.__islocal) {
|
frm.toggle_display('account_name', frm.is_new());
|
||||||
frappe.msgprint(__("Please create new account from Chart of Accounts."));
|
|
||||||
throw "cannot create";
|
|
||||||
}
|
|
||||||
|
|
||||||
frm.toggle_display('account_name', frm.doc.__islocal);
|
|
||||||
|
|
||||||
// hide fields if group
|
// hide fields if group
|
||||||
frm.toggle_display(['account_type', 'tax_rate'], cint(frm.doc.is_group) == 0);
|
frm.toggle_display(['account_type', 'tax_rate'], cint(frm.doc.is_group) == 0);
|
||||||
|
|
||||||
// disable fields
|
// disable fields
|
||||||
frm.toggle_enable(['account_name', 'is_group', 'company'], false);
|
frm.toggle_enable(['is_group', 'company'], false);
|
||||||
|
|
||||||
if (cint(frm.doc.is_group) == 0) {
|
if (cint(frm.doc.is_group) == 0) {
|
||||||
frm.toggle_display('freeze_account', frm.doc.__onload
|
frm.toggle_display('freeze_account', frm.doc.__onload
|
||||||
@@ -36,19 +31,18 @@ frappe.ui.form.on('Account', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// read-only for root accounts
|
// read-only for root accounts
|
||||||
if (!frm.doc.parent_account) {
|
if (!frm.is_new()) {
|
||||||
frm.set_read_only();
|
if (!frm.doc.parent_account) {
|
||||||
frm.set_intro(__("This is a root account and cannot be edited."));
|
frm.set_read_only();
|
||||||
} else {
|
frm.set_intro(__("This is a root account and cannot be edited."));
|
||||||
// credit days and type if customer or supplier
|
} else {
|
||||||
frm.set_intro(null);
|
// credit days and type if customer or supplier
|
||||||
frm.trigger('account_type');
|
frm.set_intro(null);
|
||||||
|
frm.trigger('account_type');
|
||||||
|
|
||||||
// show / hide convert buttons
|
// show / hide convert buttons
|
||||||
frm.trigger('add_toolbar_buttons');
|
frm.trigger('add_toolbar_buttons');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!frm.doc.__islocal) {
|
|
||||||
frm.add_custom_button(__('Update Account Number'), function () {
|
frm.add_custom_button(__('Update Account Number'), function () {
|
||||||
frm.trigger("update_account_number");
|
frm.trigger("update_account_number");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -68,6 +69,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
@@ -94,12 +96,13 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -130,6 +133,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -161,6 +165,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -193,6 +198,7 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -223,6 +229,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -253,6 +260,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -285,6 +293,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -313,6 +322,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
@@ -346,6 +356,7 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -379,6 +390,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -411,6 +423,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -444,6 +457,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -474,6 +488,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -503,6 +518,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -532,6 +548,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -561,6 +578,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -575,7 +593,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-08-22 17:39:10.711343",
|
"modified": "2018-04-04 03:23:20.011949",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Account",
|
"name": "Account",
|
||||||
|
|||||||
@@ -274,3 +274,7 @@ def get_name_with_number(new_account, account_number):
|
|||||||
if account_number and not new_account[0].isdigit():
|
if account_number and not new_account[0].isdigit():
|
||||||
new_account = account_number + " - " + new_account
|
new_account = account_number + " - " + new_account
|
||||||
return new_account
|
return new_account
|
||||||
|
|
||||||
|
|
||||||
|
def on_doctype_update():
|
||||||
|
frappe.db.add_index("Account", ["lft", "rgt"])
|
||||||
@@ -101,7 +101,7 @@ def _make_test_records(verbose):
|
|||||||
def get_inventory_account(company, warehouse=None):
|
def get_inventory_account(company, warehouse=None):
|
||||||
account = None
|
account = None
|
||||||
if warehouse:
|
if warehouse:
|
||||||
account = get_warehouse_account(warehouse, company)
|
account = get_warehouse_account(frappe.get_doc("Warehouse", warehouse))
|
||||||
else:
|
else:
|
||||||
account = get_company_default_inventory_account(company)
|
account = get_company_default_inventory_account(company)
|
||||||
|
|
||||||
|
|||||||
@@ -64,3 +64,6 @@ class CostCenter(NestedSet):
|
|||||||
if not merge:
|
if not merge:
|
||||||
frappe.db.set_value("Cost Center", newdn, "cost_center_name",
|
frappe.db.set_value("Cost Center", newdn, "cost_center_name",
|
||||||
" - ".join(newdn.split(" - ")[:-1]))
|
" - ".join(newdn.split(" - ")[:-1]))
|
||||||
|
|
||||||
|
def on_doctype_update():
|
||||||
|
frappe.db.add_index("Cost Center", ["lft", "rgt"])
|
||||||
@@ -48,5 +48,10 @@ frappe.treeview_settings["Cost Center"] = {
|
|||||||
}, __('Budget'));
|
}, __('Budget'));
|
||||||
|
|
||||||
},
|
},
|
||||||
|
onrender: function(node) {
|
||||||
|
if(node.is_root){
|
||||||
|
node.hide_add = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -676,30 +676,17 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
function(d) { return flt(d.amount) }));
|
function(d) { return flt(d.amount) }));
|
||||||
|
|
||||||
if(frm.doc.party) {
|
if(frm.doc.party) {
|
||||||
var party_amount = frm.doc.payment_type=="Receive" ?
|
if(frm.doc.payment_type == "Receive"
|
||||||
frm.doc.paid_amount : frm.doc.received_amount;
|
&& frm.doc.base_total_allocated_amount < frm.doc.base_received_amount + total_deductions
|
||||||
var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: "";
|
&& frm.doc.total_allocated_amount < frm.doc.paid_amount + (total_deductions / frm.doc.source_exchange_rate)) {
|
||||||
|
unallocated_amount = (frm.doc.base_received_amount + total_deductions
|
||||||
if (frm.doc.party_account_currency == company_currency) {
|
- frm.doc.base_total_allocated_amount) / frm.doc.source_exchange_rate;
|
||||||
if(frm.doc.payment_type == "Receive" && frm.doc.total_allocated_amount <= party_amount + total_deductions) {
|
} else if (frm.doc.payment_type == "Pay"
|
||||||
unallocated_amount = party_amount - (frm.doc.total_allocated_amount - total_deductions);
|
&& frm.doc.base_total_allocated_amount < frm.doc.base_paid_amount - total_deductions
|
||||||
} else if (frm.doc.payment_type == "Pay" && frm.doc.total_allocated_amount <= party_amount - total_deductions) {
|
&& frm.doc.total_allocated_amount < frm.doc.received_amount + (total_deductions / frm.doc.target_exchange_rate)) {
|
||||||
unallocated_amount = party_amount - (frm.doc.total_allocated_amount + total_deductions);
|
unallocated_amount = (frm.doc.base_paid_amount - (total_deductions
|
||||||
}
|
+ frm.doc.base_total_allocated_amount)) / frm.doc.target_exchange_rate;
|
||||||
} else {
|
|
||||||
if(frm.doc.payment_type == "Receive"
|
|
||||||
&& frm.doc.base_total_allocated_amount <= frm.doc.base_received_amount + total_deductions
|
|
||||||
&& frm.doc.total_allocated_amount < frm.doc.paid_amount) {
|
|
||||||
unallocated_amount = (frm.doc.base_received_amount + total_deductions
|
|
||||||
- frm.doc.base_total_allocated_amount) / frm.doc.source_exchange_rate;
|
|
||||||
} else if (frm.doc.payment_type == "Pay"
|
|
||||||
&& frm.doc.base_total_allocated_amount < frm.doc.base_paid_amount - total_deductions
|
|
||||||
&& frm.doc.total_allocated_amount < frm.doc.received_amount) {
|
|
||||||
unallocated_amount = (frm.doc.base_paid_amount - (total_deductions
|
|
||||||
+ frm.doc.base_total_allocated_amount)) / frm.doc.target_exchange_rate;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
frm.set_value("unallocated_amount", unallocated_amount);
|
frm.set_value("unallocated_amount", unallocated_amount);
|
||||||
frm.trigger("set_difference_amount");
|
frm.trigger("set_difference_amount");
|
||||||
|
|||||||
@@ -293,30 +293,18 @@ class PaymentEntry(AccountsController):
|
|||||||
|
|
||||||
def set_unallocated_amount(self):
|
def set_unallocated_amount(self):
|
||||||
self.unallocated_amount = 0
|
self.unallocated_amount = 0
|
||||||
|
|
||||||
if self.party:
|
if self.party:
|
||||||
total_deductions = sum([flt(d.amount) for d in self.get("deductions")])
|
total_deductions = sum([flt(d.amount) for d in self.get("deductions")])
|
||||||
|
if self.payment_type == "Receive" \
|
||||||
if self.party_account_currency == self.company_currency:
|
and self.base_total_allocated_amount < self.base_received_amount + total_deductions \
|
||||||
if self.payment_type == "Receive" \
|
and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate):
|
||||||
and self.total_allocated_amount <= self.paid_amount + total_deductions:
|
self.unallocated_amount = (self.base_received_amount + total_deductions -
|
||||||
self.unallocated_amount = self.paid_amount - \
|
self.base_total_allocated_amount) / self.source_exchange_rate
|
||||||
(self.total_allocated_amount - total_deductions)
|
elif self.payment_type == "Pay" \
|
||||||
elif self.payment_type == "Pay" \
|
and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \
|
||||||
and self.total_allocated_amount <= self.received_amount - total_deductions:
|
and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate):
|
||||||
self.unallocated_amount = self.received_amount - \
|
self.unallocated_amount = (self.base_paid_amount - (total_deductions +
|
||||||
(self.total_allocated_amount + total_deductions)
|
self.base_total_allocated_amount)) / self.target_exchange_rate
|
||||||
else:
|
|
||||||
if self.payment_type == "Receive" \
|
|
||||||
and self.base_total_allocated_amount <= self.base_received_amount + total_deductions \
|
|
||||||
and self.total_allocated_amount < self.paid_amount:
|
|
||||||
self.unallocated_amount = (self.base_received_amount + total_deductions -
|
|
||||||
self.base_total_allocated_amount) / self.source_exchange_rate
|
|
||||||
elif self.payment_type == "Pay" \
|
|
||||||
and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \
|
|
||||||
and self.total_allocated_amount < self.received_amount:
|
|
||||||
self.unallocated_amount = (self.base_paid_amount - (total_deductions +
|
|
||||||
self.base_total_allocated_amount)) / self.target_exchange_rate
|
|
||||||
|
|
||||||
def set_difference_amount(self):
|
def set_difference_amount(self):
|
||||||
base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate)
|
base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate)
|
||||||
@@ -781,6 +769,8 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=
|
|||||||
party_account = doc.receivable_account
|
party_account = doc.receivable_account
|
||||||
elif dt == "Employee Advance":
|
elif dt == "Employee Advance":
|
||||||
party_account = doc.advance_account
|
party_account = doc.advance_account
|
||||||
|
elif dt == "Expense Claim":
|
||||||
|
party_account = doc.payable_account
|
||||||
else:
|
else:
|
||||||
party_account = get_party_account(party_type, doc.get(party_type.lower()), doc.company)
|
party_account = get_party_account(party_type, doc.get(party_type.lower()), doc.company)
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ class PaymentRequest(Document):
|
|||||||
controller = get_payment_gateway_controller(self.payment_gateway)
|
controller = get_payment_gateway_controller(self.payment_gateway)
|
||||||
controller.validate_transaction_currency(self.currency)
|
controller.validate_transaction_currency(self.currency)
|
||||||
|
|
||||||
|
if hasattr(controller, 'validate_minimum_transaction_amount'):
|
||||||
|
controller.validate_minimum_transaction_amount(self.currency, self.grand_total)
|
||||||
|
|
||||||
return controller.get_payment_url(**{
|
return controller.get_payment_url(**{
|
||||||
"amount": flt(self.grand_total, self.precision("grand_total")),
|
"amount": flt(self.grand_total, self.precision("grand_total")),
|
||||||
"title": data.company.encode("utf-8"),
|
"title": data.company.encode("utf-8"),
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ def get_serial_no_for_item(args):
|
|||||||
"name": args.name,
|
"name": args.name,
|
||||||
"serial_no": args.serial_no
|
"serial_no": args.serial_no
|
||||||
})
|
})
|
||||||
if args.get("parenttype") in ("Sales Invoice", "Delivery Note") and args.stock_qty > 0:
|
if args.get("parenttype") in ("Sales Invoice", "Delivery Note") and flt(args.stock_qty) > 0:
|
||||||
item_details.serial_no = get_serial_no(args)
|
item_details.serial_no = get_serial_no(args)
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -74,7 +73,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -107,7 +105,6 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 1,
|
"set_only_once": 1,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -140,7 +137,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -174,7 +170,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -205,7 +200,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -238,7 +232,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -270,7 +263,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -303,7 +295,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -334,7 +325,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -364,7 +354,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -397,7 +386,6 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -430,7 +418,6 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -462,7 +449,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -494,7 +480,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -526,7 +511,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -559,7 +543,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -591,7 +574,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -623,7 +605,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -656,7 +637,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -688,7 +668,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -708,18 +687,17 @@
|
|||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Customer's Purchase Order",
|
"label": "Customer's Purchase Order",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 1,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -749,7 +727,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -774,13 +751,12 @@
|
|||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -812,7 +788,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -843,7 +818,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -873,7 +847,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -904,7 +877,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -934,7 +906,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -964,7 +935,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -995,7 +965,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1027,7 +996,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1057,7 +1025,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1089,7 +1056,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1120,7 +1086,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1152,7 +1117,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1183,7 +1147,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1215,7 +1178,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1248,7 +1210,6 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1282,7 +1243,6 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1311,7 +1271,6 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
@@ -4865,7 +4824,7 @@
|
|||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": 0,
|
"menu_index": 0,
|
||||||
"modified": "2018-03-10 07:31:12.151213",
|
"modified": "2018-03-16 15:19:54.711885",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Sales Invoice",
|
"name": "Sales Invoice",
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ class SalesInvoice(SellingController):
|
|||||||
for item in self.get("items"):
|
for item in self.get("items"):
|
||||||
if item.get('item_code'):
|
if item.get('item_code'):
|
||||||
for fname, val in get_pos_profile_item_details(pos,
|
for fname, val in get_pos_profile_item_details(pos,
|
||||||
frappe._dict(item.as_dict()), pos).items():
|
frappe._dict(item.as_dict()), pos, True).items():
|
||||||
|
|
||||||
if (not for_validate) or (for_validate and not item.get(fname)):
|
if (not for_validate) or (for_validate and not item.get(fname)):
|
||||||
item.set(fname, val)
|
item.set(fname, val)
|
||||||
|
|||||||
@@ -39,18 +39,20 @@ frappe.ui.form.on("Tax Rule", "customer", function(frm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on("Tax Rule", "supplier", function(frm) {
|
frappe.ui.form.on("Tax Rule", "supplier", function(frm) {
|
||||||
frappe.call({
|
if(frm.doc.supplier) {
|
||||||
method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details",
|
frappe.call({
|
||||||
args: {
|
method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details",
|
||||||
"party": frm.doc.supplier,
|
args: {
|
||||||
"party_type": "supplier"
|
"party": frm.doc.supplier,
|
||||||
},
|
"party_type": "supplier"
|
||||||
callback: function(r) {
|
},
|
||||||
if(!r.exc) {
|
callback: function(r) {
|
||||||
$.each(r.message, function(k, v) {
|
if(!r.exc) {
|
||||||
frm.set_value(k, v);
|
$.each(r.message, function(k, v) {
|
||||||
});
|
frm.set_value(k, v);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1302,10 +1302,6 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (field == 'qty') {
|
|
||||||
this.remove_zero_qty_item();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.update_paid_amount_status(false)
|
this.update_paid_amount_status(false)
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1445,6 +1441,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
this.set_taxes();
|
this.set_taxes();
|
||||||
this.calculate_outstanding_amount(update_paid_amount);
|
this.calculate_outstanding_amount(update_paid_amount);
|
||||||
this.set_totals();
|
this.set_totals();
|
||||||
|
this.update_total_qty();
|
||||||
},
|
},
|
||||||
|
|
||||||
get_company_currency: function () {
|
get_company_currency: function () {
|
||||||
@@ -1515,6 +1512,18 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
|
this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
update_total_qty: function() {
|
||||||
|
var me = this;
|
||||||
|
var qty_total = 0;
|
||||||
|
$.each(this.frm.doc["items"] || [], function (i, d) {
|
||||||
|
if (d.item_code) {
|
||||||
|
qty_total += d.qty;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.frm.doc.qty_total = qty_total;
|
||||||
|
this.wrapper.find('.qty-total').text(this.frm.doc.qty_total);
|
||||||
|
},
|
||||||
|
|
||||||
set_primary_action: function () {
|
set_primary_action: function () {
|
||||||
var me = this;
|
var me = this;
|
||||||
this.page.set_primary_action(__("New Cart"), function () {
|
this.page.set_primary_action(__("New Cart"), function () {
|
||||||
@@ -1651,6 +1660,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
this.frm.doc.offline_pos_name = $.now();
|
this.frm.doc.offline_pos_name = $.now();
|
||||||
this.frm.doc.posting_date = frappe.datetime.get_today();
|
this.frm.doc.posting_date = frappe.datetime.get_today();
|
||||||
this.frm.doc.posting_time = frappe.datetime.now_time();
|
this.frm.doc.posting_time = frappe.datetime.now_time();
|
||||||
|
this.frm.doc.pos_total_qty = this.frm.doc.qty_total;
|
||||||
this.frm.doc.pos_profile = this.pos_profile_data['name'];
|
this.frm.doc.pos_profile = this.pos_profile_data['name'];
|
||||||
invoice_data[this.frm.doc.offline_pos_name] = this.frm.doc;
|
invoice_data[this.frm.doc.offline_pos_name] = this.frm.doc;
|
||||||
this.si_docs.push(invoice_data);
|
this.si_docs.push(invoice_data);
|
||||||
|
|||||||
@@ -4,12 +4,11 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
import datetime
|
|
||||||
from frappe import _, msgprint, scrub
|
from frappe import _, msgprint, scrub
|
||||||
from frappe.defaults import get_user_permissions
|
from frappe.defaults import get_user_permissions
|
||||||
from frappe.model.utils import get_fetch_values
|
from frappe.model.utils import get_fetch_values
|
||||||
from frappe.utils import (add_days, getdate, formatdate, get_first_day, date_diff,
|
from frappe.utils import (add_days, getdate, formatdate, date_diff,
|
||||||
add_years, get_timestamp, nowdate, flt, add_months, get_last_day)
|
add_years, get_timestamp, nowdate, flt, add_months, get_last_day)
|
||||||
from frappe.contacts.doctype.address.address import (get_address_display,
|
from frappe.contacts.doctype.address.address import (get_address_display,
|
||||||
get_default_address, get_company_address)
|
get_default_address, get_company_address)
|
||||||
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
|
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Print Format",
|
"doctype": "Print Format",
|
||||||
"font": "Default",
|
"font": "Default",
|
||||||
"html": "<style>\n\t.print-format table, .print-format tr, \n\t.print-format td, .print-format div, .print-format p {\n\t\tfont-family: Monospace;\n\t\tline-height: 200%;\n\t\tvertical-align: middle;\n\t}\n\t@media screen {\n\t\t.print-format {\n\t\t\twidth: 4in;\n\t\t\tpadding: 0.25in;\n\t\t\tmin-height: 8in;\n\t\t}\n\t}\n</style>\n\n<p class=\"text-center\">\n\t{{ doc.company }}<br>\n\t{% if doc.company_address_display %}\n\t\t{% set company_address = doc.company_address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t{% if \"GSTIN\" not in company_address %}\n\t\t\t{{ company_address }}\n\t\t\t<b>{{ _(\"GSTIN\") }}:</b>{{ doc.company_gstin }}\n\t\t{% else %}\n\t\t\t{{ company_address.replace(\"GSTIN\", \"<br>GSTIN\") }}\n\t\t{% endif %}\n\t{% endif %}\n\t<br>\n\t{% if doc.docstatus == 0 %}\n\t\t<b>{{ doc.status + \" \"+ (doc.select_print_heading or _(\"Invoice\")) }}</b><br>\n\t{% else %}\n\t\t<b>{{ doc.select_print_heading or _(\"Invoice\") }}</b><br>\n\t{% endif %}\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t{% if doc.grand_total > 50000 %}\n\t\t{% set customer_address = doc.address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t<b>{{ _(\"Customer\") }}:</b><br>\n\t\t{{ doc.customer_name }}<br>\n\t\t{{ customer_address }}\n\t{% endif %}\n</p>\n\n<hr>\n<table class=\"table table-condensed cart no-border\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th width=\"40%\">{{ _(\"Item\") }}</b></th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Qty\") }}</th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{%- for item in doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.gst_hsn_code -%}\n\t\t\t\t\t<br><b>{{ _(\"HSN/SAC\") }}:</b> {{ item.gst_hsn_code }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t<br><b>{{ _(\"Serial No\") }}:</b> {{ item.serial_no }}\n\t\t\t\t{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ item.rate }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t{% if doc.flags.show_inclusive_tax_in_print %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% else %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% endif %}\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t {%- if not row.included_in_print_rate or doc.flags.show_inclusive_tax_in_print -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ row.description }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t</td>\n\t\t\t<tr>\n\t\t {%- endif -%}\n\t\t{%- endfor -%}\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.rounded_total -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Rounded Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t</tbody>\n</table>\n<p><b>Tax Breakup:</b></p>\n<div style=\"font-size: 8px\">\n\t{{ doc.other_charges_calculation }}\n</div>\n<p>{{ doc.terms or \"\" }}</p>\n<p class=\"text-center\">{{ _(\"Thank you, please visit again.\") }}</p>",
|
"html": "<style>\n\t.print-format table, .print-format tr, \n\t.print-format td, .print-format div, .print-format p {\n\t\tfont-family: Monospace;\n\t\tline-height: 200%;\n\t\tvertical-align: middle;\n\t}\n\t@media screen {\n\t\t.print-format {\n\t\t\twidth: 4in;\n\t\t\tpadding: 0.25in;\n\t\t\tmin-height: 8in;\n\t\t}\n\t}\n</style>\n\n<p class=\"text-center\">\n\t{{ doc.company }}<br>\n\t{% if doc.company_address_display %}\n\t\t{% set company_address = doc.company_address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t{% if \"GSTIN\" not in company_address %}\n\t\t\t{{ company_address }}\n\t\t\t<b>{{ _(\"GSTIN\") }}:</b>{{ doc.company_gstin }}\n\t\t{% else %}\n\t\t\t{{ company_address.replace(\"GSTIN\", \"<br>GSTIN\") }}\n\t\t{% endif %}\n\t{% endif %}\n\t<br>\n\t{% if doc.docstatus == 0 %}\n\t\t<b>{{ doc.status + \" \"+ (doc.select_print_heading or _(\"Invoice\")) }}</b><br>\n\t{% else %}\n\t\t<b>{{ doc.select_print_heading or _(\"Invoice\") }}</b><br>\n\t{% endif %}\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t{% if doc.grand_total > 50000 %}\n\t\t{% set customer_address = doc.address_display.replace(\"\\n\", \" \").replace(\"<br>\", \" \") %}\n\t\t<b>{{ _(\"Customer\") }}:</b><br>\n\t\t{{ doc.customer_name }}<br>\n\t\t{{ customer_address }}\n\t{% endif %}\n</p>\n\n<hr>\n<table class=\"table table-condensed cart no-border\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th width=\"40%\">{{ _(\"Item\") }}</b></th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Qty\") }}</th>\n\t\t\t<th width=\"30%\" class=\"text-right\">{{ _(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{%- for item in doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.gst_hsn_code -%}\n\t\t\t\t\t<br><b>{{ _(\"HSN/SAC\") }}:</b> {{ item.gst_hsn_code }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t<br><b>{{ _(\"Serial No\") }}:</b> {{ item.serial_no }}\n\t\t\t\t{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ item.rate }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t{% if doc.flags.show_inclusive_tax_in_print %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% else %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% endif %}\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t {%- if not row.included_in_print_rate or doc.flags.show_inclusive_tax_in_print -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ row.description }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t</td>\n\t\t\t<tr>\n\t\t {%- endif -%}\n\t\t{%- endfor -%}\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.rounded_total -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Rounded Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\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>{{ _(\"Paid Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"paid_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t{%- if doc.change_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Change Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"change_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t{%- endif -%}\n\t</tbody>\n</table>\n<p><b>Tax Breakup:</b></p>\n<div style=\"font-size: 8px\">\n\t{{ doc.other_charges_calculation }}\n</div>\n<p>{{ doc.terms or \"\" }}</p>\n<p class=\"text-center\">{{ _(\"Thank you, please visit again.\") }}</p>",
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"line_breaks": 0,
|
"line_breaks": 0,
|
||||||
"modified": "2018-02-07 12:38:36.011318",
|
"modified": "2018-03-20 14:24:08.167930",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "GST POS Invoice",
|
"name": "GST POS Invoice",
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Print Format",
|
"doctype": "Print Format",
|
||||||
"font": "Default",
|
"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{{ __(\"POS No : \") }} {{ offline_pos_name }}<br>\n</p>\n<p>\n\t<b>{{ __(\"Customer\") }}:</b> {{ customer }}<br>\n</p>\n\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, null,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\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ __(\"Paid Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ format_currency(paid_amount, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n\n<hr>\n<p>{{ terms }}</p>\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>{{ __(\"Customer\") }}:</b> {{ customer }}<br>\n</p>\n\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, null,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\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ __(\"Paid Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ format_currency(paid_amount, currency) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ __(\"Qty Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ qty_total }}\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n\n<hr>\n<p>{{ terms }}</p>\n<p class=\"text-center\">{{ __(\"Thank you, please visit again.\") }}</p>",
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"line_breaks": 0,
|
"line_breaks": 0,
|
||||||
"modified": "2017-09-14 14:36:04.740728",
|
"modified": "2018-03-21 09:10:16.693732",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Point of Sale",
|
"name": "Point of Sale",
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
"doc_type": "Sales Invoice",
|
"doc_type": "Sales Invoice",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Print Format",
|
"doctype": "Print Format",
|
||||||
"html": "<style>\n\t.print-format table, .print-format tr, \n\t.print-format td, .print-format div, .print-format p {\n\t\tfont-family: Monospace;\n\t\tline-height: 200%;\n\t\tvertical-align: middle;\n\t}\n\t@media screen {\n\t\t.print-format {\n\t\t\twidth: 4in;\n\t\t\tpadding: 0.25in;\n\t\t\tmin-height: 8in;\n\t\t}\n\t}\n</style>\n\n<p class=\"text-center\">\n\t{{ doc.company }}<br>\n\t{% if doc.docstatus == 0 %}\n\t\t{{ doc.status + \" \" + (doc.select_print_heading or _(\"Invoice\")) }}<br>\n\t{% else %}\n\t\t{{ doc.select_print_heading or _(\"Invoice\") }}<br>\n\t{% endif %}\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t<b>{{ _(\"Customer\") }}:</b> {{ doc.customer_name }}\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 doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ item.get_formatted(\"rate\") }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t{% if doc.flags.show_inclusive_tax_in_print %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% else %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% endif %}\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t {%- if not row.included_in_print_rate or doc.flags.show_inclusive_tax_in_print -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ row.description }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t</td>\n\t\t\t<tr>\n\t\t {%- endif -%}\n\t\t{%- endfor -%}\n\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.rounded_total -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Rounded Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t{%- if doc.pos_total_qty -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Total Qty\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"pos_total_qty\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t</tbody>\n</table>\n<hr>\n<p>{{ doc.terms or \"\" }}</p>\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{{ doc.company }}<br>\n\t{% if doc.docstatus == 0 %}\n\t\t{{ doc.status + \" \" + (doc.select_print_heading or _(\"Invoice\")) }}<br>\n\t{% else %}\n\t\t{{ doc.select_print_heading or _(\"Invoice\") }}<br>\n\t{% endif %}\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t<b>{{ _(\"Customer\") }}:</b> {{ doc.customer_name }}\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 doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}<br>@ {{ item.get_formatted(\"rate\") }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t{% if doc.flags.show_inclusive_tax_in_print %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% else %}\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ _(\"Total\") }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }}\n\t\t\t\t</td>\n\t\t\t{% endif %}\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t {%- if not row.included_in_print_rate or doc.flags.show_inclusive_tax_in_print -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 70%\">\n\t\t\t\t\t{{ row.description }}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t</td>\n\t\t\t<tr>\n\t\t {%- endif -%}\n\t\t{%- endfor -%}\n\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.rounded_total -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Rounded Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\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>{{ _(\"Paid Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"paid_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.change_amount -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t\t<b>{{ _(\"Change Amount\") }}</b>\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"change_amount\") }}\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t{%- endif -%}\n\t\t{%- if doc.pos_total_qty -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 75%\">\n\t\t\t\t<b>{{ _(\"Total Qty\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"pos_total_qty\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t</tbody>\n</table>\n<hr>\n<p>{{ doc.terms or \"\" }}</p>\n<p class=\"text-center\">{{ _(\"Thank you, please visit again.\") }}</p>",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"line_breaks": 0,
|
"line_breaks": 0,
|
||||||
"modified": "2018-02-08 05:39:47.280705",
|
"modified": "2018-03-20 14:24:12.394354",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "POS Invoice",
|
"name": "POS Invoice",
|
||||||
|
|||||||
@@ -14,7 +14,13 @@ frappe.query_reports["Accounts Payable"] = {
|
|||||||
"fieldname":"supplier",
|
"fieldname":"supplier",
|
||||||
"label": __("Supplier"),
|
"label": __("Supplier"),
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"options": "Supplier"
|
"options": "Supplier",
|
||||||
|
on_change: () => {
|
||||||
|
var supplier = frappe.query_report_filters_by_name.supplier.get_value();
|
||||||
|
frappe.db.get_value('Supplier', supplier, "tax_id", function(value) {
|
||||||
|
frappe.query_report_filters_by_name.tax_id.set_value(value["tax_id"]);
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname":"report_date",
|
"fieldname":"report_date",
|
||||||
@@ -52,6 +58,12 @@ frappe.query_reports["Accounts Payable"] = {
|
|||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"default": "90",
|
"default": "90",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname":"tax_id",
|
||||||
|
"label": __("Tax Id"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
onload: function(report) {
|
onload: function(report) {
|
||||||
|
|||||||
@@ -2,17 +2,29 @@
|
|||||||
<style>
|
<style>
|
||||||
@media screen {
|
@media screen {
|
||||||
.print-format {
|
.print-format {
|
||||||
padding: 8mm;
|
padding: 4mm;
|
||||||
margin:4mm;
|
font-size: 8.0pt !important;
|
||||||
font-size:10px;
|
|
||||||
font-family: Tahoma, sans-serif;
|
font-family: Tahoma, sans-serif;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
{% } %}
|
{% } %}
|
||||||
|
<style>
|
||||||
|
.print-format {
|
||||||
|
padding: 4mm;
|
||||||
|
font-size: 8.0pt !important;
|
||||||
|
font-family: Tahoma, sans-serif;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
||||||
<h4 class="text-center">{%= filters.customer || filters.supplier %} </h4>
|
<h4 class="text-center">{%= filters.customer || filters.supplier %} </h4>
|
||||||
|
<h6 class="text-center">
|
||||||
|
{% if (filters.tax_id) { %}
|
||||||
|
{%= __("Tax Id: ")%} {%= filters.tax_id %}
|
||||||
|
{% } %}
|
||||||
|
</h6>
|
||||||
<h5 class="text-center">
|
<h5 class="text-center">
|
||||||
{%= __(filters.ageing_based_on) %}
|
{%= __(filters.ageing_based_on) %}
|
||||||
{%= __("Until") %}
|
{%= __("Until") %}
|
||||||
@@ -27,7 +39,7 @@
|
|||||||
var range4 = report.columns[14].label;
|
var range4 = report.columns[14].label;
|
||||||
%}
|
%}
|
||||||
{% if(balance_row) { %}
|
{% if(balance_row) { %}
|
||||||
<table class="table table-bordered table-condensed table-sm small">
|
<table class="table table-bordered table-condensed">
|
||||||
<caption class="text-right">(Amount in {%= data[0][__("currency")] || "" %})</caption>
|
<caption class="text-right">(Amount in {%= data[0][__("currency")] || "" %})</caption>
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col style="width: 30mm;">
|
<col style="width: 30mm;">
|
||||||
@@ -86,8 +98,8 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
{% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %}
|
{% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %}
|
||||||
<th style="width: 10%">{%= __("Date") %}</th>
|
<th style="width: 18%">{%= __("Date") %}</th>
|
||||||
<th style="width: 15%">{%= __("Ref") %}</th>
|
<th style="width: 17%">{%= __("Reference") %}</th>
|
||||||
{% if(!filters.show_pdc_in_print) { %}
|
{% if(!filters.show_pdc_in_print) { %}
|
||||||
<th style="width: 20%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
<th style="width: 20%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
||||||
{% } %}
|
{% } %}
|
||||||
@@ -120,9 +132,14 @@
|
|||||||
<tr>
|
<tr>
|
||||||
{% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %}
|
{% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %}
|
||||||
{% if(data[i][__("Customer")] || data[i][__("Supplier")]) { %}
|
{% if(data[i][__("Customer")] || data[i][__("Supplier")]) { %}
|
||||||
<td>{%= dateutil.str_to_user(data[i][__("Posting Date")]) %}</td>
|
<td>{%= dateutil.str_to_user(data[i]["posting_date"]) %}</td>
|
||||||
<td>{%= data[i][__("Voucher Type")] %}
|
<td>
|
||||||
<br>{%= data[i][__("Voucher No")] %}</td>
|
{% if(!filters.show_pdc_in_print) { %}
|
||||||
|
{%= data[i]["voucher_type"] %}
|
||||||
|
<br>
|
||||||
|
{% } %}
|
||||||
|
{%= data[i]["voucher_no"] %}
|
||||||
|
</td>
|
||||||
{% if(!filters.show_pdc_in_print) { %}
|
{% if(!filters.show_pdc_in_print) { %}
|
||||||
<td>
|
<td>
|
||||||
{% if(!(filters.customer || filters.supplier)) { %}
|
{% if(!(filters.customer || filters.supplier)) { %}
|
||||||
@@ -215,4 +232,4 @@
|
|||||||
{% } %}
|
{% } %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p class="text-right text-muted">{{ __("Printed On") }}{%= dateutil.str_to_user(dateutil.get_datetime_as_string()) %}</p>
|
<p class="text-right text-muted">{{ __("Printed On ") }}{%= dateutil.str_to_user(dateutil.get_datetime_as_string()) %}</p>
|
||||||
@@ -14,7 +14,13 @@ frappe.query_reports["Accounts Receivable"] = {
|
|||||||
"fieldname":"customer",
|
"fieldname":"customer",
|
||||||
"label": __("Customer"),
|
"label": __("Customer"),
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"options": "Customer"
|
"options": "Customer",
|
||||||
|
on_change: () => {
|
||||||
|
var customer = frappe.query_report_filters_by_name.customer.get_value();
|
||||||
|
frappe.db.get_value('Customer', customer, "tax_id", function(value) {
|
||||||
|
frappe.query_report_filters_by_name.tax_id.set_value(value["tax_id"]);
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname":"customer_group",
|
"fieldname":"customer_group",
|
||||||
@@ -87,6 +93,12 @@ frappe.query_reports["Accounts Receivable"] = {
|
|||||||
"fieldname":"show_pdc_in_print",
|
"fieldname":"show_pdc_in_print",
|
||||||
"label": __("Show PDC in Print"),
|
"label": __("Show PDC in Print"),
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname":"tax_id",
|
||||||
|
"label": __("Tax Id"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,35 @@ class ReceivablePayableReport(object):
|
|||||||
return columns, data, None, chart
|
return columns, data, None, chart
|
||||||
|
|
||||||
def get_columns(self, party_naming_by, args):
|
def get_columns(self, party_naming_by, args):
|
||||||
columns = [_("Posting Date") + ":Date:80", _(args.get("party_type")) + ":Link/" + args.get("party_type") + ":200"]
|
columns = []
|
||||||
|
columns.append({
|
||||||
|
"label": _("Posting Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"fieldname": "posting_date",
|
||||||
|
"width": 90
|
||||||
|
})
|
||||||
|
|
||||||
|
columns += [_(args.get("party_type")) + ":Link/" + args.get("party_type") + ":200"]
|
||||||
|
|
||||||
if party_naming_by == "Naming Series":
|
if party_naming_by == "Naming Series":
|
||||||
columns += [args.get("party_type") + " Name::110"]
|
columns += [args.get("party_type") + " Name::110"]
|
||||||
|
|
||||||
columns += [_("Voucher Type") + "::110", _("Voucher No") + ":Dynamic Link/"+_("Voucher Type")+":120",
|
columns.append({
|
||||||
_("Due Date") + ":Date:80"]
|
"label": _("Voucher Type"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"fieldname": "voucher_type",
|
||||||
|
"width": 110
|
||||||
|
})
|
||||||
|
|
||||||
|
columns.append({
|
||||||
|
"label": _("Voucher No"),
|
||||||
|
"fieldtype": "Dynamic Link",
|
||||||
|
"fieldname": "voucher_no",
|
||||||
|
"width": 110,
|
||||||
|
"options": "voucher_type",
|
||||||
|
})
|
||||||
|
|
||||||
|
columns += [_("Due Date") + ":Date:80"]
|
||||||
|
|
||||||
if args.get("party_type") == "Supplier":
|
if args.get("party_type") == "Supplier":
|
||||||
columns += [_("Bill No") + "::80", _("Bill Date") + ":Date:80"]
|
columns += [_("Bill No") + "::80", _("Bill Date") + ":Date:80"]
|
||||||
@@ -114,7 +136,7 @@ class ReceivablePayableReport(object):
|
|||||||
return_entries = self.get_return_entries(args.get("party_type"))
|
return_entries = self.get_return_entries(args.get("party_type"))
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
pdc_details = get_pdc_details(args.get("party_type"))
|
pdc_details = get_pdc_details(args.get("party_type"), self.filters.report_date)
|
||||||
|
|
||||||
for gle in self.get_entries_till(self.filters.report_date, args.get("party_type")):
|
for gle in self.get_entries_till(self.filters.report_date, args.get("party_type")):
|
||||||
if self.is_receivable_or_payable(gle, dr_or_cr, future_vouchers):
|
if self.is_receivable_or_payable(gle, dr_or_cr, future_vouchers):
|
||||||
@@ -160,6 +182,7 @@ class ReceivablePayableReport(object):
|
|||||||
row.append(company_currency)
|
row.append(company_currency)
|
||||||
|
|
||||||
pdc = pdc_details.get((gle.voucher_no, gle.party), {})
|
pdc = pdc_details.get((gle.voucher_no, gle.party), {})
|
||||||
|
|
||||||
remaining_balance = outstanding_amount - flt(pdc.get("pdc_amount"))
|
remaining_balance = outstanding_amount - flt(pdc.get("pdc_amount"))
|
||||||
row += [pdc.get("pdc_date"), pdc.get("pdc_ref"),
|
row += [pdc.get("pdc_date"), pdc.get("pdc_ref"),
|
||||||
flt(pdc.get("pdc_amount")), remaining_balance]
|
flt(pdc.get("pdc_amount")), remaining_balance]
|
||||||
@@ -392,7 +415,7 @@ def get_ageing_data(first_range, second_range, third_range, age_as_on, entry_dat
|
|||||||
|
|
||||||
return [age] + outstanding_range
|
return [age] + outstanding_range
|
||||||
|
|
||||||
def get_pdc_details(party_type):
|
def get_pdc_details(party_type, report_date):
|
||||||
pdc_details = frappe._dict()
|
pdc_details = frappe._dict()
|
||||||
|
|
||||||
for pdc in frappe.db.sql("""
|
for pdc in frappe.db.sql("""
|
||||||
@@ -405,13 +428,14 @@ def get_pdc_details(party_type):
|
|||||||
on
|
on
|
||||||
(pref.parent = pent.name)
|
(pref.parent = pent.name)
|
||||||
where
|
where
|
||||||
pent.docstatus < 2 and pent.reference_date >= pent.posting_date
|
pent.docstatus < 2 and pent.reference_date >= %s
|
||||||
and pent.party_type = %s
|
and pent.party_type = %s
|
||||||
group by pent.party, pref.reference_name""", party_type, as_dict=1):
|
group by pent.party, pref.reference_name""", (report_date, party_type), as_dict=1):
|
||||||
pdc_details.setdefault((pdc.invoice_no, pdc.party), pdc)
|
pdc_details.setdefault((pdc.invoice_no, pdc.party), pdc)
|
||||||
|
|
||||||
if scrub(party_type):
|
if scrub(party_type):
|
||||||
amount_field = "jea.debit_in_account_currency + jea.credit_in_account_currency"
|
amount_field = ("jea.debit_in_account_currency"
|
||||||
|
if party_type == 'Supplier' else "jea.credit_in_account_currency")
|
||||||
else:
|
else:
|
||||||
amount_field = "jea.debit + jea.credit"
|
amount_field = "jea.debit + jea.credit"
|
||||||
|
|
||||||
@@ -425,9 +449,9 @@ def get_pdc_details(party_type):
|
|||||||
on
|
on
|
||||||
(jea.parent = je.name)
|
(jea.parent = je.name)
|
||||||
where
|
where
|
||||||
je.docstatus < 2 and je.cheque_date >= je.posting_date
|
je.docstatus < 2 and je.cheque_date >= %s
|
||||||
and jea.party_type = %s
|
and jea.party_type = %s
|
||||||
group by jea.party, jea.reference_name""".format(amount_field), party_type, as_dict=1):
|
group by jea.party, jea.reference_name""".format(amount_field), (report_date, party_type), as_dict=1):
|
||||||
if (pdc.invoice_no, pdc.party) in pdc_details:
|
if (pdc.invoice_no, pdc.party) in pdc_details:
|
||||||
pdc_details[(pdc.invoice_no, pdc.party)]["pdc_amount"] += pdc.pdc_amount
|
pdc_details[(pdc.invoice_no, pdc.party)]["pdc_amount"] += pdc.pdc_amount
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from frappe.utils import flt
|
||||||
from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport
|
from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport
|
||||||
|
|
||||||
class AccountsReceivableSummary(ReceivablePayableReport):
|
class AccountsReceivableSummary(ReceivablePayableReport):
|
||||||
@@ -88,7 +89,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
for k in party_total[d.party].keys():
|
for k in party_total[d.party].keys():
|
||||||
party_total[d.party][k] += d.get(k, 0)
|
if k != "currency":
|
||||||
|
party_total[d.party][k] += flt(d.get(k, 0))
|
||||||
|
|
||||||
party_total[d.party].currency = d.currency
|
party_total[d.party].currency = d.currency
|
||||||
|
|
||||||
|
|||||||
@@ -132,11 +132,11 @@ def get_chart_data(filters, columns, asset, liability, equity):
|
|||||||
|
|
||||||
datasets = []
|
datasets = []
|
||||||
if asset_data:
|
if asset_data:
|
||||||
datasets.append({'title':'Assets', 'values': asset_data})
|
datasets.append({'name':'Assets', 'values': asset_data})
|
||||||
if liability_data:
|
if liability_data:
|
||||||
datasets.append({'title':'Liabilities', 'values': liability_data})
|
datasets.append({'name':'Liabilities', 'values': liability_data})
|
||||||
if equity_data:
|
if equity_data:
|
||||||
datasets.append({'title':'Equity', 'values': equity_data})
|
datasets.append({'name':'Equity', 'values': equity_data})
|
||||||
|
|
||||||
chart = {
|
chart = {
|
||||||
"data": {
|
"data": {
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
||||||
<h3 class="text-center">{%= filters.company %}</h3>
|
<h3 class="text-center">{%= filters.company %}</h3>
|
||||||
<h3 class="text-center">{%= filters.fiscal_year %}</h3>
|
<h3 class="text-center">{%= filters.fiscal_year %}</h3>
|
||||||
<h5 class="text-center">{%= __("Currency") %} : {%= erpnext.get_currency(filters.company) %} </h4>
|
<h5 class="text-center">{%= __("Currency") %} : {%= filters.presentation_currency || erpnext.get_currency(filters.company) %} </h4>
|
||||||
{% if (filters.from_date) { %}
|
{% if (filters.from_date) { %}
|
||||||
<h4 class="text-center">{%= dateutil.str_to_user(filters.from_date) %} - {%= dateutil.str_to_user(filters.to_date) %}</h3>
|
<h4 class="text-center">{%= frappe.datetime.str_to_user(filters.from_date) %} - {%= frappe.datetime.str_to_user(filters.to_date) %}</h3>
|
||||||
{% } %}
|
{% } %}
|
||||||
<hr>
|
<hr>
|
||||||
<table class="table table-bordered">
|
<table class="table table-bordered">
|
||||||
@@ -49,9 +49,9 @@
|
|||||||
</td>
|
</td>
|
||||||
{% for(var i=2, l=report.columns.length; i<l; i++) { %}
|
{% for(var i=2, l=report.columns.length; i<l; i++) { %}
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
{% var fieldname = report.columns[i].field; %}
|
{% var fieldname = report.columns[i].field || report.columns[i].fieldname; %}
|
||||||
{% if (!is_null(row[fieldname])) { %}
|
{% if (!is_null(row[fieldname])) { %}
|
||||||
{%= format_number(row[fieldname], null)%}
|
{%= format_currency(row[fieldname], filters.presentation_currency) %}
|
||||||
{% } %}
|
{% } %}
|
||||||
</td>
|
</td>
|
||||||
{% } %}
|
{% } %}
|
||||||
@@ -59,4 +59,4 @@
|
|||||||
{% } %}
|
{% } %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p class="text-right text-muted">Printed On {%= dateutil.str_to_user(dateutil.get_datetime_as_string()) %}</p>
|
<p class="text-right text-muted">Printed On {%= frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) %}</p>
|
||||||
|
|||||||
@@ -297,8 +297,7 @@ def filter_accounts(accounts, depth=10):
|
|||||||
def add_to_list(parent, level):
|
def add_to_list(parent, level):
|
||||||
if level < depth:
|
if level < depth:
|
||||||
children = parent_children_map.get(parent) or []
|
children = parent_children_map.get(parent) or []
|
||||||
if parent == None:
|
sort_accounts(children, is_root=True if parent==None else False)
|
||||||
sort_root_accounts(children)
|
|
||||||
|
|
||||||
for child in children:
|
for child in children:
|
||||||
child.indent = level
|
child.indent = level
|
||||||
@@ -310,25 +309,26 @@ def filter_accounts(accounts, depth=10):
|
|||||||
return filtered_accounts, accounts_by_name, parent_children_map
|
return filtered_accounts, accounts_by_name, parent_children_map
|
||||||
|
|
||||||
|
|
||||||
def sort_root_accounts(roots):
|
def sort_accounts(accounts, is_root=False, key="name"):
|
||||||
"""Sort root types as Asset, Liability, Equity, Income, Expense"""
|
"""Sort root types as Asset, Liability, Equity, Income, Expense"""
|
||||||
|
|
||||||
def compare_roots(a, b):
|
def compare_accounts(a, b):
|
||||||
if a.value and re.split('\W+', a.value)[0].isdigit():
|
if is_root:
|
||||||
# if chart of accounts is numbered, then sort by number
|
if a.report_type != b.report_type and a.report_type == "Balance Sheet":
|
||||||
return cmp(a.value, b.value)
|
return -1
|
||||||
if a.report_type != b.report_type and a.report_type == "Balance Sheet":
|
if a.root_type != b.root_type and a.root_type == "Asset":
|
||||||
return -1
|
return -1
|
||||||
if a.root_type != b.root_type and a.root_type == "Asset":
|
if a.root_type == "Liability" and b.root_type == "Equity":
|
||||||
return -1
|
return -1
|
||||||
if a.root_type == "Liability" and b.root_type == "Equity":
|
if a.root_type == "Income" and b.root_type == "Expense":
|
||||||
return -1
|
return -1
|
||||||
if a.root_type == "Income" and b.root_type == "Expense":
|
else:
|
||||||
return -1
|
if re.split('\W+', a[key])[0].isdigit():
|
||||||
|
# if chart of accounts is numbered, then sort by number
|
||||||
|
return cmp(a[key], b[key])
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
roots.sort(key = functools.cmp_to_key(compare_roots))
|
accounts.sort(key = functools.cmp_to_key(compare_accounts))
|
||||||
|
|
||||||
|
|
||||||
def set_gl_entries_by_account(
|
def set_gl_entries_by_account(
|
||||||
company, from_date, to_date, root_lft, root_rgt, filters, gl_entries_by_account, ignore_closing_entries=False):
|
company, from_date, to_date, root_lft, root_rgt, filters, gl_entries_by_account, ignore_closing_entries=False):
|
||||||
|
|||||||
@@ -8,6 +8,13 @@
|
|||||||
{%= filters.account %}
|
{%= filters.account %}
|
||||||
{% } %}
|
{% } %}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
|
<h6 class="text-center">
|
||||||
|
{% if (filters.tax_id) { %}
|
||||||
|
{%= __("Tax Id: ")%} {%= filters.tax_id %}
|
||||||
|
{% } %}
|
||||||
|
</h6>
|
||||||
|
|
||||||
<h5 class="text-center">
|
<h5 class="text-center">
|
||||||
{%= frappe.datetime.str_to_user(filters.from_date) %}
|
{%= frappe.datetime.str_to_user(filters.from_date) %}
|
||||||
{%= __("to") %}
|
{%= __("to") %}
|
||||||
|
|||||||
@@ -61,7 +61,10 @@ frappe.query_reports["General Ledger"] = {
|
|||||||
"label": __("Party Type"),
|
"label": __("Party Type"),
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"options": "Party Type",
|
"options": "Party Type",
|
||||||
"default": ""
|
"default": "",
|
||||||
|
on_change: function() {
|
||||||
|
frappe.query_report_filters_by_name.party.set_value("");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname":"party",
|
"fieldname":"party",
|
||||||
@@ -82,11 +85,16 @@ frappe.query_reports["General Ledger"] = {
|
|||||||
frappe.query_report_filters_by_name.party_name.set_value("");
|
frappe.query_report_filters_by_name.party_name.set_value("");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var fieldname = erpnext.utils.get_party_name(party_type) || "name";
|
||||||
var fieldname = frappe.scrub(party_type) + "_name";
|
|
||||||
frappe.db.get_value(party_type, party, fieldname, function(value) {
|
frappe.db.get_value(party_type, party, fieldname, function(value) {
|
||||||
frappe.query_report_filters_by_name.party_name.set_value(value[fieldname]);
|
frappe.query_report_filters_by_name.party_name.set_value(value[fieldname]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (party_type === "Customer" || party_type === "Supplier") {
|
||||||
|
frappe.db.get_value(party_type, party, "tax_id", function(value) {
|
||||||
|
frappe.query_report_filters_by_name.tax_id.set_value(value["tax_id"]);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -95,6 +103,12 @@ frappe.query_reports["General Ledger"] = {
|
|||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"fieldname":"tax_id",
|
||||||
|
"label": __("Tax Id"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldname":"group_by_voucher",
|
"fieldname":"group_by_voucher",
|
||||||
"label": __("Group by Voucher"),
|
"label": __("Group by Voucher"),
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ def set_account_currency(filters):
|
|||||||
if gle_currency:
|
if gle_currency:
|
||||||
account_currency = gle_currency
|
account_currency = gle_currency
|
||||||
else:
|
else:
|
||||||
account_currency = None if filters.party_type == "Employee" else \
|
account_currency = None if filters.party_type in ["Employee", "Student", "Shareholder"] else \
|
||||||
frappe.db.get_value(filters.party_type, filters.party, "default_currency")
|
frappe.db.get_value(filters.party_type, filters.party, "default_currency")
|
||||||
|
|
||||||
filters["account_currency"] = account_currency or filters.company_currency
|
filters["account_currency"] = account_currency or filters.company_currency
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ def execute(filters=None):
|
|||||||
"buying_rate", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"],
|
"buying_rate", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"],
|
||||||
"warehouse": ["warehouse", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
"warehouse": ["warehouse", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
||||||
"gross_profit", "gross_profit_percent"],
|
"gross_profit", "gross_profit_percent"],
|
||||||
"territory": ["territory", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
|
||||||
"gross_profit", "gross_profit_percent"],
|
|
||||||
"brand": ["brand", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
"brand": ["brand", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
||||||
"gross_profit", "gross_profit_percent"],
|
"gross_profit", "gross_profit_percent"],
|
||||||
"item_group": ["item_group", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
"item_group": ["item_group", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ def get_tax_accounts(item_list, columns, company_currency,
|
|||||||
%s
|
%s
|
||||||
order by description
|
order by description
|
||||||
""" % (tax_doctype, '%s', ', '.join(['%s']*len(invoice_item_row)), conditions),
|
""" % (tax_doctype, '%s', ', '.join(['%s']*len(invoice_item_row)), conditions),
|
||||||
tuple([doctype] + invoice_item_row.keys()))
|
tuple([doctype] + list(invoice_item_row)))
|
||||||
|
|
||||||
for parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details:
|
for parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details:
|
||||||
description = handle_html(description)
|
description = handle_html(description)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ def execute(filters=None):
|
|||||||
accumulated_values=filters.accumulated_values,
|
accumulated_values=filters.accumulated_values,
|
||||||
ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
|
ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
|
||||||
|
|
||||||
net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company)
|
net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company, filters.presentation_currency)
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
data.extend(income or [])
|
data.extend(income or [])
|
||||||
@@ -33,13 +33,13 @@ def execute(filters=None):
|
|||||||
|
|
||||||
return columns, data, None, chart
|
return columns, data, None, chart
|
||||||
|
|
||||||
def get_net_profit_loss(income, expense, period_list, company):
|
def get_net_profit_loss(income, expense, period_list, company, currency=None):
|
||||||
total = 0
|
total = 0
|
||||||
net_profit_loss = {
|
net_profit_loss = {
|
||||||
"account_name": "'" + _("Profit for the year") + "'",
|
"account_name": "'" + _("Profit for the year") + "'",
|
||||||
"account": "'" + _("Profit for the year") + "'",
|
"account": "'" + _("Profit for the year") + "'",
|
||||||
"warn_if_negative": True,
|
"warn_if_negative": True,
|
||||||
"currency": frappe.db.get_value("Company", company, "default_currency")
|
"currency": currency or frappe.db.get_value("Company", company, "default_currency")
|
||||||
}
|
}
|
||||||
|
|
||||||
has_value = False
|
has_value = False
|
||||||
@@ -75,11 +75,11 @@ def get_chart_data(filters, columns, income, expense, net_profit_loss):
|
|||||||
|
|
||||||
datasets = []
|
datasets = []
|
||||||
if income_data:
|
if income_data:
|
||||||
datasets.append({'title': 'Income', 'values': income_data})
|
datasets.append({'name': 'Income', 'values': income_data})
|
||||||
if expense_data:
|
if expense_data:
|
||||||
datasets.append({'title': 'Expense', 'values': expense_data})
|
datasets.append({'name': 'Expense', 'values': expense_data})
|
||||||
if net_profit:
|
if net_profit:
|
||||||
datasets.append({'title': 'Net Profit/Loss', 'values': net_profit})
|
datasets.append({'name': 'Net Profit/Loss', 'values': net_profit})
|
||||||
|
|
||||||
chart = {
|
chart = {
|
||||||
"data": {
|
"data": {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
|
|||||||
|
|
||||||
row += [
|
row += [
|
||||||
supplier_details.get(inv.supplier), # supplier_type
|
supplier_details.get(inv.supplier), # supplier_type
|
||||||
inv.credit_to, inv.mode_of_payment, ", ".join(project),
|
inv.tax_id, inv.credit_to, inv.mode_of_payment, ", ".join(project),
|
||||||
inv.bill_no, inv.bill_date, inv.remarks,
|
inv.bill_no, inv.bill_date, inv.remarks,
|
||||||
", ".join(purchase_order), ", ".join(purchase_receipt), company_currency
|
", ".join(purchase_order), ", ".join(purchase_receipt), company_currency
|
||||||
]
|
]
|
||||||
@@ -83,7 +83,7 @@ def get_columns(invoice_list, additional_table_columns):
|
|||||||
columns += additional_table_columns
|
columns += additional_table_columns
|
||||||
|
|
||||||
columns += [
|
columns += [
|
||||||
_("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120",
|
_("Supplier Type") + ":Link/Supplier Type:120", _("Tax Id") + "::80", _("Payable Account") + ":Link/Account:120",
|
||||||
_("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
|
_("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
|
||||||
_("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
|
_("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
|
||||||
_("Purchase Order") + ":Link/Purchase Order:100",
|
_("Purchase Order") + ":Link/Purchase Order:100",
|
||||||
@@ -143,7 +143,7 @@ def get_invoices(filters, additional_query_columns):
|
|||||||
conditions = get_conditions(filters)
|
conditions = get_conditions(filters)
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
select
|
select
|
||||||
name, posting_date, credit_to, supplier, supplier_name, bill_no, bill_date,
|
name, posting_date, credit_to, supplier, supplier_name, tax_id, bill_no, bill_date,
|
||||||
remarks, base_net_total, base_grand_total, outstanding_amount,
|
remarks, base_net_total, base_grand_total, outstanding_amount,
|
||||||
mode_of_payment {0}
|
mode_of_payment {0}
|
||||||
from `tabPurchase Invoice`
|
from `tabPurchase Invoice`
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No
|
|||||||
#Cost Center & Warehouse Map
|
#Cost Center & Warehouse Map
|
||||||
invoice_cc_wh_map = get_invoice_cc_wh_map(invoice_list)
|
invoice_cc_wh_map = get_invoice_cc_wh_map(invoice_list)
|
||||||
invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
|
invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
|
||||||
customers = list(set([inv.customer for inv in invoice_list]))
|
|
||||||
customer_map = get_customer_details(customers)
|
|
||||||
company_currency = frappe.db.get_value("Company", filters.get("company"), "default_currency")
|
company_currency = frappe.db.get_value("Company", filters.get("company"), "default_currency")
|
||||||
mode_of_payments = get_mode_of_payments([inv.name for inv in invoice_list])
|
mode_of_payments = get_mode_of_payments([inv.name for inv in invoice_list])
|
||||||
|
|
||||||
@@ -38,7 +36,6 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No
|
|||||||
cost_center = list(set(invoice_cc_wh_map.get(inv.name, {}).get("cost_center", [])))
|
cost_center = list(set(invoice_cc_wh_map.get(inv.name, {}).get("cost_center", [])))
|
||||||
warehouse = list(set(invoice_cc_wh_map.get(inv.name, {}).get("warehouse", [])))
|
warehouse = list(set(invoice_cc_wh_map.get(inv.name, {}).get("warehouse", [])))
|
||||||
|
|
||||||
customer_details = customer_map.get(inv.customer, {})
|
|
||||||
row = [
|
row = [
|
||||||
inv.name, inv.posting_date, inv.customer, inv.customer_name
|
inv.name, inv.posting_date, inv.customer, inv.customer_name
|
||||||
]
|
]
|
||||||
@@ -48,8 +45,9 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No
|
|||||||
row.append(inv.get(col))
|
row.append(inv.get(col))
|
||||||
|
|
||||||
row +=[
|
row +=[
|
||||||
customer_details.get("customer_group"),
|
inv.get("customer_group"),
|
||||||
customer_details.get("territory"),
|
inv.get("territory"),
|
||||||
|
inv.get("tax_id"),
|
||||||
inv.debit_to, ", ".join(mode_of_payments.get(inv.name, [])),
|
inv.debit_to, ", ".join(mode_of_payments.get(inv.name, [])),
|
||||||
inv.project, inv.owner, inv.remarks,
|
inv.project, inv.owner, inv.remarks,
|
||||||
", ".join(sales_order), ", ".join(delivery_note),", ".join(cost_center),
|
", ".join(sales_order), ", ".join(delivery_note),", ".join(cost_center),
|
||||||
@@ -92,7 +90,7 @@ def get_columns(invoice_list, additional_table_columns):
|
|||||||
|
|
||||||
columns +=[
|
columns +=[
|
||||||
_("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
|
_("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
|
||||||
_("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + "::120",
|
_("Tax Id") + "::80", _("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + "::120",
|
||||||
_("Project") +":Link/Project:80", _("Owner") + "::150", _("Remarks") + "::150",
|
_("Project") +":Link/Project:80", _("Owner") + "::150", _("Remarks") + "::150",
|
||||||
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
|
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
|
||||||
_("Cost Center") + ":Link/Cost Center:100", _("Warehouse") + ":Link/Warehouse:100",
|
_("Cost Center") + ":Link/Cost Center:100", _("Warehouse") + ":Link/Warehouse:100",
|
||||||
@@ -162,7 +160,9 @@ def get_invoices(filters, additional_query_columns):
|
|||||||
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
||||||
|
|
||||||
conditions = get_conditions(filters)
|
conditions = get_conditions(filters)
|
||||||
return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, owner, remarks,
|
return frappe.db.sql("""
|
||||||
|
select name, posting_date, debit_to, project, customer,
|
||||||
|
customer_name, owner, remarks, territory, tax_id, customer_group,
|
||||||
base_net_total, base_grand_total, base_rounded_total, outstanding_amount {0}
|
base_net_total, base_grand_total, base_rounded_total, outstanding_amount {0}
|
||||||
from `tabSales Invoice`
|
from `tabSales Invoice`
|
||||||
where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') %
|
where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') %
|
||||||
@@ -241,15 +241,6 @@ def get_invoice_cc_wh_map(invoice_list):
|
|||||||
|
|
||||||
return invoice_cc_wh_map
|
return invoice_cc_wh_map
|
||||||
|
|
||||||
def get_customer_details(customers):
|
|
||||||
customer_map = {}
|
|
||||||
for cust in frappe.db.sql("""select name, territory, customer_group from `tabCustomer`
|
|
||||||
where name in (%s)""" % ", ".join(["%s"]*len(customers)), tuple(customers), as_dict=1):
|
|
||||||
customer_map.setdefault(cust.name, cust)
|
|
||||||
|
|
||||||
return customer_map
|
|
||||||
|
|
||||||
|
|
||||||
def get_mode_of_payments(invoice_list):
|
def get_mode_of_payments(invoice_list):
|
||||||
mode_of_payments = {}
|
mode_of_payments = {}
|
||||||
if invoice_list:
|
if invoice_list:
|
||||||
|
|||||||
@@ -252,16 +252,11 @@ def add_ac(args=None):
|
|||||||
if not ac.parent_account:
|
if not ac.parent_account:
|
||||||
ac.parent_account = args.get("parent")
|
ac.parent_account = args.get("parent")
|
||||||
|
|
||||||
if getattr(ac, 'is_root', None):
|
|
||||||
ac.parent_account=''
|
|
||||||
|
|
||||||
ac.old_parent = ""
|
ac.old_parent = ""
|
||||||
ac.freeze_account = "No"
|
ac.freeze_account = "No"
|
||||||
if cint(ac.get("is_root")):
|
if cint(ac.get("is_root")):
|
||||||
ac.parent_account = None
|
ac.parent_account = None
|
||||||
ac.flags.ignore_mandatory = True
|
ac.flags.ignore_mandatory = True
|
||||||
else:
|
|
||||||
ac.root_type = None
|
|
||||||
|
|
||||||
ac.insert()
|
ac.insert()
|
||||||
|
|
||||||
@@ -663,7 +658,7 @@ def get_companies():
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_children(doctype, parent, company, is_root=False):
|
def get_children(doctype, parent, company, is_root=False):
|
||||||
from erpnext.accounts.report.financial_statements import sort_root_accounts
|
from erpnext.accounts.report.financial_statements import sort_accounts
|
||||||
|
|
||||||
fieldname = frappe.db.escape(doctype.lower().replace(' ','_'))
|
fieldname = frappe.db.escape(doctype.lower().replace(' ','_'))
|
||||||
doctype = frappe.db.escape(doctype)
|
doctype = frappe.db.escape(doctype)
|
||||||
@@ -678,9 +673,6 @@ def get_children(doctype, parent, company, is_root=False):
|
|||||||
and `company` = %s and docstatus<2
|
and `company` = %s and docstatus<2
|
||||||
order by name""".format(fields=fields, fieldname = fieldname, doctype=doctype),
|
order by name""".format(fields=fields, fieldname = fieldname, doctype=doctype),
|
||||||
company, as_dict=1)
|
company, as_dict=1)
|
||||||
|
|
||||||
if parent=="Accounts":
|
|
||||||
sort_root_accounts(acc)
|
|
||||||
else:
|
else:
|
||||||
# other
|
# other
|
||||||
fields = ", account_currency" if doctype=="Account" else ""
|
fields = ", account_currency" if doctype=="Account" else ""
|
||||||
@@ -693,6 +685,7 @@ def get_children(doctype, parent, company, is_root=False):
|
|||||||
parent, as_dict=1)
|
parent, as_dict=1)
|
||||||
|
|
||||||
if doctype == 'Account':
|
if doctype == 'Account':
|
||||||
|
sort_accounts(acc, is_root, key="value")
|
||||||
company_currency = frappe.db.get_value("Company", company, "default_currency")
|
company_currency = frappe.db.get_value("Company", company, "default_currency")
|
||||||
for each in acc:
|
for each in acc:
|
||||||
each["company_currency"] = company_currency
|
each["company_currency"] = company_currency
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
class Crop(Document):
|
class Crop(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
@@ -13,7 +14,7 @@ class Crop(Document):
|
|||||||
for task in self.agriculture_task:
|
for task in self.agriculture_task:
|
||||||
# validate start_day is not > end_day
|
# validate start_day is not > end_day
|
||||||
if task.start_day > task.end_day:
|
if task.start_day > task.end_day:
|
||||||
frappe.throw(_("Start day is greater than end day in task '{0}'").format(task.subject))
|
frappe.throw(_("Start day is greater than end day in task '{0}'").format(task.task_name))
|
||||||
# to calculate the period of the Crop Cycle
|
# to calculate the period of the Crop Cycle
|
||||||
if task.end_day > max_period: max_period = task.end_day
|
if task.end_day > max_period: max_period = task.end_day
|
||||||
if max_period > self.period: self.period = max_period
|
if max_period > self.period: self.period = max_period
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
class Disease(Document):
|
class Disease(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
|||||||
@@ -178,3 +178,6 @@ def get_children(doctype, parent, is_root=False):
|
|||||||
# return nodes
|
# return nodes
|
||||||
return land_units
|
return land_units
|
||||||
|
|
||||||
|
|
||||||
|
def on_doctype_update():
|
||||||
|
frappe.db.add_index("Land Unit", ["lft", "rgt"])
|
||||||
@@ -15,8 +15,8 @@ frappe.ui.form.on('Soil Texture', {
|
|||||||
},
|
},
|
||||||
onload: function(frm) {
|
onload: function(frm) {
|
||||||
if (frm.doc.soil_texture_criteria == undefined) frm.call('load_contents');
|
if (frm.doc.soil_texture_criteria == undefined) frm.call('load_contents');
|
||||||
if (this.ternary_plot) return;
|
if (frm.doc.ternary_plot) return;
|
||||||
this.ternary_plot = new agriculture.TernaryPlot({
|
frm.doc.ternary_plot = new agriculture.TernaryPlot({
|
||||||
parent: frm.get_field("ternary_plot").$wrapper,
|
parent: frm.get_field("ternary_plot").$wrapper,
|
||||||
clay: frm.doc.clay_composition,
|
clay: frm.doc.clay_composition,
|
||||||
sand: frm.doc.sand_composition,
|
sand: frm.doc.sand_composition,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import flt, cint
|
from frappe.utils import flt, cint
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
class SoilTexture(Document):
|
class SoilTexture(Document):
|
||||||
soil_edit_order = [2, 1, 0]
|
soil_edit_order = [2, 1, 0]
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
class WaterAnalysis(Document):
|
class WaterAnalysis(Document):
|
||||||
def load_contents(self):
|
def load_contents(self):
|
||||||
|
|||||||
@@ -24,6 +24,15 @@ frappe.ui.form.on("Purchase Order", {
|
|||||||
|
|
||||||
frm.set_indicator_formatter('item_code',
|
frm.set_indicator_formatter('item_code',
|
||||||
function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" })
|
function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" })
|
||||||
|
|
||||||
|
frm.set_query("reserve_warehouse", "supplied_items", function() {
|
||||||
|
return {
|
||||||
|
filters: {
|
||||||
|
"company": frm.doc.company,
|
||||||
|
"is_group": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onload: function(frm) {
|
onload: function(frm) {
|
||||||
@@ -210,14 +219,14 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
]
|
]
|
||||||
|
|
||||||
me.dialog = new frappe.ui.Dialog({
|
me.dialog = new frappe.ui.Dialog({
|
||||||
title: title,fields: fields
|
title: title, fields: fields
|
||||||
});
|
});
|
||||||
|
|
||||||
if (me.frm.doc['supplied_items']) {
|
if (me.frm.doc['supplied_items']) {
|
||||||
me.frm.doc['supplied_items'].forEach((item, index) => {
|
me.frm.doc['supplied_items'].forEach((item, index) => {
|
||||||
if (item.rm_item_code && item.main_item_code) {
|
if (item.rm_item_code && item.main_item_code) {
|
||||||
me.raw_material_data.push ({
|
me.raw_material_data.push ({
|
||||||
'name':index,
|
'name':item.name,
|
||||||
'item_code': item.main_item_code,
|
'item_code': item.main_item_code,
|
||||||
'rm_item_code': item.rm_item_code,
|
'rm_item_code': item.rm_item_code,
|
||||||
'item_name': item.rm_item_code,
|
'item_name': item.rm_item_code,
|
||||||
|
|||||||
@@ -270,6 +270,40 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"description": "",
|
||||||
|
"fieldname": "company",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 1,
|
||||||
|
"label": "Company",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"oldfieldname": "company",
|
||||||
|
"oldfieldtype": "Link",
|
||||||
|
"options": "Company",
|
||||||
|
"permlevel": 0,
|
||||||
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 1,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -367,6 +401,70 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "eval:doc.docstatus===1",
|
||||||
|
"fieldname": "order_confirmation_no",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Order Confirmation No",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "eval:doc.order_confirmation_no",
|
||||||
|
"fieldname": "order_confirmation_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Order Confirmation Date",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -400,40 +498,6 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"description": "",
|
|
||||||
"fieldname": "company",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"label": "Company",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"oldfieldname": "company",
|
|
||||||
"oldfieldtype": "Link",
|
|
||||||
"options": "Company",
|
|
||||||
"permlevel": 0,
|
|
||||||
"print_hide": 1,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 1,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -3496,7 +3560,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-03-10 07:29:43.181140",
|
"modified": "2018-03-28 14:09:02.393746",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order",
|
"name": "Purchase Order",
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ from erpnext.stock.stock_balance import update_bin_qty, get_ordered_qty
|
|||||||
from frappe.desk.notifications import clear_doctype_notifications
|
from frappe.desk.notifications import clear_doctype_notifications
|
||||||
from erpnext.buying.utils import validate_for_items, check_for_closed_status
|
from erpnext.buying.utils import validate_for_items, check_for_closed_status
|
||||||
from erpnext.stock.utils import get_bin
|
from erpnext.stock.utils import get_bin
|
||||||
|
from six import string_types
|
||||||
|
|
||||||
form_grid_templates = {
|
form_grid_templates = {
|
||||||
"items": "templates/form_grid/item_grid.html"
|
"items": "templates/form_grid/item_grid.html"
|
||||||
@@ -248,7 +249,6 @@ class PurchaseOrder(BuyingController):
|
|||||||
'target_parent_dt': 'Sales Order',
|
'target_parent_dt': 'Sales Order',
|
||||||
'target_parent_field': '',
|
'target_parent_field': '',
|
||||||
'join_field': 'sales_order_item',
|
'join_field': 'sales_order_item',
|
||||||
'source_dt': 'Purchase Order Item',
|
|
||||||
'target_ref_field': 'stock_qty',
|
'target_ref_field': 'stock_qty',
|
||||||
'source_field': 'stock_qty'
|
'source_field': 'stock_qty'
|
||||||
})
|
})
|
||||||
@@ -407,24 +407,23 @@ def make_purchase_invoice(source_name, target_doc=None):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_rm_stock_entry(purchase_order, rm_items):
|
def make_rm_stock_entry(purchase_order, rm_items):
|
||||||
|
if isinstance(rm_items, string_types):
|
||||||
if isinstance(rm_items, basestring):
|
|
||||||
rm_items_list = json.loads(rm_items)
|
rm_items_list = json.loads(rm_items)
|
||||||
else:
|
else:
|
||||||
frappe.throw(_("No Items available for transfer"))
|
frappe.throw(_("No Items available for transfer"))
|
||||||
|
|
||||||
if rm_items_list:
|
if rm_items_list:
|
||||||
item_code_list = list(set(d["item_code"] for d in rm_items_list))
|
fg_items = list(set(d["item_code"] for d in rm_items_list))
|
||||||
else:
|
else:
|
||||||
frappe.throw(_("No Items selected for transfer"))
|
frappe.throw(_("No Items selected for transfer"))
|
||||||
|
|
||||||
if purchase_order:
|
if purchase_order:
|
||||||
purchase_order = frappe.get_doc("Purchase Order", purchase_order)
|
purchase_order = frappe.get_doc("Purchase Order", purchase_order)
|
||||||
|
|
||||||
if item_code_list:
|
if fg_items:
|
||||||
item_wh = frappe._dict(frappe.db.sql("""select item_code, description
|
items = tuple(set(d["rm_item_code"] for d in rm_items_list))
|
||||||
from `tabItem` where name in ({0})""".
|
item_wh = get_item_details(items)
|
||||||
format(", ".join(["%s"] * len(item_code_list))), item_code_list))
|
|
||||||
stock_entry = frappe.new_doc("Stock Entry")
|
stock_entry = frappe.new_doc("Stock Entry")
|
||||||
stock_entry.purpose = "Subcontract"
|
stock_entry.purpose = "Subcontract"
|
||||||
stock_entry.purchase_order = purchase_order.name
|
stock_entry.purchase_order = purchase_order.name
|
||||||
@@ -434,25 +433,35 @@ def make_rm_stock_entry(purchase_order, rm_items):
|
|||||||
stock_entry.address_display = purchase_order.address_display
|
stock_entry.address_display = purchase_order.address_display
|
||||||
stock_entry.company = purchase_order.company
|
stock_entry.company = purchase_order.company
|
||||||
stock_entry.to_warehouse = purchase_order.supplier_warehouse
|
stock_entry.to_warehouse = purchase_order.supplier_warehouse
|
||||||
stock_entry.from_bom = 1
|
|
||||||
for item_code in item_code_list:
|
for item_code in fg_items:
|
||||||
po_item = [d for d in purchase_order.items if d.item_code == item_code][0]
|
|
||||||
bom_no = po_item.bom
|
|
||||||
for rm_item_data in rm_items_list:
|
for rm_item_data in rm_items_list:
|
||||||
if rm_item_data["item_code"] == item_code:
|
if rm_item_data["item_code"] == item_code:
|
||||||
items_dict = {rm_item_data["rm_item_code"]:
|
rm_item_code = rm_item_data["rm_item_code"]
|
||||||
{"item_name":rm_item_data["item_name"],
|
items_dict = {
|
||||||
"description":item_wh.get(rm_item_data["rm_item_code"]),
|
rm_item_code: {
|
||||||
'qty':rm_item_data["qty"],
|
"item_name": rm_item_data["item_name"],
|
||||||
'from_warehouse':rm_item_data["warehouse"],
|
"description": item_wh[rm_item_code].get('description'),
|
||||||
'stock_uom':rm_item_data["stock_uom"],
|
'qty': rm_item_data["qty"],
|
||||||
'bom_no':bom_no}}
|
'from_warehouse': rm_item_data["warehouse"],
|
||||||
stock_entry.add_to_stock_entry_detail(items_dict, bom_no)
|
'stock_uom': rm_item_data["stock_uom"],
|
||||||
|
'allow_alternative_item': item_wh[rm_item_code].get('allow_alternative_item')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stock_entry.add_to_stock_entry_detail(items_dict)
|
||||||
return stock_entry.as_dict()
|
return stock_entry.as_dict()
|
||||||
else:
|
else:
|
||||||
frappe.throw(_("No Items selected for transfer"))
|
frappe.throw(_("No Items selected for transfer"))
|
||||||
return purchase_order.name
|
return purchase_order.name
|
||||||
|
|
||||||
|
def get_item_details(items):
|
||||||
|
item_details = {}
|
||||||
|
for d in frappe.db.sql("""select item_code, description, allow_alternative_item from `tabItem`
|
||||||
|
where name in ({0})""".format(", ".join(["%s"] * len(items))), items, as_dict=1):
|
||||||
|
item_details[d.item_code] = d
|
||||||
|
|
||||||
|
return item_details
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def update_status(status, name):
|
def update_status(status, name):
|
||||||
po = frappe.get_doc("Purchase Order", name)
|
po = frappe.get_doc("Purchase Order", name)
|
||||||
|
|||||||
@@ -199,8 +199,9 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
bin2 = frappe.db.get_value("Bin",
|
bin2 = frappe.db.get_value("Bin",
|
||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname=["reserved_qty_for_sub_contract", "projected_qty"], as_dict=1)
|
fieldname=["reserved_qty_for_sub_contract", "projected_qty"], as_dict=1)
|
||||||
self.assertEqual(bin2.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
|
|
||||||
self.assertEqual(bin2.projected_qty, bin1.projected_qty - 10)
|
self.assertEquals(bin2.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
|
||||||
|
self.assertEquals(bin2.projected_qty, bin1.projected_qty - 10)
|
||||||
|
|
||||||
# Create stock transfer
|
# Create stock transfer
|
||||||
rm_item = [{"item_code":"_Test FG Item","rm_item_code":"_Test Item","item_name":"_Test Item",
|
rm_item = [{"item_code":"_Test FG Item","rm_item_code":"_Test Item","item_name":"_Test Item",
|
||||||
@@ -215,7 +216,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin3.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
self.assertEquals(bin3.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
||||||
|
|
||||||
# close PO
|
# close PO
|
||||||
po.update_status("Closed")
|
po.update_status("Closed")
|
||||||
@@ -223,7 +224,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin4.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
self.assertEquals(bin4.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
||||||
|
|
||||||
# Re-open PO
|
# Re-open PO
|
||||||
po.update_status("Submitted")
|
po.update_status("Submitted")
|
||||||
@@ -231,7 +232,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin5.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
self.assertEquals(bin5.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
||||||
|
|
||||||
# make Purchase Receipt against PO
|
# make Purchase Receipt against PO
|
||||||
pr = make_purchase_receipt(po.name)
|
pr = make_purchase_receipt(po.name)
|
||||||
@@ -243,7 +244,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin6.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
self.assertEquals(bin6.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
||||||
|
|
||||||
# Cancel PR
|
# Cancel PR
|
||||||
pr.cancel()
|
pr.cancel()
|
||||||
@@ -251,7 +252,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin7.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
self.assertEquals(bin7.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
||||||
|
|
||||||
# Make Purchase Invoice
|
# Make Purchase Invoice
|
||||||
pi = make_purchase_invoice(po.name)
|
pi = make_purchase_invoice(po.name)
|
||||||
@@ -263,7 +264,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin8.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
self.assertEquals(bin8.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
||||||
|
|
||||||
# Cancel PR
|
# Cancel PR
|
||||||
pi.cancel()
|
pi.cancel()
|
||||||
@@ -271,14 +272,15 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin9.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
self.assertEquals(bin9.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
|
||||||
|
|
||||||
# Cancel Stock Entry
|
# Cancel Stock Entry
|
||||||
se.cancel()
|
se.cancel()
|
||||||
bin10 = frappe.db.get_value("Bin",
|
bin10 = frappe.db.get_value("Bin",
|
||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
self.assertEqual(bin10.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
|
|
||||||
|
self.assertEquals(bin10.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
|
||||||
|
|
||||||
# Cancel PO
|
# Cancel PO
|
||||||
po.reload()
|
po.reload()
|
||||||
@@ -287,7 +289,7 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
|
||||||
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
fieldname="reserved_qty_for_sub_contract", as_dict=1)
|
||||||
|
|
||||||
self.assertEqual(bin11.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
self.assertEquals(bin11.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
|
||||||
|
|
||||||
def get_same_items():
|
def get_same_items():
|
||||||
return [
|
return [
|
||||||
@@ -319,6 +321,7 @@ def create_purchase_order(**args):
|
|||||||
po.is_subcontracted = args.is_subcontracted or "No"
|
po.is_subcontracted = args.is_subcontracted or "No"
|
||||||
po.currency = args.currency or frappe.db.get_value("Company", po.company, "default_currency")
|
po.currency = args.currency or frappe.db.get_value("Company", po.company, "default_currency")
|
||||||
po.conversion_factor = args.conversion_factor or 1
|
po.conversion_factor = args.conversion_factor or 1
|
||||||
|
po.supplier_warehouse = args.supplier_warehouse or None
|
||||||
|
|
||||||
po.append("items", {
|
po.append("items", {
|
||||||
"item_code": args.item or args.item_code or "_Test Item",
|
"item_code": args.item or args.item_code or "_Test Item",
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 2,
|
"columns": 2,
|
||||||
"fieldname": "main_item_code",
|
"fieldname": "main_item_code",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "main_item_code",
|
"oldfieldname": "main_item_code",
|
||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
|
"options": "Item",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
@@ -39,6 +40,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -48,7 +50,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 2,
|
"columns": 2,
|
||||||
"fieldname": "rm_item_code",
|
"fieldname": "rm_item_code",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@@ -61,6 +63,7 @@
|
|||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "rm_item_code",
|
"oldfieldname": "rm_item_code",
|
||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
|
"options": "Item",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
@@ -70,6 +73,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -101,6 +105,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -133,6 +138,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -165,6 +171,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -194,6 +201,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -225,6 +233,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -256,6 +265,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -287,6 +297,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -319,6 +330,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -350,6 +362,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -363,7 +376,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-01-05 14:47:15.400785",
|
"modified": "2018-03-13 12:37:57.150914",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order Item Supplied",
|
"name": "Purchase Order Item Supplied",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
@@ -11,12 +12,13 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "main_item_code",
|
"fieldname": "main_item_code",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@@ -29,6 +31,7 @@
|
|||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "main_item_code",
|
"oldfieldname": "main_item_code",
|
||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
|
"options": "Item",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
@@ -38,15 +41,17 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "rm_item_code",
|
"fieldname": "rm_item_code",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@@ -59,6 +64,7 @@
|
|||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "rm_item_code",
|
"oldfieldname": "rm_item_code",
|
||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
|
"options": "Item",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
@@ -68,9 +74,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -99,10 +107,12 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "300px"
|
"width": "300px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -129,9 +139,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -157,9 +169,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -184,9 +198,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -214,9 +230,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -244,9 +262,11 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -275,9 +295,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -306,9 +328,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -337,9 +361,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -367,9 +393,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -397,9 +425,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -427,9 +457,11 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -457,20 +489,21 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-17 16:43:21.668443",
|
"modified": "2018-03-13 12:38:40.807453",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Receipt Item Supplied",
|
"name": "Purchase Receipt Item Supplied",
|
||||||
|
|||||||
@@ -67,10 +67,7 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({
|
|||||||
this.tree_grid = this.tree_grids[this.tree_type];
|
this.tree_grid = this.tree_grids[this.tree_type];
|
||||||
|
|
||||||
var std_columns = [
|
var std_columns = [
|
||||||
{id: "_check", name: __("Plot"), field: "_check", width: 30,
|
{id: "name", name: this.tree_grid.label, field: "name", width: 300},
|
||||||
formatter: this.check_formatter},
|
|
||||||
{id: "name", name: this.tree_grid.label, field: "name", width: 300,
|
|
||||||
formatter: this.tree_formatter},
|
|
||||||
{id: "total", name: "Total", field: "total", plot: false,
|
{id: "total", name: "Total", field: "total", plot: false,
|
||||||
formatter: this.currency_formatter}
|
formatter: this.currency_formatter}
|
||||||
];
|
];
|
||||||
@@ -103,8 +100,7 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({
|
|||||||
|
|
||||||
this.trigger_refresh_on_change(["value_or_qty", "tree_type", "based_on", "company"]);
|
this.trigger_refresh_on_change(["value_or_qty", "tree_type", "based_on", "company"]);
|
||||||
|
|
||||||
this.show_zero_check()
|
this.show_zero_check();
|
||||||
this.setup_chart_check();
|
|
||||||
},
|
},
|
||||||
init_filter_values: function() {
|
init_filter_values: function() {
|
||||||
this._super();
|
this._super();
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Lead",
|
"module_name": "Lead",
|
||||||
"icon": "octicon octicon-broadcast",
|
"icon": "octicon octicon-broadcast",
|
||||||
"type": "module",
|
|
||||||
"_doctype": "Lead",
|
"_doctype": "Lead",
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"link": "List/Lead"
|
"link": "List/Lead"
|
||||||
@@ -81,7 +80,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Stock",
|
"module_name": "Stock",
|
||||||
"color": "#f39c12",
|
"color": "#f39c12",
|
||||||
"icon": "fa fa-truck",
|
|
||||||
"icon": "octicon octicon-package",
|
"icon": "octicon octicon-package",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -96,7 +94,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Selling",
|
"module_name": "Selling",
|
||||||
"color": "#1abc9c",
|
"color": "#1abc9c",
|
||||||
"icon": "fa fa-tag",
|
|
||||||
"icon": "octicon octicon-tag",
|
"icon": "octicon octicon-tag",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -104,7 +101,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Buying",
|
"module_name": "Buying",
|
||||||
"color": "#c0392b",
|
"color": "#c0392b",
|
||||||
"icon": "fa fa-shopping-cart",
|
|
||||||
"icon": "octicon octicon-briefcase",
|
"icon": "octicon octicon-briefcase",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -112,7 +108,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "HR",
|
"module_name": "HR",
|
||||||
"color": "#2ecc71",
|
"color": "#2ecc71",
|
||||||
"icon": "fa fa-group",
|
|
||||||
"icon": "octicon octicon-organization",
|
"icon": "octicon octicon-organization",
|
||||||
"label": _("Human Resources"),
|
"label": _("Human Resources"),
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -121,7 +116,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Manufacturing",
|
"module_name": "Manufacturing",
|
||||||
"color": "#7f8c8d",
|
"color": "#7f8c8d",
|
||||||
"icon": "fa fa-cogs",
|
|
||||||
"icon": "octicon octicon-tools",
|
"icon": "octicon octicon-tools",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -145,7 +139,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Projects",
|
"module_name": "Projects",
|
||||||
"color": "#8e44ad",
|
"color": "#8e44ad",
|
||||||
"icon": "fa fa-puzzle-piece",
|
|
||||||
"icon": "octicon octicon-rocket",
|
"icon": "octicon octicon-rocket",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -153,7 +146,6 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"module_name": "Support",
|
"module_name": "Support",
|
||||||
"color": "#2c3e50",
|
"color": "#2c3e50",
|
||||||
"icon": "fa fa-phone",
|
|
||||||
"icon": "octicon octicon-issue-opened",
|
"icon": "octicon octicon-issue-opened",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"hidden": 1
|
"hidden": 1
|
||||||
@@ -336,7 +328,7 @@ def get_data():
|
|||||||
"color": "#009248",
|
"color": "#009248",
|
||||||
"icon": "/assets/erpnext/images/hub_logo.svg",
|
"icon": "/assets/erpnext/images/hub_logo.svg",
|
||||||
"type": "page",
|
"type": "page",
|
||||||
"link": "Hub/Home",
|
"link": "Hub/Item",
|
||||||
"label": _("Hub")
|
"label": _("Hub")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -135,6 +135,10 @@ def get_data():
|
|||||||
"name": "Assessment Plan Status",
|
"name": "Assessment Plan Status",
|
||||||
"doctype": "Assessment Plan"
|
"doctype": "Assessment Plan"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Student Report Generation Tool"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,5 +18,14 @@ def get_data():
|
|||||||
"description": _("GoCardless SEPA Mandate"),
|
"description": _("GoCardless SEPA Mandate"),
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Settings"),
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Woocommerce Settings"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -244,7 +244,11 @@ def get_data():
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Daily Work Summary Group"
|
"name": "Daily Work Summary Settings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Health Insurance"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ def get_data():
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "help",
|
"type": "help",
|
||||||
"label": _("Production Order"),
|
"label": _("Work Order"),
|
||||||
"youtube_id": "ZotgLyp2YFY"
|
"youtube_id": "ZotgLyp2YFY"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ def get_data():
|
|||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Production Order",
|
"name": "Work Order",
|
||||||
"description": _("Orders released for production."),
|
"description": _("Orders released for production."),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Production Plan",
|
"name": "Production Plan",
|
||||||
"description": _("Generate Material Requests (MRP) and Production Orders."),
|
"description": _("Generate Material Requests (MRP) and Work Orders."),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
@@ -92,26 +92,26 @@ def get_data():
|
|||||||
{
|
{
|
||||||
"type": "report",
|
"type": "report",
|
||||||
"is_query_report": True,
|
"is_query_report": True,
|
||||||
"name": "Open Production Orders",
|
"name": "Open Work Orders",
|
||||||
"doctype": "Production Order"
|
"doctype": "Work Order"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "report",
|
"type": "report",
|
||||||
"is_query_report": True,
|
"is_query_report": True,
|
||||||
"name": "Production Orders in Progress",
|
"name": "Work Orders in Progress",
|
||||||
"doctype": "Production Order"
|
"doctype": "Work Order"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "report",
|
"type": "report",
|
||||||
"is_query_report": True,
|
"is_query_report": True,
|
||||||
"name": "Issued Items Against Production Order",
|
"name": "Issued Items Against Work Order",
|
||||||
"doctype": "Production Order"
|
"doctype": "Work Order"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "report",
|
"type": "report",
|
||||||
"is_query_report": True,
|
"is_query_report": True,
|
||||||
"name": "Completed Production Orders",
|
"name": "Completed Work Orders",
|
||||||
"doctype": "Production Order"
|
"doctype": "Work Order"
|
||||||
},{
|
},{
|
||||||
"type": "page",
|
"type": "page",
|
||||||
"name": "production-analytics",
|
"name": "production-analytics",
|
||||||
@@ -143,7 +143,7 @@ def get_data():
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "help",
|
"type": "help",
|
||||||
"label": _("Production Order"),
|
"label": _("Work Order"),
|
||||||
"youtube_id": "ZotgLyp2YFY"
|
"youtube_id": "ZotgLyp2YFY"
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ def get_data():
|
|||||||
"name": "Project",
|
"name": "Project",
|
||||||
"description": _("Project master."),
|
"description": _("Project master."),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Project Update",
|
||||||
|
"description": _("Project Update."),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Task",
|
"name": "Task",
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ def get_data():
|
|||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Item",
|
"name": "Item",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Item Alternative",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Product Bundle",
|
"name": "Product Bundle",
|
||||||
|
|||||||
@@ -667,7 +667,9 @@ class AccountsController(TransactionBase):
|
|||||||
self.remove(item)
|
self.remove(item)
|
||||||
|
|
||||||
def set_payment_schedule(self):
|
def set_payment_schedule(self):
|
||||||
if self.doctype == 'Sales Invoice' and self.is_pos: return
|
if self.doctype == 'Sales Invoice' and self.is_pos:
|
||||||
|
self.payment_terms_template = ''
|
||||||
|
return
|
||||||
|
|
||||||
posting_date = self.get("bill_date") or self.get("posting_date") or self.get("transaction_date")
|
posting_date = self.get("bill_date") or self.get("posting_date") or self.get("transaction_date")
|
||||||
date = self.get("due_date")
|
date = self.get("due_date")
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from erpnext.accounts.party import get_party_details
|
|||||||
from erpnext.stock.get_item_details import get_conversion_factor
|
from erpnext.stock.get_item_details import get_conversion_factor
|
||||||
from erpnext.buying.utils import validate_for_items, update_last_purchase_rate
|
from erpnext.buying.utils import validate_for_items, update_last_purchase_rate
|
||||||
from erpnext.stock.stock_ledger import get_valuation_rate
|
from erpnext.stock.stock_ledger import get_valuation_rate
|
||||||
|
from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items
|
||||||
|
|
||||||
from erpnext.controllers.stock_controller import StockController
|
from erpnext.controllers.stock_controller import StockController
|
||||||
|
|
||||||
@@ -200,6 +201,11 @@ class BuyingController(StockController):
|
|||||||
exploded_item = item.get('include_exploded_items')
|
exploded_item = item.get('include_exploded_items')
|
||||||
|
|
||||||
bom_items = get_items_from_bom(item.item_code, item.bom, exploded_item)
|
bom_items = get_items_from_bom(item.item_code, item.bom, exploded_item)
|
||||||
|
|
||||||
|
used_alternative_items = []
|
||||||
|
if self.doctype == 'Purchase Receipt' and item.purchase_order:
|
||||||
|
used_alternative_items = get_used_alternative_items(purchase_order = item.purchase_order)
|
||||||
|
|
||||||
raw_materials_cost = 0
|
raw_materials_cost = 0
|
||||||
items = list(set([d.item_code for d in bom_items]))
|
items = list(set([d.item_code for d in bom_items]))
|
||||||
item_wh = frappe._dict(frappe.db.sql("""select item_code, default_warehouse
|
item_wh = frappe._dict(frappe.db.sql("""select item_code, default_warehouse
|
||||||
@@ -211,6 +217,16 @@ class BuyingController(StockController):
|
|||||||
if frappe.db.get_value("Warehouse", reserve_warehouse, "company") != self.company:
|
if frappe.db.get_value("Warehouse", reserve_warehouse, "company") != self.company:
|
||||||
reserve_warehouse = None
|
reserve_warehouse = None
|
||||||
|
|
||||||
|
conversion_factor = item.conversion_factor
|
||||||
|
if (self.doctype == 'Purchase Receipt' and item.purchase_order and
|
||||||
|
bom_item.item_code in used_alternative_items):
|
||||||
|
alternative_item_data = used_alternative_items.get(bom_item.item_code)
|
||||||
|
bom_item.item_code = alternative_item_data.item_code
|
||||||
|
bom_item.item_name = alternative_item_data.item_name
|
||||||
|
bom_item.stock_uom = alternative_item_data.stock_uom
|
||||||
|
conversion_factor = alternative_item_data.conversion_factor
|
||||||
|
bom_item.description = alternative_item_data.description
|
||||||
|
|
||||||
# check if exists
|
# check if exists
|
||||||
exists = 0
|
exists = 0
|
||||||
for d in self.get(raw_material_table):
|
for d in self.get(raw_material_table):
|
||||||
@@ -223,7 +239,7 @@ class BuyingController(StockController):
|
|||||||
rm = self.append(raw_material_table, {})
|
rm = self.append(raw_material_table, {})
|
||||||
|
|
||||||
required_qty = flt(flt(bom_item.qty_consumed_per_unit) * (flt(item.qty) + getattr(item, 'rejected_qty', 0)) *
|
required_qty = flt(flt(bom_item.qty_consumed_per_unit) * (flt(item.qty) + getattr(item, 'rejected_qty', 0)) *
|
||||||
flt(item.conversion_factor), rm.precision("required_qty"))
|
flt(conversion_factor), rm.precision("required_qty"))
|
||||||
rm.reference_name = item.name
|
rm.reference_name = item.name
|
||||||
rm.bom_detail_no = bom_item.name
|
rm.bom_detail_no = bom_item.name
|
||||||
rm.main_item_code = item.item_code
|
rm.main_item_code = item.item_code
|
||||||
@@ -233,7 +249,7 @@ class BuyingController(StockController):
|
|||||||
if self.doctype == "Purchase Order" and not rm.reserve_warehouse:
|
if self.doctype == "Purchase Order" and not rm.reserve_warehouse:
|
||||||
rm.reserve_warehouse = reserve_warehouse
|
rm.reserve_warehouse = reserve_warehouse
|
||||||
|
|
||||||
rm.conversion_factor = item.conversion_factor
|
rm.conversion_factor = conversion_factor
|
||||||
|
|
||||||
if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
||||||
rm.consumed_qty = required_qty
|
rm.consumed_qty = required_qty
|
||||||
|
|||||||
@@ -152,6 +152,11 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
||||||
conditions = []
|
conditions = []
|
||||||
|
|
||||||
|
description_cond = ''
|
||||||
|
if frappe.db.count('Item', cache=True) < 50000:
|
||||||
|
# scan description only if items are less than 50000
|
||||||
|
description_cond = 'or tabItem.description LIKE %(txt)s'
|
||||||
|
|
||||||
return frappe.db.sql("""select tabItem.name, tabItem.item_group,
|
return frappe.db.sql("""select tabItem.name, tabItem.item_group,
|
||||||
if(length(tabItem.item_name) > 40,
|
if(length(tabItem.item_name) > 40,
|
||||||
concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name,
|
concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name,
|
||||||
@@ -165,8 +170,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
|||||||
and (tabItem.`{key}` LIKE %(txt)s
|
and (tabItem.`{key}` LIKE %(txt)s
|
||||||
or tabItem.item_group LIKE %(txt)s
|
or tabItem.item_group LIKE %(txt)s
|
||||||
or tabItem.item_name LIKE %(txt)s
|
or tabItem.item_name LIKE %(txt)s
|
||||||
or tabItem.description LIKE %(txt)s)
|
or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s
|
||||||
or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s)
|
{description_cond}))
|
||||||
{fcond} {mcond}
|
{fcond} {mcond}
|
||||||
order by
|
order by
|
||||||
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
|
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
|
||||||
@@ -176,7 +181,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
|||||||
limit %(start)s, %(page_len)s """.format(
|
limit %(start)s, %(page_len)s """.format(
|
||||||
key=searchfield,
|
key=searchfield,
|
||||||
fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
|
fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
|
||||||
mcond=get_match_cond(doctype).replace('%', '%%')),
|
mcond=get_match_cond(doctype).replace('%', '%%'),
|
||||||
|
description_cond = description_cond),
|
||||||
{
|
{
|
||||||
"today": nowdate(),
|
"today": nowdate(),
|
||||||
"txt": "%%%s%%" % txt,
|
"txt": "%%%s%%" % txt,
|
||||||
|
|||||||
@@ -239,6 +239,7 @@ def make_return_doc(doctype, source_name, target_doc=None):
|
|||||||
target_doc.received_qty = -1* source_doc.received_qty
|
target_doc.received_qty = -1* source_doc.received_qty
|
||||||
target_doc.rejected_qty = -1* source_doc.rejected_qty
|
target_doc.rejected_qty = -1* source_doc.rejected_qty
|
||||||
target_doc.qty = -1* source_doc.qty
|
target_doc.qty = -1* source_doc.qty
|
||||||
|
target_doc.stock_qty = -1 * source_doc.stock_qty
|
||||||
target_doc.purchase_order = source_doc.purchase_order
|
target_doc.purchase_order = source_doc.purchase_order
|
||||||
target_doc.purchase_order_item = source_doc.purchase_order_item
|
target_doc.purchase_order_item = source_doc.purchase_order_item
|
||||||
target_doc.rejected_warehouse = source_doc.rejected_warehouse
|
target_doc.rejected_warehouse = source_doc.rejected_warehouse
|
||||||
@@ -246,6 +247,7 @@ def make_return_doc(doctype, source_name, target_doc=None):
|
|||||||
target_doc.received_qty = -1* source_doc.received_qty
|
target_doc.received_qty = -1* source_doc.received_qty
|
||||||
target_doc.rejected_qty = -1* source_doc.rejected_qty
|
target_doc.rejected_qty = -1* source_doc.rejected_qty
|
||||||
target_doc.qty = -1* source_doc.qty
|
target_doc.qty = -1* source_doc.qty
|
||||||
|
target_doc.stock_qty = -1 * source_doc.stock_qty
|
||||||
target_doc.purchase_order = source_doc.purchase_order
|
target_doc.purchase_order = source_doc.purchase_order
|
||||||
target_doc.purchase_receipt = source_doc.purchase_receipt
|
target_doc.purchase_receipt = source_doc.purchase_receipt
|
||||||
target_doc.rejected_warehouse = source_doc.rejected_warehouse
|
target_doc.rejected_warehouse = source_doc.rejected_warehouse
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ class SellingController(StockController):
|
|||||||
self.validate_max_discount()
|
self.validate_max_discount()
|
||||||
self.validate_selling_price()
|
self.validate_selling_price()
|
||||||
self.set_qty_as_per_stock_uom()
|
self.set_qty_as_per_stock_uom()
|
||||||
|
self.set_po_nos()
|
||||||
check_active_sales_items(self)
|
check_active_sales_items(self)
|
||||||
|
|
||||||
def set_missing_values(self, for_validate=False):
|
def set_missing_values(self, for_validate=False):
|
||||||
@@ -326,9 +327,16 @@ class SellingController(StockController):
|
|||||||
"actual_qty": -1*flt(d.qty),
|
"actual_qty": -1*flt(d.qty),
|
||||||
"incoming_rate": return_rate
|
"incoming_rate": return_rate
|
||||||
}))
|
}))
|
||||||
|
|
||||||
self.make_sl_entries(sl_entries)
|
self.make_sl_entries(sl_entries)
|
||||||
|
|
||||||
|
def set_po_nos(self):
|
||||||
|
if self.doctype in ("Delivery Note", "Sales Invoice") and hasattr(self, "items"):
|
||||||
|
ref_fieldname = "against_sales_order" if self.doctype == "Delivery Note" else "sales_order"
|
||||||
|
sales_orders = list(set([d.get(ref_fieldname) for d in self.items if d.get(ref_fieldname)]))
|
||||||
|
if sales_orders:
|
||||||
|
po_nos = frappe.get_all('Sales Order', 'po_no', filters = {'name': ('in', sales_orders)})
|
||||||
|
self.po_no = ', '.join(list(set([d.po_no for d in po_nos if d.po_no])))
|
||||||
|
|
||||||
def check_active_sales_items(obj):
|
def check_active_sales_items(obj):
|
||||||
for d in obj.get("items"):
|
for d in obj.get("items"):
|
||||||
if d.item_code:
|
if d.item_code:
|
||||||
|
|||||||
@@ -156,6 +156,9 @@ class StatusUpdater(Document):
|
|||||||
|
|
||||||
# get unique transactions to update
|
# get unique transactions to update
|
||||||
for d in self.get_all_children():
|
for d in self.get_all_children():
|
||||||
|
if hasattr(d, 'qty') and d.qty < 0 and not self.get('is_return'):
|
||||||
|
frappe.throw(_("For an item {0}, quantity must be positive number").format(d.item_code))
|
||||||
|
|
||||||
if d.doctype == args['source_dt'] and d.get(args["join_field"]):
|
if d.doctype == args['source_dt'] and d.get(args["join_field"]):
|
||||||
args['name'] = d.get(args['join_field'])
|
args['name'] = d.get(args['join_field'])
|
||||||
|
|
||||||
@@ -282,7 +285,7 @@ class StatusUpdater(Document):
|
|||||||
ifnull((select
|
ifnull((select
|
||||||
ifnull(sum(if(%(target_ref_field)s > %(target_field)s, abs(%(target_field)s), abs(%(target_ref_field)s))), 0)
|
ifnull(sum(if(%(target_ref_field)s > %(target_field)s, abs(%(target_field)s), abs(%(target_ref_field)s))), 0)
|
||||||
/ sum(abs(%(target_ref_field)s)) * 100
|
/ sum(abs(%(target_ref_field)s)) * 100
|
||||||
from `tab%(target_dt)s` where parent="%(name)s"), 0), 2)
|
from `tab%(target_dt)s` where parent="%(name)s" having sum(abs(%(target_ref_field)s)) > 0), 0), 6)
|
||||||
%(update_modified)s
|
%(update_modified)s
|
||||||
where name='%(name)s'""" % args)
|
where name='%(name)s'""" % args)
|
||||||
|
|
||||||
@@ -290,7 +293,7 @@ class StatusUpdater(Document):
|
|||||||
if args.get('status_field'):
|
if args.get('status_field'):
|
||||||
frappe.db.sql("""update `tab%(target_parent_dt)s`
|
frappe.db.sql("""update `tab%(target_parent_dt)s`
|
||||||
set %(status_field)s = if(%(target_parent_field)s<0.001,
|
set %(status_field)s = if(%(target_parent_field)s<0.001,
|
||||||
'Not %(keyword)s', if(%(target_parent_field)s>=99.99,
|
'Not %(keyword)s', if(%(target_parent_field)s>=99.999999,
|
||||||
'Fully %(keyword)s', 'Partly %(keyword)s'))
|
'Fully %(keyword)s', 'Partly %(keyword)s'))
|
||||||
where name='%(name)s'""" % args)
|
where name='%(name)s'""" % args)
|
||||||
|
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ class StockController(AccountsController):
|
|||||||
"company": self.company,
|
"company": self.company,
|
||||||
"batch_no": cstr(d.get("batch_no")).strip(),
|
"batch_no": cstr(d.get("batch_no")).strip(),
|
||||||
"serial_no": d.get("serial_no"),
|
"serial_no": d.get("serial_no"),
|
||||||
"project": d.get("project"),
|
"project": d.get("project") or self.get('project'),
|
||||||
"is_cancelled": self.docstatus==2 and "Yes" or "No"
|
"is_cancelled": self.docstatus==2 and "Yes" or "No"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,14 @@ erpnext.LeadController = frappe.ui.form.Controller.extend({
|
|||||||
if (this.frm.doc.organization_lead == 1) {
|
if (this.frm.doc.organization_lead == 1) {
|
||||||
this.frm.set_value("lead_name", this.frm.doc.company_name);
|
this.frm.set_value("lead_name", this.frm.doc.company_name);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
contact_date: function() {
|
||||||
|
if (this.frm.doc.contact_date) {
|
||||||
|
let d = moment(this.frm.doc.contact_date);
|
||||||
|
d.add(1, "hours");
|
||||||
|
this.frm.set_value("ends_on", d.format(moment.defaultDatetimeFormat));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 1,
|
"set_only_once": 1,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -71,6 +72,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -103,6 +105,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 1,
|
"set_only_once": 1,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -135,6 +138,7 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -166,6 +170,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -198,6 +203,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -226,6 +232,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
@@ -260,6 +267,7 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -291,6 +299,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -324,6 +333,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -357,6 +367,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -391,6 +402,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -421,6 +433,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -451,6 +464,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -484,8 +498,43 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "contact_by",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Next Contact By",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"oldfieldname": "contact_by",
|
||||||
|
"oldfieldtype": "Link",
|
||||||
|
"options": "User",
|
||||||
|
"permlevel": 0,
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0,
|
||||||
|
"width": "100px"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -513,6 +562,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -545,17 +595,18 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "contact_by",
|
"fieldname": "ends_on",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Datetime",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@@ -563,13 +614,11 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Next Contact By",
|
"label": "Ends On",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 1,
|
||||||
"oldfieldname": "contact_by",
|
|
||||||
"oldfieldtype": "Link",
|
|
||||||
"options": "User",
|
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
@@ -578,8 +627,8 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0,
|
"translatable": 0,
|
||||||
"width": "100px"
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
@@ -610,6 +659,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -640,6 +690,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -669,6 +720,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -697,6 +749,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -728,6 +781,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -760,6 +814,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -792,6 +847,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -824,6 +880,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -856,6 +913,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -887,6 +945,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -920,6 +979,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -951,6 +1011,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -983,6 +1044,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1015,6 +1077,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1047,6 +1110,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1079,6 +1143,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1108,6 +1173,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
@@ -1141,6 +1207,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1170,6 +1237,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1199,6 +1267,7 @@
|
|||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -1214,7 +1283,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-11-24 11:10:56.485917",
|
"modified": "2018-03-02 05:25:11.675481",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "CRM",
|
"module": "CRM",
|
||||||
"name": "Lead",
|
"name": "Lead",
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ class Lead(SellingController):
|
|||||||
self._prev = frappe._dict({
|
self._prev = frappe._dict({
|
||||||
"contact_date": frappe.db.get_value("Lead", self.name, "contact_date") if \
|
"contact_date": frappe.db.get_value("Lead", self.name, "contact_date") if \
|
||||||
(not cint(self.get("__islocal"))) else None,
|
(not cint(self.get("__islocal"))) else None,
|
||||||
|
"ends_on": frappe.db.get_value("Lead", self.name, "ends_on") if \
|
||||||
|
(not cint(self.get("__islocal"))) else None,
|
||||||
"contact_by": frappe.db.get_value("Lead", self.name, "contact_by") if \
|
"contact_by": frappe.db.get_value("Lead", self.name, "contact_by") if \
|
||||||
(not cint(self.get("__islocal"))) else None,
|
(not cint(self.get("__islocal"))) else None,
|
||||||
})
|
})
|
||||||
@@ -50,6 +52,10 @@ class Lead(SellingController):
|
|||||||
if self.contact_date and getdate(self.contact_date) < getdate(nowdate()):
|
if self.contact_date and getdate(self.contact_date) < getdate(nowdate()):
|
||||||
frappe.throw(_("Next Contact Date cannot be in the past"))
|
frappe.throw(_("Next Contact Date cannot be in the past"))
|
||||||
|
|
||||||
|
if self.ends_on and self.contact_date and\
|
||||||
|
(self.ends_on < self.contact_date):
|
||||||
|
frappe.throw(_("Ends On date cannot be before Next Contact Date."))
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
self.add_calendar_event()
|
self.add_calendar_event()
|
||||||
|
|
||||||
@@ -57,6 +63,7 @@ class Lead(SellingController):
|
|||||||
super(Lead, self).add_calendar_event({
|
super(Lead, self).add_calendar_event({
|
||||||
"owner": self.lead_owner,
|
"owner": self.lead_owner,
|
||||||
"starts_on": self.contact_date,
|
"starts_on": self.contact_date,
|
||||||
|
"ends_on": self.ends_on or "",
|
||||||
"subject": ('Contact ' + cstr(self.lead_name)),
|
"subject": ('Contact ' + cstr(self.lead_name)),
|
||||||
"description": ('Contact ' + cstr(self.lead_name)) + \
|
"description": ('Contact ' + cstr(self.lead_name)) + \
|
||||||
(self.contact_by and ('. By : ' + cstr(self.contact_by)) or '')
|
(self.contact_by and ('. By : ' + cstr(self.contact_by)) or '')
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ frappe.ui.form.on("Opportunity", {
|
|||||||
frm.trigger('set_contact_link');
|
frm.trigger('set_contact_link');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
with_items: function(frm) {
|
||||||
|
frm.trigger('toggle_mandatory');
|
||||||
|
},
|
||||||
|
|
||||||
customer_address: function(frm, cdt, cdn) {
|
customer_address: function(frm, cdt, cdn) {
|
||||||
erpnext.utils.get_address_display(frm, 'customer_address', 'address_display', false);
|
erpnext.utils.get_address_display(frm, 'customer_address', 'address_display', false);
|
||||||
},
|
},
|
||||||
@@ -35,6 +39,7 @@ frappe.ui.form.on("Opportunity", {
|
|||||||
var doc = frm.doc;
|
var doc = frm.doc;
|
||||||
frm.events.enquiry_from(frm);
|
frm.events.enquiry_from(frm);
|
||||||
frm.trigger('set_contact_link');
|
frm.trigger('set_contact_link');
|
||||||
|
frm.trigger('toggle_mandatory');
|
||||||
erpnext.toggle_naming_series();
|
erpnext.toggle_naming_series();
|
||||||
|
|
||||||
if(!doc.__islocal && doc.status!=="Lost") {
|
if(!doc.__islocal && doc.status!=="Lost") {
|
||||||
@@ -82,6 +87,10 @@ frappe.ui.form.on("Opportunity", {
|
|||||||
method: "erpnext.crm.doctype.opportunity.opportunity.make_supplier_quotation",
|
method: "erpnext.crm.doctype.opportunity.opportunity.make_supplier_quotation",
|
||||||
frm: cur_frm
|
frm: cur_frm
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toggle_mandatory: function(frm) {
|
||||||
|
frm.toggle_reqd("items", frm.doc.with_items ? 1:0);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ frappe.query_reports["Minutes to First Response for Opportunity"] = {
|
|||||||
data: {
|
data: {
|
||||||
labels: result.map(d => d[0]),
|
labels: result.map(d => d[0]),
|
||||||
datasets: [{
|
datasets: [{
|
||||||
title: 'Mins to first response',
|
name: 'Mins to first response',
|
||||||
values: result.map(d => d[1])
|
values: result.map(d => d[1])
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -34,14 +34,14 @@ def work():
|
|||||||
payroll_entry.salary_slip_based_on_timesheet = 0
|
payroll_entry.salary_slip_based_on_timesheet = 0
|
||||||
payroll_entry.create_salary_slips()
|
payroll_entry.create_salary_slips()
|
||||||
payroll_entry.submit_salary_slips()
|
payroll_entry.submit_salary_slips()
|
||||||
payroll_entry.make_accural_jv_entry()
|
payroll_entry.make_accrual_jv_entry()
|
||||||
# payroll_entry.make_journal_entry(reference_date=frappe.flags.current_date,
|
# payroll_entry.make_journal_entry(reference_date=frappe.flags.current_date,
|
||||||
# reference_number=random_string(10))
|
# reference_number=random_string(10))
|
||||||
|
|
||||||
payroll_entry.salary_slip_based_on_timesheet = 1
|
payroll_entry.salary_slip_based_on_timesheet = 1
|
||||||
payroll_entry.create_salary_slips()
|
payroll_entry.create_salary_slips()
|
||||||
payroll_entry.submit_salary_slips()
|
payroll_entry.submit_salary_slips()
|
||||||
payroll_entry.make_accural_jv_entry()
|
payroll_entry.make_accrual_jv_entry()
|
||||||
# payroll_entry.make_journal_entry(reference_date=frappe.flags.current_date,
|
# payroll_entry.make_journal_entry(reference_date=frappe.flags.current_date,
|
||||||
# reference_number=random_string(10))
|
# reference_number=random_string(10))
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import frappe, random, erpnext
|
|||||||
from frappe.utils.make_random import how_many
|
from frappe.utils.make_random import how_many
|
||||||
from frappe.desk import query_report
|
from frappe.desk import query_report
|
||||||
from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError
|
from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError
|
||||||
from erpnext.manufacturing.doctype.production_order.test_production_order import make_prod_order_test_record
|
from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
|
||||||
|
|
||||||
def work():
|
def work():
|
||||||
frappe.set_user(frappe.db.get_global('demo_manufacturing_user'))
|
frappe.set_user(frappe.db.get_global('demo_manufacturing_user'))
|
||||||
@@ -21,13 +21,13 @@ def work():
|
|||||||
ppt.purchase_request_for_warehouse = "Stores - WPL"
|
ppt.purchase_request_for_warehouse = "Stores - WPL"
|
||||||
ppt.run_method("get_open_sales_orders")
|
ppt.run_method("get_open_sales_orders")
|
||||||
ppt.run_method("get_items")
|
ppt.run_method("get_items")
|
||||||
ppt.run_method("raise_production_orders")
|
ppt.run_method("raise_work_orders")
|
||||||
ppt.run_method("raise_material_requests")
|
ppt.run_method("raise_material_requests")
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
|
|
||||||
# submit production orders
|
# submit work orders
|
||||||
for pro in frappe.db.get_values("Production Order", {"docstatus": 0}, "name"):
|
for pro in frappe.db.get_values("Work Order", {"docstatus": 0}, "name"):
|
||||||
b = frappe.get_doc("Production Order", pro[0])
|
b = frappe.get_doc("Work Order", pro[0])
|
||||||
b.wip_warehouse = "Work in Progress - WPL"
|
b.wip_warehouse = "Work in Progress - WPL"
|
||||||
b.submit()
|
b.submit()
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
@@ -40,16 +40,16 @@ def work():
|
|||||||
|
|
||||||
# stores -> wip
|
# stores -> wip
|
||||||
if random.random() < 0.3:
|
if random.random() < 0.3:
|
||||||
for pro in query_report.run("Open Production Orders")["result"][:how_many("Stock Entry for WIP")]:
|
for pro in query_report.run("Open Work Orders")["result"][:how_many("Stock Entry for WIP")]:
|
||||||
make_stock_entry_from_pro(pro[0], "Material Transfer for Manufacture")
|
make_stock_entry_from_pro(pro[0], "Material Transfer for Manufacture")
|
||||||
|
|
||||||
# wip -> fg
|
# wip -> fg
|
||||||
if random.random() < 0.3:
|
if random.random() < 0.3:
|
||||||
for pro in query_report.run("Production Orders in Progress")["result"][:how_many("Stock Entry for FG")]:
|
for pro in query_report.run("Work Orders in Progress")["result"][:how_many("Stock Entry for FG")]:
|
||||||
make_stock_entry_from_pro(pro[0], "Manufacture")
|
make_stock_entry_from_pro(pro[0], "Manufacture")
|
||||||
|
|
||||||
for bom in frappe.get_all('BOM', fields=['item'], filters = {'with_operations': 1}):
|
for bom in frappe.get_all('BOM', fields=['item'], filters = {'with_operations': 1}):
|
||||||
pro_order = make_prod_order_test_record(item=bom.item, qty=2,
|
pro_order = make_wo_order_test_record(item=bom.item, qty=2,
|
||||||
source_warehouse="Stores - WPL", wip_warehouse = "Work in Progress - WPL",
|
source_warehouse="Stores - WPL", wip_warehouse = "Work in Progress - WPL",
|
||||||
fg_warehouse = "Stores - WPL", company = erpnext.get_default_company(),
|
fg_warehouse = "Stores - WPL", company = erpnext.get_default_company(),
|
||||||
stock_uom = frappe.db.get_value('Item', bom.item, 'stock_uom'),
|
stock_uom = frappe.db.get_value('Item', bom.item, 'stock_uom'),
|
||||||
@@ -57,7 +57,7 @@ def work():
|
|||||||
|
|
||||||
# submit time logs
|
# submit time logs
|
||||||
for timesheet in frappe.get_all("Timesheet", ["name"], {"docstatus": 0,
|
for timesheet in frappe.get_all("Timesheet", ["name"], {"docstatus": 0,
|
||||||
"production_order": ("!=", ""), "to_time": ("<", frappe.flags.current_date)}):
|
"work_order": ("!=", ""), "to_time": ("<", frappe.flags.current_date)}):
|
||||||
timesheet = frappe.get_doc("Timesheet", timesheet.name)
|
timesheet = frappe.get_doc("Timesheet", timesheet.name)
|
||||||
try:
|
try:
|
||||||
timesheet.submit()
|
timesheet.submit()
|
||||||
@@ -68,10 +68,10 @@ def work():
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def make_stock_entry_from_pro(pro_id, purpose):
|
def make_stock_entry_from_pro(pro_id, purpose):
|
||||||
from erpnext.manufacturing.doctype.production_order.production_order import make_stock_entry
|
from erpnext.manufacturing.doctype.work_order.work_order import make_stock_entry
|
||||||
from erpnext.stock.stock_ledger import NegativeStockError
|
from erpnext.stock.stock_ledger import NegativeStockError
|
||||||
from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \
|
from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \
|
||||||
DuplicateEntryForProductionOrderError, OperationsNotCompleteError
|
DuplicateEntryForWorkOrderError, OperationsNotCompleteError
|
||||||
|
|
||||||
try:
|
try:
|
||||||
st = frappe.get_doc(make_stock_entry(pro_id, purpose))
|
st = frappe.get_doc(make_stock_entry(pro_id, purpose))
|
||||||
@@ -83,6 +83,6 @@ def make_stock_entry_from_pro(pro_id, purpose):
|
|||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
st.submit()
|
st.submit()
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForProductionOrderError,
|
except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForWorkOrderError,
|
||||||
OperationsNotCompleteError):
|
OperationsNotCompleteError):
|
||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 8.7 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
BIN
erpnext/docs/assets/img/human-resources/health-insurance.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
erpnext/docs/assets/img/human-resources/insurance-no.gif
Normal file
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 64 KiB |
BIN
erpnext/docs/assets/img/manufacturing/allow-alternative-item.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 296 KiB |
BIN
erpnext/docs/assets/img/manufacturing/consumed-qty.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
erpnext/docs/assets/img/manufacturing/item-alternative.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 209 KiB |
|
After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 261 KiB |
|
After Width: | Height: | Size: 2.9 MiB |
BIN
erpnext/docs/assets/img/manufacturing/work-order.png
Normal file
|
After Width: | Height: | Size: 257 KiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 353 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 92 KiB |