Merge pull request #9372 from pratu16x7/serial-batch-entry
Serial no/batch entry dialog
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 7526f37..36bf1bf 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -2,7 +2,7 @@
from __future__ import unicode_literals
import frappe
-__version__ = '8.1.1'
+__version__ = '8.1.3'
def get_default_company(user=None):
diff --git a/erpnext/accounts/doctype/bank_reconciliation_detail/bank_reconciliation_detail.json b/erpnext/accounts/doctype/bank_reconciliation_detail/bank_reconciliation_detail.json
index 2e4af26..a23c0aa 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_detail/bank_reconciliation_detail.json
+++ b/erpnext/accounts/doctype/bank_reconciliation_detail/bank_reconciliation_detail.json
@@ -1,5 +1,6 @@
{
"allow_copy": 0,
+ "allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
@@ -10,6 +11,7 @@
"editable_grid": 1,
"fields": [
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -20,7 +22,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 0,
+ "in_standard_filter": 0,
"label": "Payment Document",
"length": 0,
"no_copy": 0,
@@ -30,6 +34,7 @@
"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,
@@ -37,17 +42,20 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "columns": 1,
+ "columns": 2,
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
+ "in_standard_filter": 0,
"label": "Payment Entry",
"length": 0,
"no_copy": 0,
@@ -58,6 +66,7 @@
"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,
@@ -66,6 +75,7 @@
"width": "50"
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -76,7 +86,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
+ "in_standard_filter": 0,
"label": "Against Account",
"length": 0,
"no_copy": 0,
@@ -86,6 +98,7 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
@@ -94,6 +107,7 @@
"width": "15"
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -104,7 +118,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
+ "in_standard_filter": 0,
"label": "Amount",
"length": 0,
"no_copy": 0,
@@ -115,6 +131,7 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
@@ -122,6 +139,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -132,7 +150,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 0,
+ "in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@@ -140,6 +160,7 @@
"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,
@@ -148,6 +169,7 @@
"width": "50%"
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -158,7 +180,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 0,
+ "in_standard_filter": 0,
"label": "Posting Date",
"length": 0,
"no_copy": 0,
@@ -168,6 +192,7 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
@@ -175,17 +200,20 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "columns": 1,
+ "columns": 2,
"fieldname": "cheque_number",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
+ "in_standard_filter": 0,
"label": "Cheque Number",
"length": 0,
"no_copy": 0,
@@ -195,6 +223,7 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
@@ -202,6 +231,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -212,7 +242,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 0,
+ "in_standard_filter": 0,
"label": "Cheque Date",
"length": 0,
"no_copy": 0,
@@ -222,6 +254,7 @@
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
@@ -229,6 +262,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -239,7 +273,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
+ "in_standard_filter": 0,
"label": "Clearance Date",
"length": 0,
"no_copy": 0,
@@ -249,6 +285,7 @@
"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,
@@ -256,18 +293,18 @@
"unique": 0
}
],
+ "has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 1,
"image_view": 0,
"in_create": 0,
- "in_dialog": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2016-11-17 11:39:00.308624",
+ "modified": "2017-06-23 12:07:50.883515",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Reconciliation Detail",
@@ -276,6 +313,8 @@
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
+ "show_name_in_global_search": 0,
"sort_order": "ASC",
+ "track_changes": 0,
"track_seen": 0
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 10bd3a0..4a1685b 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -502,8 +502,20 @@
}
}
}
-
-
+
+ frm.set_query('company_address', function(doc) {
+ if(!doc.company) {
+ frappe.throw(_('Please set Company'));
+ }
+
+ return {
+ query: 'frappe.contacts.doctype.address.address.address_query',
+ filters: {
+ link_doctype: 'Company',
+ link_name: doc.company
+ }
+ };
+ });
},
project: function(frm){
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index f257efe..36a66c6 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -940,22 +940,22 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "",
- "fieldname": "customer_group",
+ "fieldname": "company_address",
"fieldtype": "Link",
- "hidden": 1,
+ "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": "Customer Group",
+ "label": "Company Address",
"length": 0,
"no_copy": 0,
- "options": "Customer Group",
+ "options": "Address",
"permlevel": 0,
- "print_hide": 1,
+ "precision": "",
+ "print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
@@ -3495,6 +3495,37 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "description": "",
+ "fieldname": "customer_group",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Customer Group",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Customer Group",
+ "permlevel": 0,
+ "print_hide": 1,
+ "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,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"depends_on": "",
"fieldname": "campaign",
"fieldtype": "Link",
@@ -4596,7 +4627,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-06-16 17:07:55.483734",
+ "modified": "2017-06-22 14:45:35.257640",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 85c5079..fd4598c 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -54,7 +54,10 @@
def validate(self):
super(SalesInvoice, self).validate()
self.validate_auto_set_posting_time()
- self.so_dn_required()
+
+ if not self.is_pos:
+ self.so_dn_required()
+
self.validate_proj_cust()
self.validate_with_previous_doc()
self.validate_uom_is_integer("stock_uom", "stock_qty")
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
index 2bbce60..02d5428 100644
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -576,11 +576,15 @@
})
$(this.numeric_keypad).find('.numeric-del').click(function(){
- me.selected_field = $(me.wrapper).find('.selected-item').find('.' + me.numeric_id)
- me.numeric_val = cstr(flt(me.selected_field.val())).slice(0, -1);
- me.selected_field.val(me.numeric_val);
- me.selected_field.trigger("change")
- // me.render_selected_item()
+ if(me.numeric_id) {
+ me.selected_field = $(me.wrapper).find('.selected-item').find('.' + me.numeric_id)
+ me.numeric_val = cstr(flt(me.selected_field.val())).slice(0, -1);
+ me.selected_field.val(me.numeric_val);
+ me.selected_field.trigger("change")
+ } else {
+ //Remove an item from the cart, if focus is at selected item
+ me.remove_selected_item()
+ }
})
$(this.numeric_keypad).find('.pos-pay').click(function(){
@@ -591,6 +595,14 @@
})
},
+ remove_selected_item: function() {
+ this.remove_item = []
+ idx = $(this.wrapper).find(".pos-selected-item-action").attr("data-idx")
+ this.remove_item.push(idx)
+ this.remove_zero_qty_item()
+ this.update_paid_amount_status(false)
+ },
+
render_list_customers: function () {
var me = this;
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 5c6a6df..355803b 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -7,11 +7,12 @@
import datetime
from frappe import _, msgprint, scrub
from frappe.defaults import get_user_permissions
+from frappe.model.utils import get_fetch_values
from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff, \
add_years, get_timestamp, nowdate, flt
from frappe.contacts.doctype.address.address import get_address_display, get_default_address
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
-from erpnext.exceptions import PartyFrozen, InvalidCurrency, PartyDisabled, InvalidAccountCurrency
+from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency
from erpnext.accounts.utils import get_fiscal_year
from erpnext import get_default_currency
@@ -42,7 +43,7 @@
party = frappe.get_doc(party_type, party)
- set_address_details(out, party, party_type)
+ set_address_details(out, party, party_type, doctype, company)
set_contact_details(out, party, party_type)
set_other_values(out, party, party_type)
set_price_list(out, party, party_type, price_list)
@@ -60,10 +61,11 @@
return out
-def set_address_details(out, party, party_type):
+def set_address_details(out, party, party_type, doctype=None, company=None):
billing_address_field = "customer_address" if party_type == "Lead" \
else party_type.lower() + "_address"
out[billing_address_field] = get_default_address(party_type, party.name)
+ out.update(get_fetch_values(doctype, billing_address_field, out[billing_address_field]))
# address display
out.address_display = get_address_display(out[billing_address_field])
@@ -72,6 +74,11 @@
if party_type in ["Customer", "Lead"]:
out.shipping_address_name = get_default_address(party_type, party.name, 'is_shipping_address')
out.shipping_address = get_address_display(out["shipping_address_name"])
+ out.update(get_fetch_values(doctype, 'shipping_address_name', out.shipping_address_name))
+
+ if doctype and doctype in ['Sales Invoice']:
+ out.company_address = get_default_address('Company', company)
+ out.update(get_fetch_values(doctype, 'company_address', out.company_address))
def set_contact_details(out, party, party_type):
out.contact_person = get_default_contact(party_type, party.name)
@@ -363,28 +370,28 @@
out.update({ timestamp: count })
return out
-
+
def get_dashboard_info(party_type, party):
current_fiscal_year = get_fiscal_year(nowdate(), as_dict=True)
company = frappe.db.get_default("company") or frappe.get_all("Company")[0].name
party_account_currency = get_party_account_currency(party_type, party, company)
company_default_currency = get_default_currency() \
or frappe.db.get_value('Company', company, 'default_currency')
-
+
if party_account_currency==company_default_currency:
total_field = "base_grand_total"
else:
total_field = "grand_total"
-
+
doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice"
-
+
billing_this_year = frappe.db.sql("""
select sum({0})
from `tab{1}`
where {2}=%s and docstatus=1 and posting_date between %s and %s
- """.format(total_field, doctype, party_type.lower()),
+ """.format(total_field, doctype, party_type.lower()),
(party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))
-
+
total_unpaid = frappe.db.sql("""
select sum(debit_in_account_currency) - sum(credit_in_account_currency)
from `tabGL Entry`
@@ -396,5 +403,5 @@
info["total_unpaid"] = flt(total_unpaid[0][0]) if total_unpaid else 0
if party_type == "Supplier":
info["total_unpaid"] = -1 * info["total_unpaid"]
-
+
return info
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js
index b519965..e5c55de 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.js
+++ b/erpnext/accounts/report/general_ledger/general_ledger.js
@@ -75,7 +75,7 @@
}
return party_type;
},
- change: function() {
+ on_change: function() {
var party_type = frappe.query_report_filters_by_name.party_type.get_value();
var party = frappe.query_report_filters_by_name.party.get_value();
if(!party_type || !party) {
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index 1d417da..0d1eba1 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -7,11 +7,14 @@
from frappe.utils import flt
def execute(filters=None):
+ return _execute(filters)
+
+def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
if not filters: filters = {}
- columns = get_columns()
+ columns = get_columns(additional_table_columns)
last_col = len(columns)
- item_list = get_items(filters)
+ item_list = get_items(filters, additional_query_columns)
aii_account_map = get_aii_accounts()
if item_list:
item_row_tax, tax_accounts = get_tax_accounts(item_list, columns)
@@ -23,7 +26,7 @@
"width": 80
})
company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
-
+
data = []
for d in item_list:
purchase_receipt = None
@@ -35,8 +38,16 @@
expense_account = d.expense_account or aii_account_map.get(d.company)
row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.supplier,
- d.supplier_name, d.credit_to, d.mode_of_payment, d.project, d.company, d.purchase_order,
- purchase_receipt, expense_account, d.qty, d.base_net_rate, d.base_net_amount]
+ d.supplier_name]
+
+ if additional_query_columns:
+ for col in additional_query_columns:
+ row.append(d.get(col))
+
+ row += [
+ d.credit_to, d.mode_of_payment, d.project, d.company, d.purchase_order,
+ purchase_receipt, expense_account, d.qty, d.base_net_rate, d.base_net_amount
+ ]
for tax in tax_accounts:
row.append(item_row_tax.get(d.name, {}).get(tax, 0))
@@ -49,17 +60,27 @@
return columns, data
-def get_columns():
- return [_("Item Code") + ":Link/Item:120", _("Item Name") + "::120",
+def get_columns(additional_table_columns):
+ columns = [
+ _("Item Code") + ":Link/Item:120", _("Item Name") + "::120",
_("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Purchase Invoice:120",
_("Posting Date") + ":Date:80", _("Supplier") + ":Link/Supplier:120",
- "Supplier Name::120", "Payable Account:Link/Account:120",
+ "Supplier Name::120"
+ ]
+
+ if additional_table_columns:
+ columns += additional_table_columns
+
+ columns += [
+ "Payable Account:Link/Account:120",
_("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
_("Company") + ":Link/Company:100", _("Purchase Order") + ":Link/Purchase Order:100",
_("Purchase Receipt") + ":Link/Purchase Receipt:100", _("Expense Account") + ":Link/Account:140",
_("Qty") + ":Float:120", _("Rate") + ":Currency/currency:120", _("Amount") + ":Currency/currency:120"
]
+ return columns
+
def get_conditions(filters):
conditions = ""
@@ -74,21 +95,23 @@
return conditions
-def get_items(filters):
+def get_items(filters, additional_query_columns):
conditions = get_conditions(filters)
match_conditions = frappe.build_match_conditions("Purchase Invoice")
+ if additional_query_columns:
+ additional_query_columns = ', ' + ', '.join(additional_query_columns)
return frappe.db.sql("""
- select
+ select
pi_item.name, pi_item.parent, pi.posting_date, pi.credit_to, pi.company,
- pi.supplier, pi.remarks, pi.base_net_total, pi_item.item_code, pi_item.item_name,
- pi_item.item_group, pi_item.project, pi_item.purchase_order, pi_item.purchase_receipt,
- pi_item.po_detail, pi_item.expense_account, pi_item.qty, pi_item.base_net_rate,
- pi_item.base_net_amount, pi.supplier_name, pi.mode_of_payment
+ pi.supplier, pi.remarks, pi.base_net_total, pi_item.item_code, pi_item.item_name,
+ pi_item.item_group, pi_item.project, pi_item.purchase_order, pi_item.purchase_receipt,
+ pi_item.po_detail, pi_item.expense_account, pi_item.qty, pi_item.base_net_rate,
+ pi_item.base_net_amount, pi.supplier_name, pi.mode_of_payment {0}
from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
where pi.name = pi_item.parent and pi.docstatus = 1 %s %s
order by pi.posting_date desc, pi_item.item_code desc
- """ % (conditions, match_conditions), filters, as_dict=1)
+ """.format(additional_query_columns) % (conditions, match_conditions), filters, as_dict=1)
def get_aii_accounts():
return dict(frappe.db.sql("select name, stock_received_but_not_billed from tabCompany"))
@@ -104,11 +127,11 @@
item_row_map.setdefault(d.parent, {}).setdefault(d.item_code, []).append(d)
tax_details = frappe.db.sql("""
- select
+ select
parent, account_head, item_wise_tax_detail, charge_type, base_tax_amount_after_discount_amount
- from `tabPurchase Taxes and Charges`
- where parenttype = 'Purchase Invoice' and docstatus = 1
- and (account_head is not null and account_head != '')
+ from `tabPurchase Taxes and Charges`
+ where parenttype = 'Purchase Invoice' and docstatus = 1
+ and (account_head is not null and account_head != '')
and category in ('Total', 'Valuation and Total')
and parent in (%s)
""" % ', '.join(['%s']*len(invoice_item_row)), tuple(invoice_item_row.keys()))
@@ -120,17 +143,17 @@
if item_wise_tax_detail:
try:
item_wise_tax_detail = json.loads(item_wise_tax_detail)
-
+
for item_code, tax_amount in item_wise_tax_detail.items():
tax_amount = flt(tax_amount[1]) if isinstance(tax_amount, list) else flt(tax_amount)
-
- item_net_amount = sum([flt(d.base_net_amount)
+
+ item_net_amount = sum([flt(d.base_net_amount)
for d in item_row_map.get(parent, {}).get(item_code, [])])
-
+
for d in item_row_map.get(parent, {}).get(item_code, []):
item_tax_amount = flt((tax_amount * d.base_net_amount) / item_net_amount) if item_net_amount else 0
item_row_tax.setdefault(d.name, {})[account_head] = item_tax_amount
-
+
except ValueError:
continue
elif charge_type == "Actual" and tax_amount:
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index 1322649..19f74a6 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -8,11 +8,14 @@
from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments
def execute(filters=None):
+ return _execute(filters)
+
+def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
if not filters: filters = {}
- columns = get_columns()
+ columns = get_columns(additional_table_columns)
last_col = len(columns)
- item_list = get_items(filters)
+ item_list = get_items(filters, additional_query_columns)
if item_list:
item_row_tax, tax_accounts = get_tax_accounts(item_list, columns)
columns.append({
@@ -35,10 +38,17 @@
if not delivery_note and d.update_stock:
delivery_note = d.parent
- row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.customer, d.customer_name,
- d.customer_group, d.debit_to, ", ".join(mode_of_payments.get(d.parent, [])),
+ row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.customer, d.customer_name]
+
+ if additional_query_columns:
+ for col in additional_query_columns:
+ row.append(d.get(col))
+
+ row += [
+ d.customer_group, d.debit_to, ", ".join(mode_of_payments.get(d.parent, [])),
d.territory, d.project, d.company, d.sales_order,
- delivery_note, d.income_account, d.cost_center, d.qty, d.base_net_rate, d.base_net_amount]
+ delivery_note, d.income_account, d.cost_center, d.qty, d.base_net_rate, d.base_net_amount
+ ]
for tax in tax_accounts:
row.append(item_row_tax.get(d.name, {}).get(tax, 0))
@@ -50,12 +60,18 @@
return columns, data
-def get_columns():
- return [
+def get_columns(additional_table_columns):
+ columns = [
_("Item Code") + ":Link/Item:120", _("Item Name") + "::120",
_("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Sales Invoice:120",
_("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120",
- _("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120",
+ _("Customer Name") + "::120"]
+
+ if additional_table_columns:
+ columns += additional_table_columns
+
+ columns += [
+ _("Customer Group") + ":Link/Customer Group:120",
_("Receivable Account") + ":Link/Account:120",
_("Mode of Payment") + "::120", _("Territory") + ":Link/Territory:80",
_("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100",
@@ -66,6 +82,8 @@
_("Amount") + ":Currency/currency:120"
]
+ return columns
+
def get_conditions(filters):
conditions = ""
@@ -76,15 +94,18 @@
("to_date", " and si.posting_date<=%(to_date)s")):
if filters.get(opts[0]):
conditions += opts[1]
-
+
if filters.get("mode_of_payment"):
conditions += """ and exists(select name from `tabSales Invoice Payment`
- where parent=si.name
+ where parent=si.name
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
return conditions
-def get_items(filters):
+def get_items(filters, additional_query_columns):
+ if additional_query_columns:
+ additional_query_columns = ', ' + ', '.join(additional_query_columns)
+
conditions = get_conditions(filters)
return frappe.db.sql("""
select
@@ -93,10 +114,11 @@
si_item.item_code, si_item.item_name, si_item.item_group, si_item.sales_order,
si_item.delivery_note, si_item.income_account, si_item.cost_center, si_item.qty,
si_item.base_net_rate, si_item.base_net_amount, si.customer_name,
- si.customer_group, si_item.so_detail, si.update_stock
+ si.customer_group, si_item.so_detail, si.update_stock {0}
from `tabSales Invoice` si, `tabSales Invoice Item` si_item
where si.name = si_item.parent and si.docstatus = 1 %s
- order by si.posting_date desc, si_item.item_code desc""" % conditions, filters, as_dict=1)
+ order by si.posting_date desc, si_item.item_code desc
+ """.format(additional_query_columns or '') % conditions, filters, as_dict=1)
def get_tax_accounts(item_list, columns):
import json
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py
index 1a63a9d..37848d5 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.py
+++ b/erpnext/accounts/report/purchase_register/purchase_register.py
@@ -7,10 +7,13 @@
from frappe import msgprint, _
def execute(filters=None):
+ return _execute(filters)
+
+def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
if not filters: filters = {}
- invoice_list = get_invoices(filters)
- columns, expense_accounts, tax_accounts = get_columns(invoice_list)
+ invoice_list = get_invoices(filters, additional_query_columns)
+ columns, expense_accounts, tax_accounts = get_columns(invoice_list, additional_table_columns)
if not invoice_list:
msgprint(_("No record found"))
@@ -20,8 +23,9 @@
invoice_expense_map, invoice_tax_map = get_invoice_tax_map(invoice_list,
invoice_expense_map, expense_accounts)
invoice_po_pr_map = get_invoice_po_pr_map(invoice_list)
- supplier_details = get_supplier_details(invoice_list)
-
+ suppliers = list(set([d.supplier for d in invoice_list]))
+ supplier_details = get_supplier_details(suppliers)
+
company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
data = []
@@ -31,10 +35,18 @@
purchase_receipt = list(set(invoice_po_pr_map.get(inv.name, {}).get("purchase_receipt", [])))
project = list(set(invoice_po_pr_map.get(inv.name, {}).get("project", [])))
- row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name,
- supplier_details.get(inv.supplier),
- inv.credit_to, inv.mode_of_payment, ", ".join(project), inv.bill_no, inv.bill_date, inv.remarks,
- ", ".join(purchase_order), ", ".join(purchase_receipt), company_currency]
+ row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name]
+
+ if additional_query_columns:
+ for col in additional_query_columns:
+ row.append(inv.get(col))
+
+ row += [
+ supplier_details.get(inv.supplier), # supplier_type
+ inv.credit_to, inv.mode_of_payment, ", ".join(project),
+ inv.bill_no, inv.bill_date, inv.remarks,
+ ", ".join(purchase_order), ", ".join(purchase_receipt), company_currency
+ ]
# map expense values
base_net_total = 0
@@ -61,15 +73,20 @@
return columns, data
-def get_columns(invoice_list):
+def get_columns(invoice_list, additional_table_columns):
"""return columns based on filters"""
columns = [
- _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80",
- _("Supplier Id") + "::120", _("Supplier Name") + "::120",
- _("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120",
- _("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
+ _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80",
+ _("Supplier Id") + "::120", _("Supplier Name") + "::120"]
+
+ if additional_table_columns:
+ columns += additional_table_columns
+
+ columns += [
+ _("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120",
+ _("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
_("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
- _("Purchase Order") + ":Link/Purchase Order:100",
+ _("Purchase Order") + ":Link/Purchase Order:100",
_("Purchase Receipt") + ":Link/Purchase Receipt:100",
{
"fieldname": "currency",
@@ -114,27 +131,31 @@
if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s"
if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s"
-
+
if filters.get("mode_of_payment"): conditions += " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"
return conditions
-def get_invoices(filters):
+def get_invoices(filters, additional_query_columns):
+ if additional_query_columns:
+ additional_query_columns = ', ' + ', '.join(additional_query_columns)
+
conditions = get_conditions(filters)
return frappe.db.sql("""
- select
- name, posting_date, credit_to, supplier, supplier_name, bill_no, bill_date, remarks,
- base_net_total, base_grand_total, outstanding_amount, mode_of_payment
- from `tabPurchase Invoice`
+ select
+ name, posting_date, credit_to, supplier, supplier_name, bill_no, bill_date,
+ remarks, base_net_total, base_grand_total, outstanding_amount,
+ mode_of_payment {0}
+ from `tabPurchase Invoice`
where docstatus = 1 %s
- order by posting_date desc, name desc""" % conditions, filters, as_dict=1)
+ order by posting_date desc, name desc""".format(additional_query_columns or '') % conditions, filters, as_dict=1)
def get_invoice_expense_map(invoice_list):
expense_details = frappe.db.sql("""
select parent, expense_account, sum(base_net_amount) as amount
- from `tabPurchase Invoice Item`
- where parent in (%s)
+ from `tabPurchase Invoice Item`
+ where parent in (%s)
group by parent, expense_account
""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
@@ -149,7 +170,7 @@
tax_details = frappe.db.sql("""
select parent, account_head, case add_deduct_tax when "Add" then sum(base_tax_amount_after_discount_amount)
else sum(base_tax_amount_after_discount_amount) * -1 end as tax_amount
- from `tabPurchase Taxes and Charges`
+ from `tabPurchase Taxes and Charges`
where parent in (%s) and category in ('Total', 'Valuation and Total')
group by parent, account_head, add_deduct_tax
""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
@@ -169,8 +190,8 @@
def get_invoice_po_pr_map(invoice_list):
pi_items = frappe.db.sql("""
- select parent, purchase_order, purchase_receipt, po_detail, project
- from `tabPurchase Invoice Item`
+ select parent, purchase_order, purchase_receipt, po_detail, project
+ from `tabPurchase Invoice Item`
where parent in (%s) and (ifnull(purchase_order, '') != '' or ifnull(purchase_receipt, '') != '')
""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
@@ -205,9 +226,8 @@
return account_map
-def get_supplier_details(invoice_list):
+def get_supplier_details(suppliers):
supplier_details = {}
- suppliers = list(set([inv.supplier for inv in invoice_list]))
for supp in frappe.db.sql("""select name, supplier_type from `tabSupplier`
where name in (%s)""" % ", ".join(["%s"]*len(suppliers)), tuple(suppliers), as_dict=1):
supplier_details.setdefault(supp.name, supp.supplier_type)
diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py
index 1ef17ac..49f6471 100644
--- a/erpnext/accounts/report/sales_register/sales_register.py
+++ b/erpnext/accounts/report/sales_register/sales_register.py
@@ -7,10 +7,13 @@
from frappe import msgprint, _
def execute(filters=None):
+ return _execute(filters)
+
+def _execute(filters, additional_table_columns=None, additional_query_columns=None):
if not filters: filters = frappe._dict({})
- invoice_list = get_invoices(filters)
- columns, income_accounts, tax_accounts = get_columns(invoice_list)
+ invoice_list = get_invoices(filters, additional_query_columns)
+ columns, income_accounts, tax_accounts = get_columns(invoice_list, additional_table_columns)
if not invoice_list:
msgprint(_("No record found"))
@@ -21,7 +24,8 @@
invoice_income_map, income_accounts)
invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
- customer_map = get_customer_details(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.company, "default_currency")
mode_of_payments = get_mode_of_payments([inv.name for inv in invoice_list])
@@ -31,12 +35,22 @@
sales_order = list(set(invoice_so_dn_map.get(inv.name, {}).get("sales_order", [])))
delivery_note = list(set(invoice_so_dn_map.get(inv.name, {}).get("delivery_note", [])))
- row = [inv.name, inv.posting_date, inv.customer, inv.customer_name,
- customer_map.get(inv.customer, {}).get("customer_group"),
- customer_map.get(inv.customer, {}).get("territory"),
- inv.debit_to, ", ".join(mode_of_payments.get(inv.name, [])), inv.project, inv.remarks,
- ", ".join(sales_order), ", ".join(delivery_note), company_currency]
+ customer_details = customer_map.get(inv.customer, {})
+ row = [
+ inv.name, inv.posting_date, inv.customer, inv.customer_name
+ ]
+ if additional_query_columns:
+ for col in additional_query_columns:
+ row.append(inv.get(col))
+
+ row +=[
+ customer_details.get("customer_group"),
+ customer_details.get("territory"),
+ inv.debit_to, ", ".join(mode_of_payments.get(inv.name, [])),
+ inv.project, inv.remarks,
+ ", ".join(sales_order), ", ".join(delivery_note), company_currency
+ ]
# map income values
base_net_total = 0
for income_acc in income_accounts:
@@ -62,15 +76,20 @@
return columns, data
-
-def get_columns(invoice_list):
+def get_columns(invoice_list, additional_table_columns):
"""return columns based on filters"""
columns = [
- _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80",
- _("Customer Id") + "::120", _("Customer Name") + "::120",
- _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
- _("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + "::120",
- _("Project") +":Link/Project:80", _("Remarks") + "::150",
+ _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80",
+ _("Customer") + ":Link/Customer:120", _("Customer Name") + "::120"
+ ]
+
+ if additional_table_columns:
+ columns += additional_table_columns
+
+ columns +=[
+ _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
+ _("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + "::120",
+ _("Project") +":Link/Project:80", _("Remarks") + "::150",
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
{
"fieldname": "currency",
@@ -113,20 +132,23 @@
if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s"
if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s"
-
+
if filters.get("mode_of_payment"):
conditions += """ and exists(select name from `tabSales Invoice Payment`
- where parent=`tabSales Invoice`.name
+ where parent=`tabSales Invoice`.name
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
-
+
return conditions
-def get_invoices(filters):
+def get_invoices(filters, additional_query_columns):
+ if additional_query_columns:
+ additional_query_columns = ', ' + ', '.join(additional_query_columns)
+
conditions = get_conditions(filters)
- return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, remarks,
- base_net_total, base_grand_total, base_rounded_total, outstanding_amount
+ return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, remarks,
+ base_net_total, base_grand_total, base_rounded_total, outstanding_amount {0}
from `tabSales Invoice`
- where docstatus = 1 %s order by posting_date desc, name desc""" %
+ where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') %
conditions, filters, as_dict=1)
def get_invoice_income_map(invoice_list):
@@ -184,9 +206,8 @@
return invoice_so_dn_map
-def get_customer_details(invoice_list):
+def get_customer_details(customers):
customer_map = {}
- customers = list(set([inv.customer for inv in invoice_list]))
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)
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 02aa14b..a17679e 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -35,7 +35,7 @@
{
"type": "report",
"name": "Accounts Receivable",
- "doctype": "Sales Invoice",
+ "doctype": "Sales Invoice",
"is_query_report": True
},
{
@@ -199,6 +199,35 @@
]
},
{
+ "label": _("Goods and Services Tax (GST India)"),
+ "items": [
+ {
+ "type": "doctype",
+ "name": "GST HSN Code",
+ },
+ {
+ "type": "report",
+ "name": "GST Sales Register",
+ "is_query_report": True
+ },
+ {
+ "type": "report",
+ "name": "GST Purchase Register",
+ "is_query_report": True
+ },
+ {
+ "type": "report",
+ "name": "GST Itemised Sales Register",
+ "is_query_report": True
+ },
+ {
+ "type": "report",
+ "name": "GST Itemised Purchase Register",
+ "is_query_report": True
+ },
+ ]
+ },
+ {
"label": _("Budget and Cost Center"),
"items": [
{
diff --git a/erpnext/demo/setup/setup_data.py b/erpnext/demo/setup/setup_data.py
index 33f945f..692a6ba 100644
--- a/erpnext/demo/setup/setup_data.py
+++ b/erpnext/demo/setup/setup_data.py
@@ -316,6 +316,8 @@
doc.parent_account = frappe.db.get_value('Account', {'account_name': doc.parent_account})
doc.insert()
+ frappe.flags.in_import = False
+
def setup_account_to_expense_type():
company_abbr = frappe.db.get_value("Company", erpnext.get_default_company(), "abbr")
expense_types = [{'name': _('Calls'), "account": "Sales Expenses - "+ company_abbr},
@@ -380,4 +382,6 @@
frappe.db.commit()
+ frappe.flags.in_import = False
+
diff --git a/erpnext/docs/assets/img/accounts/pos_deleted_item.gif b/erpnext/docs/assets/img/accounts/pos_deleted_item.gif
new file mode 100644
index 0000000..097d3d0
--- /dev/null
+++ b/erpnext/docs/assets/img/accounts/pos_deleted_item.gif
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/material-request-workflow.jpg b/erpnext/docs/assets/img/buying/material-request-workflow.jpg
similarity index 100%
rename from erpnext/docs/assets/old_images/erpnext/material-request-workflow.jpg
rename to erpnext/docs/assets/img/buying/material-request-workflow.jpg
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/purchase-order-f.jpg b/erpnext/docs/assets/img/buying/purchase-order-f.jpg
similarity index 100%
rename from erpnext/docs/assets/old_images/erpnext/purchase-order-f.jpg
rename to erpnext/docs/assets/img/buying/purchase-order-f.jpg
Binary files differ
diff --git a/erpnext/docs/assets/img/buying/purchase-taxes.png b/erpnext/docs/assets/img/buying/purchase-taxes.png
new file mode 100644
index 0000000..f372b0a
--- /dev/null
+++ b/erpnext/docs/assets/img/buying/purchase-taxes.png
Binary files differ
diff --git a/erpnext/docs/assets/img/buying/supplier-quotation-f.jpg b/erpnext/docs/assets/img/buying/supplier-quotation-f.jpg
new file mode 100644
index 0000000..03c50de
--- /dev/null
+++ b/erpnext/docs/assets/img/buying/supplier-quotation-f.jpg
Binary files differ
diff --git a/erpnext/docs/assets/img/crm/sales-analytics-customer.gif b/erpnext/docs/assets/img/crm/sales-analytics-customer.gif
new file mode 100644
index 0000000..f61cea0
--- /dev/null
+++ b/erpnext/docs/assets/img/crm/sales-analytics-customer.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/crm/sales-partner-listing.png b/erpnext/docs/assets/img/crm/sales-partner-listing.png
new file mode 100644
index 0000000..d9825b3
--- /dev/null
+++ b/erpnext/docs/assets/img/crm/sales-partner-listing.png
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-1.png b/erpnext/docs/assets/img/customize/kanban-board-1.png
new file mode 100644
index 0000000..43826a2
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-1.png
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-2.png b/erpnext/docs/assets/img/customize/kanban-board-2.png
new file mode 100644
index 0000000..552fa64
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-2.png
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-3.gif b/erpnext/docs/assets/img/customize/kanban-board-3.gif
new file mode 100644
index 0000000..beb4c9b
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-3.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-4.gif b/erpnext/docs/assets/img/customize/kanban-board-4.gif
new file mode 100644
index 0000000..111995b
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-4.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-5.gif b/erpnext/docs/assets/img/customize/kanban-board-5.gif
new file mode 100644
index 0000000..eb4310e
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-5.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-6.gif b/erpnext/docs/assets/img/customize/kanban-board-6.gif
new file mode 100644
index 0000000..35ca27a
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-6.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/customize/kanban-board-7.gif b/erpnext/docs/assets/img/customize/kanban-board-7.gif
new file mode 100644
index 0000000..29b5e45
--- /dev/null
+++ b/erpnext/docs/assets/img/customize/kanban-board-7.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/manufacturing/subcontract.png b/erpnext/docs/assets/img/manufacturing/subcontract.png
new file mode 100644
index 0000000..84f59b5
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/subcontract.png
Binary files differ
diff --git a/erpnext/docs/assets/img/manufacturing/subcontract2.png b/erpnext/docs/assets/img/manufacturing/subcontract2.png
new file mode 100644
index 0000000..53aac15
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/subcontract2.png
Binary files differ
diff --git a/erpnext/docs/assets/img/manufacturing/subcontract3.png b/erpnext/docs/assets/img/manufacturing/subcontract3.png
new file mode 100644
index 0000000..9a74824
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/subcontract3.png
Binary files differ
diff --git a/erpnext/docs/assets/img/manufacturing/subcontract4.png b/erpnext/docs/assets/img/manufacturing/subcontract4.png
new file mode 100644
index 0000000..20c367c
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/subcontract4.png
Binary files differ
diff --git a/erpnext/docs/assets/img/manufacturing/subcontract5.png b/erpnext/docs/assets/img/manufacturing/subcontract5.png
new file mode 100644
index 0000000..6e8a5f4
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/subcontract5.png
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gst-in-coa.png b/erpnext/docs/assets/img/regional/india/gst-in-coa.png
new file mode 100644
index 0000000..12e0606
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gst-in-coa.png
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gst-invoice.gif b/erpnext/docs/assets/img/regional/india/gst-invoice.gif
new file mode 100644
index 0000000..16abb68
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gst-invoice.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gst-itemised.png b/erpnext/docs/assets/img/regional/india/gst-itemised.png
new file mode 100644
index 0000000..ee99aa5
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gst-itemised.png
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gst-menu.png b/erpnext/docs/assets/img/regional/india/gst-menu.png
new file mode 100644
index 0000000..5fc3080
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gst-menu.png
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gst-template-in-state.png b/erpnext/docs/assets/img/regional/india/gst-template-in-state.png
new file mode 100644
index 0000000..c5df604
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gst-template-in-state.png
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gstin-company.gif b/erpnext/docs/assets/img/regional/india/gstin-company.gif
new file mode 100644
index 0000000..9f1ef4f
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gstin-company.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/gstin-customer.gif b/erpnext/docs/assets/img/regional/india/gstin-customer.gif
new file mode 100644
index 0000000..cead0ec
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/gstin-customer.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/regional/india/hsn-item.gif b/erpnext/docs/assets/img/regional/india/hsn-item.gif
new file mode 100644
index 0000000..7673635
--- /dev/null
+++ b/erpnext/docs/assets/img/regional/india/hsn-item.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/Item-UOM.png b/erpnext/docs/assets/img/selling/Item-UOM.png
new file mode 100644
index 0000000..b3ffff4
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/Item-UOM.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/Sale-Order-UOM.png b/erpnext/docs/assets/img/selling/Sale-Order-UOM.png
new file mode 100644
index 0000000..9983bad
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/Sale-Order-UOM.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/portal-new-ticket.png b/erpnext/docs/assets/img/selling/portal-new-ticket.png
new file mode 100644
index 0000000..ae998b1
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/portal-new-ticket.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/portal-ticket-1.gif b/erpnext/docs/assets/img/selling/portal-ticket-1.gif
new file mode 100644
index 0000000..2024364
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/portal-ticket-1.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/portal-ticket-list-empty.png b/erpnext/docs/assets/img/selling/portal-ticket-list-empty.png
new file mode 100644
index 0000000..07582f4
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/portal-ticket-list-empty.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/portal-ticket-reply.gif b/erpnext/docs/assets/img/selling/portal-ticket-reply.gif
new file mode 100644
index 0000000..87b208d
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/portal-ticket-reply.gif
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-order-f.jpg b/erpnext/docs/assets/img/selling/sales-order-f.jpg
similarity index 100%
rename from erpnext/docs/assets/old_images/erpnext/sales-order-f.jpg
rename to erpnext/docs/assets/img/selling/sales-order-f.jpg
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/sales-person-item-group-report.png b/erpnext/docs/assets/img/selling/sales-person-item-group-report.png
new file mode 100644
index 0000000..d77f3ef
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/sales-person-item-group-report.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/sales-person-target-distribution.gif b/erpnext/docs/assets/img/selling/sales-person-target-distribution.gif
new file mode 100644
index 0000000..f482ada
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/sales-person-target-distribution.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/sales-person-target-item-group.png b/erpnext/docs/assets/img/selling/sales-person-target-item-group.png
new file mode 100644
index 0000000..b2090bd
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/sales-person-target-item-group.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/sales-person-territory-manager.png b/erpnext/docs/assets/img/selling/sales-person-territory-manager.png
new file mode 100644
index 0000000..d5ad4c5
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/sales-person-territory-manager.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/sales-person-territory-report.png b/erpnext/docs/assets/img/selling/sales-person-territory-report.png
new file mode 100644
index 0000000..d2bef77
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/sales-person-territory-report.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/stock ledger for as STOCK-UOM.png b/erpnext/docs/assets/img/selling/stock ledger for as STOCK-UOM.png
new file mode 100644
index 0000000..2ef6f44
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/stock ledger for as STOCK-UOM.png
Binary files differ
diff --git a/erpnext/docs/assets/img/selling/target-distribution.png b/erpnext/docs/assets/img/selling/target-distribution.png
new file mode 100644
index 0000000..cc06ec2
--- /dev/null
+++ b/erpnext/docs/assets/img/selling/target-distribution.png
Binary files differ
diff --git a/erpnext/docs/assets/img/setup/data-import/data-import-4.png b/erpnext/docs/assets/img/setup/data-import/data-import-4.png
new file mode 100644
index 0000000..24e7ba0
--- /dev/null
+++ b/erpnext/docs/assets/img/setup/data-import/data-import-4.png
Binary files differ
diff --git a/erpnext/docs/assets/img/setup/data-import/data-import-excel.png b/erpnext/docs/assets/img/setup/data-import/data-import-excel.png
new file mode 100644
index 0000000..f012f0e
--- /dev/null
+++ b/erpnext/docs/assets/img/setup/data-import/data-import-excel.png
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sms-setting2.jpg b/erpnext/docs/assets/img/setup/sms-setting2.jpg
similarity index 100%
rename from erpnext/docs/assets/old_images/erpnext/sms-setting2.jpg
rename to erpnext/docs/assets/img/setup/sms-setting2.jpg
Binary files differ
diff --git a/erpnext/docs/assets/img/setup/sms-settings1.png b/erpnext/docs/assets/img/setup/sms-settings1.png
new file mode 100644
index 0000000..8f70eb1
--- /dev/null
+++ b/erpnext/docs/assets/img/setup/sms-settings1.png
Binary files differ
diff --git a/erpnext/docs/assets/img/stock/item-manufacturing-website.png b/erpnext/docs/assets/img/stock/item-manufacturing-website.png
new file mode 100644
index 0000000..54e9746
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/item-manufacturing-website.png
Binary files differ
diff --git a/erpnext/docs/assets/img/stock/item-price-1.png b/erpnext/docs/assets/img/stock/item-price-1.png
new file mode 100644
index 0000000..b8df0ae
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/item-price-1.png
Binary files differ
diff --git a/erpnext/docs/assets/img/stock/item-price-2.png b/erpnext/docs/assets/img/stock/item-price-2.png
new file mode 100644
index 0000000..d19308f
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/item-price-2.png
Binary files differ
diff --git a/erpnext/docs/assets/img/stock/item-price-3.png b/erpnext/docs/assets/img/stock/item-price-3.png
new file mode 100644
index 0000000..2d26aa6
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/item-price-3.png
Binary files differ
diff --git a/erpnext/docs/assets/img/stock/projected-quantity-stock-report.png b/erpnext/docs/assets/img/stock/projected-quantity-stock-report.png
new file mode 100644
index 0000000..ec372b3
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/projected-quantity-stock-report.png
Binary files differ
diff --git a/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-employee-user-permissions.png b/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-employee-user-permissions.png
new file mode 100644
index 0000000..0d9d8f6
--- /dev/null
+++ b/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-employee-user-permissions.png
Binary files differ
diff --git a/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-level-1.png b/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-level-1.png
new file mode 100644
index 0000000..61a1baf
--- /dev/null
+++ b/erpnext/docs/assets/img/users-and-permissions/setting-up-permissions-level-1.png
Binary files differ
diff --git a/erpnext/docs/assets/img/website/portal-new-ticket.png b/erpnext/docs/assets/img/website/portal-new-ticket.png
new file mode 100644
index 0000000..ae998b1
--- /dev/null
+++ b/erpnext/docs/assets/img/website/portal-new-ticket.png
Binary files differ
diff --git a/erpnext/docs/assets/img/website/portal-ticket-1.gif b/erpnext/docs/assets/img/website/portal-ticket-1.gif
new file mode 100644
index 0000000..2024364
--- /dev/null
+++ b/erpnext/docs/assets/img/website/portal-ticket-1.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/website/portal-ticket-list-empty.png b/erpnext/docs/assets/img/website/portal-ticket-list-empty.png
new file mode 100644
index 0000000..07582f4
--- /dev/null
+++ b/erpnext/docs/assets/img/website/portal-ticket-list-empty.png
Binary files differ
diff --git a/erpnext/docs/assets/img/website/portal-ticket-reply.gif b/erpnext/docs/assets/img/website/portal-ticket-reply.gif
new file mode 100644
index 0000000..87b208d
--- /dev/null
+++ b/erpnext/docs/assets/img/website/portal-ticket-reply.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/website/shopping-cart-1.png b/erpnext/docs/assets/img/website/shopping-cart-1.png
new file mode 100644
index 0000000..ddf1950
--- /dev/null
+++ b/erpnext/docs/assets/img/website/shopping-cart-1.png
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/item-price-item.png b/erpnext/docs/assets/old_images/erpnext/item-price-item.png
deleted file mode 100644
index 90acbf1..0000000
--- a/erpnext/docs/assets/old_images/erpnext/item-price-item.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/item-price-list.png b/erpnext/docs/assets/old_images/erpnext/item-price-list.png
deleted file mode 100644
index 60591f0..0000000
--- a/erpnext/docs/assets/old_images/erpnext/item-price-list.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/item-price-rate.png b/erpnext/docs/assets/old_images/erpnext/item-price-rate.png
deleted file mode 100644
index 05dbef0..0000000
--- a/erpnext/docs/assets/old_images/erpnext/item-price-rate.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/portal-new-ticket.png b/erpnext/docs/assets/old_images/erpnext/portal-new-ticket.png
deleted file mode 100644
index 6130ded..0000000
--- a/erpnext/docs/assets/old_images/erpnext/portal-new-ticket.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/portal-ticket-1.png b/erpnext/docs/assets/old_images/erpnext/portal-ticket-1.png
deleted file mode 100644
index 175eca7..0000000
--- a/erpnext/docs/assets/old_images/erpnext/portal-ticket-1.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/portal-ticket-list-empty.png b/erpnext/docs/assets/old_images/erpnext/portal-ticket-list-empty.png
deleted file mode 100644
index fd5875c..0000000
--- a/erpnext/docs/assets/old_images/erpnext/portal-ticket-list-empty.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/portal-ticket-reply.png b/erpnext/docs/assets/old_images/erpnext/portal-ticket-reply.png
deleted file mode 100644
index f03f673..0000000
--- a/erpnext/docs/assets/old_images/erpnext/portal-ticket-reply.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/projected-quantity-stock-report.png b/erpnext/docs/assets/old_images/erpnext/projected-quantity-stock-report.png
deleted file mode 100644
index b7d0a90..0000000
--- a/erpnext/docs/assets/old_images/erpnext/projected-quantity-stock-report.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/purchase-taxes.png b/erpnext/docs/assets/old_images/erpnext/purchase-taxes.png
deleted file mode 100644
index 508bf4e..0000000
--- a/erpnext/docs/assets/old_images/erpnext/purchase-taxes.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-analytics-customer.png b/erpnext/docs/assets/old_images/erpnext/sales-analytics-customer.png
deleted file mode 100644
index bb51d60..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-analytics-customer.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-partner-listing.png b/erpnext/docs/assets/old_images/erpnext/sales-partner-listing.png
deleted file mode 100644
index 944a7da..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-partner-listing.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-partner-published.png b/erpnext/docs/assets/old_images/erpnext/sales-partner-published.png
deleted file mode 100644
index 631ca31..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-partner-published.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-person-item-group-report.png b/erpnext/docs/assets/old_images/erpnext/sales-person-item-group-report.png
deleted file mode 100644
index de1c6b8..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-person-item-group-report.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-person-target-distribution.png b/erpnext/docs/assets/old_images/erpnext/sales-person-target-distribution.png
deleted file mode 100644
index d10da04..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-person-target-distribution.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-person-target-item-group.png b/erpnext/docs/assets/old_images/erpnext/sales-person-target-item-group.png
deleted file mode 100644
index e1a2eb5..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-person-target-item-group.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-person-territory-manager.png b/erpnext/docs/assets/old_images/erpnext/sales-person-territory-manager.png
deleted file mode 100644
index 51f470b..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-person-territory-manager.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sales-person-territory-report.png b/erpnext/docs/assets/old_images/erpnext/sales-person-territory-report.png
deleted file mode 100644
index 154a73d..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sales-person-territory-report.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-employee-user-permissions.png b/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-employee-user-permissions.png
deleted file mode 100644
index 80ce1e1..0000000
--- a/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-employee-user-permissions.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-level-1.png b/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-level-1.png
deleted file mode 100644
index ffa0d07..0000000
--- a/erpnext/docs/assets/old_images/erpnext/setting-up-permissions-level-1.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/shopping-cart-1.png b/erpnext/docs/assets/old_images/erpnext/shopping-cart-1.png
deleted file mode 100644
index 2611ce4..0000000
--- a/erpnext/docs/assets/old_images/erpnext/shopping-cart-1.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/shopping-cart-2.png b/erpnext/docs/assets/old_images/erpnext/shopping-cart-2.png
deleted file mode 100644
index 868c170..0000000
--- a/erpnext/docs/assets/old_images/erpnext/shopping-cart-2.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-1.png b/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-1.png
deleted file mode 100644
index d9ab164..0000000
--- a/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-1.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-amount.png b/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-amount.png
deleted file mode 100644
index 6fd5f000..0000000
--- a/erpnext/docs/assets/old_images/erpnext/shopping-cart-display-amount.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/sms-settings1.png b/erpnext/docs/assets/old_images/erpnext/sms-settings1.png
deleted file mode 100644
index 64678d0..0000000
--- a/erpnext/docs/assets/old_images/erpnext/sms-settings1.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/subcontract.png b/erpnext/docs/assets/old_images/erpnext/subcontract.png
deleted file mode 100644
index a199314..0000000
--- a/erpnext/docs/assets/old_images/erpnext/subcontract.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/assets/old_images/erpnext/target-distribution.png b/erpnext/docs/assets/old_images/erpnext/target-distribution.png
deleted file mode 100644
index 7e451cd..0000000
--- a/erpnext/docs/assets/old_images/erpnext/target-distribution.png
+++ /dev/null
Binary files differ
diff --git a/erpnext/docs/user/manual/de/CRM/setup/customer-group.md b/erpnext/docs/user/manual/de/CRM/setup/customer-group.md
index 1aeb2d1..4cdeb22 100644
--- a/erpnext/docs/user/manual/de/CRM/setup/customer-group.md
+++ b/erpnext/docs/user/manual/de/CRM/setup/customer-group.md
@@ -7,6 +7,6 @@
> Tipp: Wenn Sie der Meinung sind, dass hier zu viel Aufwand getrieben wird, dann können Sie es bei einer Standard-Kundengruppe belassen. Aber der gesamte Aufwand wird sich dann auszahlen, wenn Sie die ersten Berichte erhalten. Ein Beispiel eines Berichts ist unten abgebildet.
-
+<img class="screenshot" alt="Vertriebsanalyse" src="{{docs_base_url}}/assets/img/crm/sales-analytics-customer.gif">
{next}
diff --git a/erpnext/docs/user/manual/de/buying/purchase-order.md b/erpnext/docs/user/manual/de/buying/purchase-order.md
index 11b414c..7c72d1e 100644
--- a/erpnext/docs/user/manual/de/buying/purchase-order.md
+++ b/erpnext/docs/user/manual/de/buying/purchase-order.md
@@ -7,7 +7,7 @@
### Flußdiagramm der Lieferantenbestellung
-
+<img class="screenshot" alt="Lieferantenauftrag" src="{{docs_base_url}}/assets/img/buying/purchase-order-f.jpg">
In ERPNext können Sie einen Lieferantenauftrag auch direkt erstellen über:
diff --git a/erpnext/docs/user/manual/de/buying/supplier-quotation.md b/erpnext/docs/user/manual/de/buying/supplier-quotation.md
index 1aec103..93db6a7 100644
--- a/erpnext/docs/user/manual/de/buying/supplier-quotation.md
+++ b/erpnext/docs/user/manual/de/buying/supplier-quotation.md
@@ -7,7 +7,7 @@
### Flußdiagramm zum Lieferantenangebot
-
+<img class="screenshot" alt="Lieferantenangebot" src="{{docs_base_url}}/assets/img/buying/supplier-quotation-f.jpg">
Sie können ein Lieferantenangebot auch direkt erstellen über:
diff --git a/erpnext/docs/user/manual/de/customer-portal/issues.md b/erpnext/docs/user/manual/de/customer-portal/issues.md
index 9650cca..8f0c7d3 100644
--- a/erpnext/docs/user/manual/de/customer-portal/issues.md
+++ b/erpnext/docs/user/manual/de/customer-portal/issues.md
@@ -5,18 +5,17 @@
### Ticketliste leeren
-
-
+<img class="screenshot" alt="Ausgabeliste" src="{{docs_base_url}}/assets/img/website/portal-ticket-list-empty.png">
### Neuer Fall
-
+<img class="screenshot" alt="Neues Problem " src="{{docs_base_url}}/assets/img/website/portal-new-ticket.png">
### Fall öffnen
-
+<img class="screenshot" alt="Ausgabe aufgehoben" src="{{docs_base_url}}/assets/img/website/portal-ticket-1.gif">
### Fall beantworten
-
+<img class="screenshot" alt="Frage beantworten" src="{{docs_base_url}}/assets/img/website/portal-ticket-reply.gif">
{next}
diff --git a/erpnext/docs/user/manual/de/selling/sales-order.md b/erpnext/docs/user/manual/de/selling/sales-order.md
index bd9ddc4..187aeab 100644
--- a/erpnext/docs/user/manual/de/selling/sales-order.md
+++ b/erpnext/docs/user/manual/de/selling/sales-order.md
@@ -9,11 +9,9 @@
### Flußdiagramm des Kundenauftrags
-
+<img class="screenshot" alt="Kundenauftrag aus Angebot erstellen" src="{{docs_base_url}}/assets/img/selling/sales-order-f.jpg">
-Um einen neuen Kundenauftrag zu erstellen gehen Sie zu:
-
-> Vertrieb > Kundenauftrag > Neuer Kundenauftrag
+Um einen neuen Kundenauftrag zu erstellen gehen Sie zu: > Vertrieb > Kundenauftrag > Neuer Kundenauftrag
### Einen Kundenauftrag aus einem Angebot erstellen
diff --git a/erpnext/docs/user/manual/de/selling/setup/sales-partner.md b/erpnext/docs/user/manual/de/selling/setup/sales-partner.md
index 7cbf0d8..66a95a0 100644
--- a/erpnext/docs/user/manual/de/selling/setup/sales-partner.md
+++ b/erpnext/docs/user/manual/de/selling/setup/sales-partner.md
@@ -27,10 +27,7 @@
https://example.erpnext.com/Partners
-
+<img class="screenshot" alt="Auflistung der Vertriebspartner" src="{{docs_base_url}}/assets/img/crm/sales-partner-listing.png">
-Im Folgenden sehen Sie, wie die vollständigen Daten Ihres Partners auf der Webseite angezeigt werden.
-
-
{next}
diff --git a/erpnext/docs/user/manual/de/setting-up/sms-setting.md b/erpnext/docs/user/manual/de/setting-up/sms-setting.md
index 327e8e8..1bcc058 100644
--- a/erpnext/docs/user/manual/de/setting-up/sms-setting.md
+++ b/erpnext/docs/user/manual/de/setting-up/sms-setting.md
@@ -10,8 +10,8 @@
http://instant.smses.com/web2sms.php?username=<USERNAME>&password;=<PASSWORD>&to;=<MOBILENUMBER>&sender;=<SENDERID>&message;=<MESSAGE>
+<img class="screenshot" alt="SMS-Einstellungen" src="{{docs_base_url}}/assets/img/setup/sms-settings2.jpg">
-
> Anmerkung: Die Zeichenfolge bis zum "?" ist die URL des SMS-Gateways.
@@ -23,6 +23,7 @@
Beachten Sie, dass einige Parameter in der URL statisch sind. Sie bekommen von Ihrem SMS-Anbieter statische Werte wie Benutzername, Passwort usw. Diese statischen Werte sollten in die Tabelle der statischen Parameter eingetragen werden.
-
+<img class="screenshot" alt="SMS-Einstellungen" src="{{docs_base_url}}/assets/img/setup/sms-settings1.png">
+
{next}
diff --git a/erpnext/docs/user/manual/de/setting-up/users-and-permissions/role-based-permissions.md b/erpnext/docs/user/manual/de/setting-up/users-and-permissions/role-based-permissions.md
index 6d101bc..6d8108a 100644
--- a/erpnext/docs/user/manual/de/setting-up/users-and-permissions/role-based-permissions.md
+++ b/erpnext/docs/user/manual/de/setting-up/users-and-permissions/role-based-permissions.md
@@ -51,7 +51,7 @@
2\. **Ein Mitarbeiter sollte nur auf seine/Ihre eigenen Urlaubsanträge zugreifen können.** Daher sollte der Punkt "Benutzerberechtigungen anwenden" für die Rolle "Mitarbeiter" aktiviert sein und es sollte ein Datensatz "Benutzerberechtigung" für jede Kombination von Benutzer und Mitarbeiter erstellt werden. (Dieser Aufwand reduziert sich für den Dokumententyp, indem über das Programm Datensätze für Benutzerberechtigungen erstellt werden.)
-<img class="screenshot" alt="Den Zugriff für einen Benutzer mit der Rolle Mitarbeiter auf Urlaubsanträge über den Benutzerberechtigungen-Manager einschränken." src="{{docs_base_url}}/assets/old_images/erpnext/setting-up-permissions-employee-user-permissions.png">
+<img class="screenshot" alt="Den Zugriff für einen Benutzer mit der Rolle Mitarbeiter auf Urlaubsanträge über den Benutzerberechtigungen-Manager einschränken." src="{{docs_base_url}}/assets/img/users-and-permissions/setting-up-permissions-employee-user-permissions.png">
3\. **Der Personalmanager sollte alle Urlaubsanträge sehen können.** Erstellen Sie für den Personalmanager eine Berechtigungsregel auf der Ebene 0 mit Lese-Rechten. Die Option "Benutzerberechtigungen anwenden" sollte deaktiviert sein.
diff --git a/erpnext/docs/user/manual/de/stock/material-request.md b/erpnext/docs/user/manual/de/stock/material-request.md
index 0f55b1e..5a47b13 100644
--- a/erpnext/docs/user/manual/de/stock/material-request.md
+++ b/erpnext/docs/user/manual/de/stock/material-request.md
@@ -3,7 +3,7 @@
Eine Materialanfrage ist ein einfaches Dokument, welches einen Bedarf an Artikeln (Produkte oder Dienstleistungen) für einen bestimmten Zweck erfasst.
-
+<img class="screenshot" alt="Materialanfrage" src="({{docs_base_url}}/assets/img/buying/material-request-workflow.jpg">
Um eine Materialanfrage manuell zu erstellen, gehen Sie bitte zu:
diff --git a/erpnext/docs/user/manual/de/stock/projected-quantity.md b/erpnext/docs/user/manual/de/stock/projected-quantity.md
index 8cea6cf..2b3d9e7 100644
--- a/erpnext/docs/user/manual/de/stock/projected-quantity.md
+++ b/erpnext/docs/user/manual/de/stock/projected-quantity.md
@@ -7,7 +7,7 @@
Eine strikte Kontrolle des projizierten Lagerbestandes ist entscheidend um Engpässe vorherzusagen und die richtige Bestellmenge kalkulieren zu können.
-
+<img class="screenshot" alt="Bericht zur projizierten Menge" src="{{docs_base_url}}/assets/img/stock/projected-quantity-stock-report.png">
> Projizierte Menge = Momentan vorhandene Menge + Geplante Menge + Angefragte Menge + Bestellte Menge - Reservierte Menge
diff --git a/erpnext/docs/user/manual/en/CRM/setup/customer-group.md b/erpnext/docs/user/manual/en/CRM/setup/customer-group.md
index 007f445..505c4fb 100644
--- a/erpnext/docs/user/manual/en/CRM/setup/customer-group.md
+++ b/erpnext/docs/user/manual/en/CRM/setup/customer-group.md
@@ -9,6 +9,6 @@
Customer Group”. But all this effort, will pay off when you start getting
reports. An example of a sample report is given below:
-
+<img class="screenshot" alt="Customer Group report" src="{{docs_base_url}}/assets/img/crm/sales-analytics-customer.gif">
{next}
\ No newline at end of file
diff --git a/erpnext/docs/user/manual/en/accounts/point-of-sale-pos-invoice.md b/erpnext/docs/user/manual/en/accounts/point-of-sale-pos-invoice.md
index 0c7e591..78d2226 100644
--- a/erpnext/docs/user/manual/en/accounts/point-of-sale-pos-invoice.md
+++ b/erpnext/docs/user/manual/en/accounts/point-of-sale-pos-invoice.md
@@ -47,9 +47,14 @@
If your product list is very long use the Search field, type the product name
in Search box.
-### Removing an Item
+### Removing an Item from the Cart
-Set Qty as zero to remove Item from the POS invoice. There are two ways to remove an Item.
+1. Select row in the cart and clik on delete button in the numeric keypad
+
+<img class="screenshot" alt="POS Item" src="{{docs_base_url}}/assets/img/accounts/pos_deleted_item.gif">
+
+
+2. Set Qty as zero to remove Item from the POS invoice. There are two ways to remove an Item.
* If Item's Qty is 1, click on a minus sign to make it zero.
diff --git a/erpnext/docs/user/manual/en/buying/purchase-taxes.md b/erpnext/docs/user/manual/en/buying/purchase-taxes.md
index 871ff96..f3be64d 100644
--- a/erpnext/docs/user/manual/en/buying/purchase-taxes.md
+++ b/erpnext/docs/user/manual/en/buying/purchase-taxes.md
@@ -8,9 +8,8 @@
> Buying > Setup > Purchase Taxes and Charges Template > New Purchase Taxes and Charges
Master
-
+<img class="screenshot" alt="Purchase taxes" src="{{docs_base_url}}/assets/img/buying/purchase-taxes.png">
-
You can specify if the tax / charge is only for valuation (not a part of
total) or only for total (does not add value to the item) or for both.
diff --git a/erpnext/docs/user/manual/en/customer-portal/customer-orders-invoices-and-shipping-status.md b/erpnext/docs/user/manual/en/customer-portal/customer-orders-invoices-and-shipping-status.md
index 257370e..b94ac01 100644
--- a/erpnext/docs/user/manual/en/customer-portal/customer-orders-invoices-and-shipping-status.md
+++ b/erpnext/docs/user/manual/en/customer-portal/customer-orders-invoices-and-shipping-status.md
@@ -1,17 +1,17 @@
ERPNext Web Portal gives your customers quick access to their Orders, Invoices and Shipments Customers can check the status of their orders, invoices, and shipping status by logging on to the web.
-<img class="screenshot" alt="Customer Portal Order 1" src="{{docs_base_url}}/assets/img/website/portal-menu.png">
+<img class="screenshot" alt="Customer Portal" src="{{docs_base_url}}/assets/img/website/portal-menu.png">
Once an order is raised, either using the Shopping Cart or from within ERPNext, your customer can view the order and keep an eye on the billing and shipment status. When the invoice and payment against these orders are submitted, the customer can see the updated status on the portal, at a glance.
-<img class="screenshot" alt="Customer Portal Order 1" src="{{docs_base_url}}/assets/img/website/website-login.png">
+<img class="screenshot" alt="Customer Portal" src="{{docs_base_url}}/assets/img/website/website-login.png">
#### Outstanding Sales Invoice
-<img class="screenshot" alt="Customer Portal Order 1" src="{{docs_base_url}}/assets/img/website/invoice-unpaid.png">
+<img class="screenshot" alt="Customer Portal" src="{{docs_base_url}}/assets/img/website/invoice-unpaid.png">
#### Paid Sales Invoice
-<img class="screenshot" alt="Customer Portal Order 1" src="{{docs_base_url}}/assets/img/website/invoice-paid.png">
+<img class="screenshot" alt="Customer Portal" src="{{docs_base_url}}/assets/img/website/invoice-paid.png">
-{next}
+{next}
\ No newline at end of file
diff --git a/erpnext/docs/user/manual/en/customer-portal/issues.md b/erpnext/docs/user/manual/en/customer-portal/issues.md
index 79ac676..0088de6 100644
--- a/erpnext/docs/user/manual/en/customer-portal/issues.md
+++ b/erpnext/docs/user/manual/en/customer-portal/issues.md
@@ -3,20 +3,20 @@
concerns as Issues. They can view the complete thread of their
conversation.
-#### Empty Ticket List
+#### Empty Issue List
-
+<img class="screenshot" alt="Issue List" src="{{docs_base_url}}/assets/img/website/portal-ticket-list-empty.png">
#### New Issue
-
+<img class="screenshot" alt="New Issue " src="{{docs_base_url}}/assets/img/website/portal-new-ticket.png">
#### Open Issue
-
+<img class="screenshot" alt="Issue Raised" src="{{docs_base_url}}/assets/img/website/portal-ticket-1.gif">
#### Reply on Issue
-
+<img class="screenshot" alt="Issue reply" src="{{docs_base_url}}/assets/img/website/portal-ticket-reply.gif">
{next}
diff --git a/erpnext/docs/user/manual/en/customize-erpnext/kanban-board.md b/erpnext/docs/user/manual/en/customize-erpnext/kanban-board.md
new file mode 100644
index 0000000..ccfa63a
--- /dev/null
+++ b/erpnext/docs/user/manual/en/customize-erpnext/kanban-board.md
@@ -0,0 +1,42 @@
+#Kanban Board
+
+Kanban is a Japanese manufacturing system in which the supply of components is regulated through the use of an instruction card sent along the production line.
+
+In ERPNext Kanban board can be an alternative for the list views. It helps you in visualizing various documents (like Task, Projects, Quotatio etc.) based on some status on a virtual board. Also, you can easily update card status by dragging and dropping to required status column. Kanban Board helps to visualize, control and optimize workflow and collaborate in real-time with the entire team.
+
+###Create new Kanban Board
+
+To create a Kanban board in ERPNext click the Kanban dropdown on the sidebar, and select New Kanban Board.
+
+<img class="screenshot" alt="Add New Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-1.png">
+
+###Add new Card/Document
+
+To add Cards on Kanban Board click Add Tasks. You can Edit a card details by click on the card and it will take you to the Task Doctype where you can further add and edit card details.
+
+<img class="screenshot" alt="Add card in Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-2.png">
+
+###Update Cards/Document Status
+
+Based on the Task status you can drag and drop the Cards in the respective column. For example if the task is work in progress you can move the card for the task from the status Open to Working.
+
+<img class="screenshot" alt="Move Cards on Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-3.gif">
+
+###Manage Columns
+
+To add more columns in the Kanban board click Add columns.
+
+<img class="screenshot" alt="Add New column in Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-4.gif">
+
+To move columns based on the priority drag and drop the columns as per requirement.
+
+<img class="screenshot" alt="Move columns in Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-5.gif">
+
+To set Colors to a Card click drop down menu on the card and assign color to it.
+
+<img class="screenshot" alt="Add color to cards in Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-6.gif">
+
+You can also Archive and Restore the columns added in a Kanban board. To do so click Archive in drop down menu on the card. Once archived you can restore the column from the list of the archived columns in the Kanban board.
+
+<img class="screenshot" alt="Archive and Restore in Kanban Board" src="{{docs_base_url}}/assets/img/customize/kanban-board-7.gif">
+
diff --git a/erpnext/docs/user/manual/en/index.txt b/erpnext/docs/user/manual/en/index.txt
index 97a8cd8..fff4da7 100644
--- a/erpnext/docs/user/manual/en/index.txt
+++ b/erpnext/docs/user/manual/en/index.txt
@@ -12,4 +12,5 @@
customer-portal
website
using-erpnext
+regional
customize-erpnext
diff --git a/erpnext/docs/user/manual/en/manufacturing/subcontracting.md b/erpnext/docs/user/manual/en/manufacturing/subcontracting.md
index 9252171..1589d1b 100644
--- a/erpnext/docs/user/manual/en/manufacturing/subcontracting.md
+++ b/erpnext/docs/user/manual/en/manufacturing/subcontracting.md
@@ -15,8 +15,7 @@
2. Create a Warehouse for your Supplier so that you can keep track of Items supplied. (you may supply a months worth of Items in one go).
3. For the processed Item, in the Item master, set “Is Sub Contracted Item” to “Yes”.
-
-
+<img class="screenshot" alt="Sub-Contracting" src="{{docs_base_url}}/assets/img/manufacturing/subcontract.png">
__Step 1:__ Make a Bill of Materials for the processed Item, with the unprocessed
@@ -24,13 +23,21 @@
pen will be named under Bill of Materials(BOM), whereas, the refill, knob, and
other items which go into the making of pen, will be categorized as sub-items.
+<img class="screenshot" alt="Sub-Contracting" src="{{docs_base_url}}/assets/img/manufacturing/subcontract2.png">
+
__Step 2:__ Make a Purchase Order for the processed Item. When you “Save”, in the “Raw Materials Supplied”, all your un-processed Items will be updated based on your Bill of Materials.
+<img class="screenshot" alt="Sub-Contracting" src="{{docs_base_url}}/assets/img/manufacturing/subcontract3.png">
+
__Step 3:__ Make a Stock Entry to deliver the raw material Items to your Supplier.
+<img class="screenshot" alt="Sub-Contracting" src="{{docs_base_url}}/assets/img/manufacturing/subcontract4.png">
+
__Step 4:__ Receive the Items from your Supplier via Purchase Receipt. Make sure to check the “Consumed Quantity” in the “Raw Materials” table so that the
correct stock is maintained at the Supplier’s end.
+<img class="screenshot" alt="Sub-Contracting" src="{{docs_base_url}}/assets/img/manufacturing/subcontract5.png">
+
> Note 1: Make sure that the “Rate” of processed Item is the processing rate
(excluding the raw material rate).
diff --git a/erpnext/docs/user/manual/en/regional/index.md b/erpnext/docs/user/manual/en/regional/index.md
new file mode 100644
index 0000000..5798860
--- /dev/null
+++ b/erpnext/docs/user/manual/en/regional/index.md
@@ -0,0 +1,9 @@
+ERPNext aims to support local regulation for all the regions in the world. In most cases ERPNext is very flexible so you can easily add Custom Fields and make Custom Reports to support the regluation of your region.
+
+As of mid-2017, ERPNext aims to pre-set additional fields and forms required for companies to easily submit reports to the relevant authorities.
+
+This section is still under-development.
+
+### Regions
+
+{index}
diff --git a/erpnext/docs/user/manual/en/regional/india/index.md b/erpnext/docs/user/manual/en/regional/india/index.md
new file mode 100644
index 0000000..1642207
--- /dev/null
+++ b/erpnext/docs/user/manual/en/regional/india/index.md
@@ -0,0 +1,71 @@
+# Statutory Requirements for India
+
+As of 2017, India will fall under the new GST (Goods and Services Tax) regime and ERPNext makes it easy for users to track the details of its Supplier and Customers across Invoices and make the required reports.
+
+## GST Features in ERPNext
+
+### 1. Setting up GSTIN
+
+GST Law requires that you maintain the GSTIN number for all your suppliers and vendors. In ERPNext, GSTIN is linked to the **Address**
+
+<img class="screenshot" alt="GST in Customer" src="{{docs_base_url}}/assets/img/regional/india/gstin-customer.gif">
+
+**GST for your Company Address**
+
+You also need to set the Address for your own Company and your Company's GST Number
+
+Go to the Company master and add the GSTIN to your default address.
+
+<img class="screenshot" alt="GST in Company" src="{{docs_base_url}}/assets/img/regional/india/gstin-company.gif">
+
+### 2. Setting up HSN Codes
+
+According to the GST Law, your itemised invoices must contain the HSN Code related to that Item. ERPNext comes pre-installed with all 12,000+ HSN Codes so that you can easily select the relevant HSN Code in your Item
+
+<img class="screenshot" alt="HSN in Item" src="{{docs_base_url}}/assets/img/regional/india/hsn-item.gif">
+
+### 3. Making Tax Masters
+
+To setup Billing in GST, you need to create 3 Tax Accounts for the various GST reporting heads CGST - Central GST, SGST - State GST, IGST - Inter-state GST
+
+Go to your **Chart of Accounts**, under the Duties and Taxes head of your account, create 3 Accounts
+
+**Note:** Usually the rate in CGST and SGST is half of IGST. For example if most of your items are billed at 18%, then create IGST at 18%, CGST and SGST at 9% each.
+
+<img class="screenshot" alt="GST in Customer" src="{{docs_base_url}}/assets/img/regional/india/gst-in-coa.png">
+
+### 4. Make Tax Templates
+
+You will have have to make two tax templates for both your sales and purchase, one for in state sales and other for out of state sales.
+
+In your **In State GST** template, select 2 accounts, SGST and CGST
+
+<img class="screenshot" alt="GST in Customer" src="{{docs_base_url}}/assets/img/regional/india/gst-template-in-state.png">
+
+In your **Out of State GST** template, select IGST
+
+### 5. Making GST Ready Invoices
+
+If you have setup the GSTIN of your Customers and Suppliers, and your tax template, you are ready to go for making GST Ready Invoices!
+
+For **Sales Invoice**,
+
+1. Select the correct Customer and Item and the address where the transaction will happen.
+2. Check if the GSTIN of your Company and Supplier have been correctly set.
+3. Check if the HSN Number has been set in the Item
+4. Select the the **In State GST** or **Out of State GST** template that you have created based on the type of transaction
+5. Save and Submit the Invoice
+
+<img class="screenshot" alt="GST Invoice" src="{{docs_base_url}}/assets/img/regional/india/gst-invoice.gif">
+
+### Reports
+
+ERPNext comes with most of your reports you need to prepare your GST Returns. Go to Accounts > GST India head for the list.
+
+<img class="screenshot" alt="GST Menus" src="{{docs_base_url}}/assets/img/regional/india/gst-menu.png">
+
+You can check the impact of your invoice in the **GST Sales Register** and **GST Itemised Sales Register**
+
+<img class="screenshot" alt="GST Itemised Sales Register" src="{{docs_base_url}}/assets/img/regional/india/gst-itemised.png">
+
+
diff --git a/erpnext/docs/user/manual/en/selling/articles/Selling-in-different-UOM.md b/erpnext/docs/user/manual/en/selling/articles/Selling-in-different-UOM.md
new file mode 100644
index 0000000..1efed75
--- /dev/null
+++ b/erpnext/docs/user/manual/en/selling/articles/Selling-in-different-UOM.md
@@ -0,0 +1,29 @@
+#Selling in Different Unit (UoM)
+
+A sell price unit of measure (UOM) is the UOM with which you price items. You can have multiple sell price UOMs for any inventory item. However, when Customer places, UoM for an item could change.
+
+For example an Item Pen is stocked in Nos, but sold in Box. Hence we will make Sales Order for Pen in Box.
+
+###Step 1: In the Item master, under Unit of Measure section, you can list all the possible UoM of an item, with its UoM Conversion Factor. Update UoM Conversion Factors
+In one Box, if you get 10 Nos. of Pen, UoM Conversion Factor would be 10.
+
+<img class="screenshot" alt="Item Unit of Measure" src="{{docs_base_url}}/assets/img/selling/Item-UOM.png">
+
+
+###Setp 2: In the Sale Order, you will find two UoM fields
+
+-UoM
+-Stock UoM
+
+In both the fields, default UoM of an item will be fetched by default. You should edit UoM field, and select Sale UoM (Box in this case). Updating Sales UoM is mainly for the reference of the Customer. In the print format, you will see item quantity in the Sales UoM.
+
+<img class="screenshot" alt="Sale order Unit of Measure" src="{{docs_base_url}}/assets/img/selling/Sale-Order-UOM.png">
+
+Based on the Qty and Conversion Factor, qty will be calculated in the Stock UoM of an item. If you sell just one Box, then Qty as per stock UoM will be set as 10.
+
+
+###Stock Ledger Posting
+
+Irrespective of the Sales UoM selected in the Sale Order, stock ledger posting will be done in the Default UoM of an item. Hence you should ensure that conversion factor is entered correctly while selling item in different UoM.
+
+<img class="screenshot" alt="Stock report in UOM" src="{{docs_base_url}}/assets/img/selling/stock ledger for as STOCK-UOM.png">
diff --git a/erpnext/docs/user/manual/en/selling/sales-order.md b/erpnext/docs/user/manual/en/selling/sales-order.md
index bcd9c93..99b9a85 100644
--- a/erpnext/docs/user/manual/en/selling/sales-order.md
+++ b/erpnext/docs/user/manual/en/selling/sales-order.md
@@ -11,7 +11,7 @@
### Sales Order Flow-Chart
-
+<img class="screenshot" alt="Sales Order flow" src="{{docs_base_url}}/assets/img/selling/sales-order-f.jpg">
To create a new Sales Order go to:
diff --git a/erpnext/docs/user/manual/en/selling/setup/item-price.md b/erpnext/docs/user/manual/en/selling/setup/item-price.md
index b877e8d..92b41fb 100644
--- a/erpnext/docs/user/manual/en/selling/setup/item-price.md
+++ b/erpnext/docs/user/manual/en/selling/setup/item-price.md
@@ -14,7 +14,7 @@
You can create multiple Price List in ERPNext to track Selling and Buying Price List of an item separtely. Also if item's selling prices id changing based on territory, or due to other criteria, you can create multiple selling Price List for it.
-
++<img class="screenshot" alt="Item Price list" src="{{docs_base_url}}/assets/img/stock/item-price-1.png">
On selection of Price List, its currency and for selling or buying property will be fetched as well.
@@ -24,13 +24,13 @@
Select item for which Item Price record is to be created. On selection of Item Code, Item Name and Description will be fetched as well.
-
++<img class="screenshot" alt="Item Price list" src="{{docs_base_url}}/assets/img/stock/item-price-2.png">
Step 3: Enter Rate
Enter selling/buying rate of an item in Price List currency.
-
++<img class="screenshot" alt="Item Price list" src="{{docs_base_url}}/assets/img/stock/item-price-3.png">
Step 4: Save Item Price
diff --git a/erpnext/docs/user/manual/en/selling/setup/sales-partner.md b/erpnext/docs/user/manual/en/selling/setup/sales-partner.md
index b876205..728218f 100644
--- a/erpnext/docs/user/manual/en/selling/setup/sales-partner.md
+++ b/erpnext/docs/user/manual/en/selling/setup/sales-partner.md
@@ -25,10 +25,7 @@
https://example.erpnext.com/partners
-
+<img class="screenshot" alt="Sales Partner" src="{{docs_base_url}}/assets/img/crm/sales-partner-listing.png">
-Following is the complete partners details published on the website.
-
-
{next}
diff --git a/erpnext/docs/user/manual/en/selling/setup/sales-person-target-allocation.md b/erpnext/docs/user/manual/en/selling/setup/sales-person-target-allocation.md
index 75b7561..08bbd78 100644
--- a/erpnext/docs/user/manual/en/selling/setup/sales-person-target-allocation.md
+++ b/erpnext/docs/user/manual/en/selling/setup/sales-person-target-allocation.md
@@ -12,7 +12,7 @@
In the Sales Person master, you will find table called Sales Person Target.
-
+<img class="screenshot" alt="Sales person target " src="{{docs_base_url}}/assets/img/selling/sales-person-target-item-group.png">
In this table, you should select Item Group, Fiscal Year, Target Qty and Amount.
@@ -22,7 +22,8 @@
If you wish to spread allocated target across months, then you should setup Monthly Distribution master, and select it in the Sales Person master. Considering our example, target for the month of December will be set as 5 qty (10% of total allocation).
-
+
+<img class="screenshot" alt="Target Distribution" src="{{docs_base_url}}/assets/im/selling/sales-person-target-distribution.gif">
####Report - Sales Person Target Variance Item Groupwise
@@ -32,7 +33,8 @@
This report will provide you variance between target and actual performance of Sales Person. This report is based on Sales Order report.
-
+
+<img class="screenshot" alt="Target Item Group" src="{{docs_base_url}}/assets/img/selling/sales-person-item-group-report.png">
As per the report, allocated target to Sales Person for the month of December was 5 qty. However, Sales Order was made for this employee and Item Group for only 3 qty. Hence, variance of 2 qty is shown in the report.
@@ -48,7 +50,7 @@
In the Territory master, you will find field to select Territory Manager. This field is linked to "Sales Person" master.
-
+<img class="screenshot" alt="Sales Person Territory Manager" src="{{docs_base_url}}/assets/img/selling/sales-person-territory-manager.png">
####2.2 Allocating Target
@@ -62,7 +64,7 @@
This report will provide you variance between target and actual performance of Sales in particular territory. This report is based on Sales Order report. Though Sales Person is defined in the Territory master, its details are not pulled in the report.
-
+<img class="screenshot" alt="Sales Person Territory Report" src="{{docs_base_url}}/assets/img/selling/sales-person-territory-report.png">
---
@@ -74,7 +76,7 @@
`Accounts > Monthly Distributon`
-
+<img class="screenshot" alt="Target Distribution" src="{{docs_base_url}}/assets/img.selling/erpnext/target-distribution.png">
You can link Monthly Distribution while allocating targets in Sales Person as well as in Territory master.
diff --git a/erpnext/docs/user/manual/en/setting-up/data/data-import-tool.md b/erpnext/docs/user/manual/en/setting-up/data/data-import-tool.md
index 563568a..a5dd939 100644
--- a/erpnext/docs/user/manual/en/setting-up/data/data-import-tool.md
+++ b/erpnext/docs/user/manual/en/setting-up/data/data-import-tool.md
@@ -32,18 +32,25 @@
<img alt="Download Template" class="screenshot" src="{{docs_base_url}}/assets/img/setup/data-import/import-file.png">
-Then export your template or save it as a **Comma Separated Values** (CSV)
-file.
+Then export your template or save it as a Excel or Comma Separated Values (CSV)
+file. To export the document in Excel tick the checkbox for Download in Excel File Format
<img alt="Download Template" class="screenshot" src="{{docs_base_url}}/assets/img/setup/data-import/import-csv.png">
-### 3\. Upload the .csv File
+### Download in Excel
-Finally attach the .csv file in the section. Click on the "Upload and Import"
+<img alt="Download Template" class="screenshot" src="{{docs_base_url}}/assets/img/setup/data-import/data-import-excel.png">
+
+### 3\. Upload the File ethier in .xlsx or .csv
+
+Finally attach the file in the section. Click on the "Upload". Once the upload is successfull click Import"
button.
<img alt="Upload" class="screenshot" src="{{docs_base_url}}/assets/img/setup/data-import/data-import-3.png">
+
+<img alt="Upload" class="screenshot" src="{{docs_base_url}}/assets/img/setup/data-import/data-import-4.png">
+
#### Notes:
1. Make sure that if your application allows, use encoding as UTF-8.
diff --git a/erpnext/docs/user/manual/en/setting-up/sms-setting.md b/erpnext/docs/user/manual/en/setting-up/sms-setting.md
index 4871ed1..7c66692 100644
--- a/erpnext/docs/user/manual/en/setting-up/sms-setting.md
+++ b/erpnext/docs/user/manual/en/setting-up/sms-setting.md
@@ -17,7 +17,8 @@
http://instant.smses.com/web2sms.php?username=<USERNAME>&password;=<PASSWORD>&to;=<MOBILENUMBER>&sender;=<SENDERID>&message;=<MESSAGE>
-
+<img class="screenshot" alt="SMS Setting 2" src="{{docs_base_url}}/assets/img/setup/sms-settings2.jpg">
+
> Note: the string up to the "?" is the SMS Gateway URL
@@ -35,6 +36,6 @@
from your SMS Provider like username, password etc. These static values should
be entered in the Static Parameters table.
-
+<img class="screenshot" alt="SMS Setting" src="{{docs_base_url}}/assets/img/setup/sms-settings1.png">
{next}
diff --git a/erpnext/docs/user/manual/en/stock/item/index.md b/erpnext/docs/user/manual/en/stock/item/index.md
index 9bb6a0f..c0a96df 100644
--- a/erpnext/docs/user/manual/en/stock/item/index.md
+++ b/erpnext/docs/user/manual/en/stock/item/index.md
@@ -55,7 +55,7 @@
### Purchase Details
-<img alt="Item Purchase Details" class="screenshot" src="{{docs_base_url}}/assets/img/stock/item-purchase.png">
+<img class="screenshot" alt="Purchase details" src="{{docs_base_url}}/assets/img/stock/item-purchase.png">
* **Lead time days:** Lead time days are the number of days required for the Item to reach the warehouse.
@@ -83,9 +83,11 @@
* **Customer Codes:** Track Item Code assigned by the Customers for this Item. This will help you in searching item while creating Sales Order based on the Item Code in the Customer's Purchase Order.
+<img class="screenshot" alt="Sales details" src="{{docs_base_url}}/assets/img/stock/item-sales.png)">
+
### Manufacturing And Website
-<img alt="Item Manfacturing and Website Details" class="screenshot" src="{{docs_base_url}}/assets/img/stock/item-manufacturing-and-website.png">
+<img class="screenshot" alt="Manufaturing details" src="{{docs_base_url}}/assets/img/stock/item-manufacturing-website.png">
Visit [Manufacturing]({{docs_base_url}}/user/manual/en/manufacturing.html) and [Website ]({{docs_base_url}}/user/manual/en/website.html)to understand these topics in detail.
diff --git a/erpnext/docs/user/manual/en/stock/material-request.md b/erpnext/docs/user/manual/en/stock/material-request.md
index d707dd7..8e4caea 100644
--- a/erpnext/docs/user/manual/en/stock/material-request.md
+++ b/erpnext/docs/user/manual/en/stock/material-request.md
@@ -1,7 +1,7 @@
A Material Request is a simple document identifying a requirement of a set of
Items (products or services) for a particular reason.
-
+<img class="screenshot" alt="Material Request" src="{{docs_base_url}}/assets/img/buying/material-request-flowchart.png">
To generate a Material Request manually go to:
diff --git a/erpnext/docs/user/manual/en/stock/projected-quantity.md b/erpnext/docs/user/manual/en/stock/projected-quantity.md
index d38bfc9..0e7b742 100644
--- a/erpnext/docs/user/manual/en/stock/projected-quantity.md
+++ b/erpnext/docs/user/manual/en/stock/projected-quantity.md
@@ -11,7 +11,7 @@
Having a tight control of the projected inventory is crucial to determine
shortages and to calculate the right order quantity.
-
+<img class="screenshot" alt="Projected Quantity" src="{{docs_base_url}}/assets/img/stock/projected_quantity.png">
> Projected Qty = Actual Qty + Planned Qty + Requested Qty + Ordered Qty -
diff --git a/erpnext/docs/user/manual/en/website/shopping-cart.md b/erpnext/docs/user/manual/en/website/shopping-cart.md
index 7b10037..6103e3c 100644
--- a/erpnext/docs/user/manual/en/website/shopping-cart.md
+++ b/erpnext/docs/user/manual/en/website/shopping-cart.md
@@ -39,7 +39,7 @@
#### Goto Checkout
-Click on "Goto Cart" to checkout or on "Cart" which is on upper right side
+Click on "Go to Cart" to checkout or on "Cart" which is on upper right side
of the screen.
<img class="screenshot" alt="Website Specifications" src="{{docs_base_url}}/assets/img/website/checkout.png">
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index b8abd8a..ec93f62 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -160,6 +160,9 @@
},
"Payment Entry": {
"on_submit": "erpnext.accounts.doctype.payment_request.payment_request.make_status_as_paid"
+ },
+ 'Address': {
+ 'validate': 'erpnext.regional.india.utils.validate_gstin_for_india'
}
}
diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json
index f2090b7..c563b87 100644
--- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json
+++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json
@@ -8,7 +8,7 @@
"idx": 0,
"is_standard": "Yes",
"letter_head": "",
- "modified": "2017-02-24 19:56:30.215599",
+ "modified": "2017-06-23 04:46:43.209008",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Stock Report",
@@ -16,7 +16,7 @@
"query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tbom_item.description as \"Description:Data:300\",\n\tbom_item.qty as \"Required Qty:Float:100\",\n\tledger.actual_qty as \"In Stock Qty:Float:100\",\n\tFLOOR(ledger.actual_qty /bom_item.qty) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabBin` AS ledger\t\n\t\tON bom_item.item_code = ledger.item_code \n\t\tAND ledger.warehouse = %(warehouse)s\nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code",
"ref_doctype": "BOM",
"report_name": "BOM Stock Report",
- "report_type": "Query Report",
+ "report_type": "Script Report",
"roles": [
{
"role": "Manufacturing Manager"
diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py
new file mode 100644
index 0000000..343cfe9
--- /dev/null
+++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py
@@ -0,0 +1,57 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+
+def execute(filters=None):
+ if not filters: filters = {}
+ columns = get_columns()
+ data = get_bom_stock(filters)
+ return columns, data
+
+def get_columns():
+ """return columns"""
+ columns = [
+ _("Item") + ":Link/Item:150",
+ _("Description") + "::500",
+ _("Required Qty") + ":Float:100",
+ _("In Stock Qty") + ":Float:100",
+ _("Enough Parts to Build") + ":Float:200",
+ ]
+
+ return columns
+
+def get_bom_stock(filters):
+ conditions = ""
+ bom = filters.get("bom")
+
+ if filters.get("warehouse"):
+ warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
+ if warehouse_details:
+ conditions += " and exists (select name from `tabWarehouse` wh \
+ where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)" % (warehouse_details.lft,
+ warehouse_details.rgt)
+ else:
+ conditions += " and ledger.warehouse = '%s'" % frappe.db.escape(filters.get("warehouse"))
+
+ else:
+ conditions += ""
+
+ return frappe.db.sql("""
+ SELECT
+ bom_item.item_code ,
+ bom_item.description ,
+ bom_item.qty,
+ sum(ledger.actual_qty) as actual_qty,
+ sum(FLOOR(ledger.actual_qty /bom_item.qty))as to_build
+ FROM
+ `tabBOM Item` AS bom_item
+ LEFT JOIN `tabBin` AS ledger
+ ON bom_item.item_code = ledger.item_code
+ %s
+ WHERE
+ bom_item.parent = '%s'
+
+ GROUP BY bom_item.item_code""" % (conditions, bom))
diff --git a/erpnext/modules.txt b/erpnext/modules.txt
index 609a3fe..1edff10 100644
--- a/erpnext/modules.txt
+++ b/erpnext/modules.txt
@@ -13,4 +13,5 @@
Hub Node
Portal
Maintenance
-Schools
\ No newline at end of file
+Schools
+Regional
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index d0fa2e6..181cfce 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -406,4 +406,5 @@
erpnext.patches.v8_0.create_domain_docs #16-05-2017
erpnext.patches.v8_0.update_sales_cost_in_project
erpnext.patches.v8_0.save_system_settings
-erpnext.patches.v8_1.delete_deprecated_reports
\ No newline at end of file
+erpnext.patches.v8_1.delete_deprecated_reports
+erpnext.patches.v8_1.setup_gst_india
diff --git a/erpnext/patches/v7_2/contact_address_links.py b/erpnext/patches/v7_2/contact_address_links.py
index 5375d81..07d9341 100644
--- a/erpnext/patches/v7_2/contact_address_links.py
+++ b/erpnext/patches/v7_2/contact_address_links.py
@@ -5,7 +5,7 @@
def execute():
frappe.reload_doc('core', 'doctype', 'dynamic_link')
frappe.reload_doc('email', 'doctype', 'contact')
- frappe.reload_doc('geo', 'doctype', 'address')
+ frappe.reload_doc('contact', 'doctype', 'address')
map_fields = (
('Customer', 'customer'),
('Supplier', 'supplier'),
diff --git a/erpnext/patches/v8_0/create_domain_docs.py b/erpnext/patches/v8_0/create_domain_docs.py
index 2f376db..cdd3117 100644
--- a/erpnext/patches/v8_0/create_domain_docs.py
+++ b/erpnext/patches/v8_0/create_domain_docs.py
@@ -21,7 +21,7 @@
condition = ""
company = erpnext.get_default_company()
if company:
- condition = " and name='{0}'".format(company)
+ condition = " and name='{0}'".format(frappe.db.escape(company))
domains = frappe.db.sql_list("select distinct domain from `tabCompany` where domain != 'Other' {0}".format(condition))
diff --git a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py
index 594a15c..78322d4 100644
--- a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py
+++ b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py
@@ -10,4 +10,4 @@
for data in frappe.get_all('Company', fields = ["name"]):
doc = frappe.get_doc('Company', data.name)
doc.enable_perpetual_inventory = enabled
- doc.save(ignore_permissions=True)
\ No newline at end of file
+ doc.db_update()
\ No newline at end of file
diff --git a/erpnext/patches/v8_0/save_system_settings.py b/erpnext/patches/v8_0/save_system_settings.py
index d91e4c1..d479ece 100644
--- a/erpnext/patches/v8_0/save_system_settings.py
+++ b/erpnext/patches/v8_0/save_system_settings.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe.utils import cint
def execute():
"""
@@ -10,6 +11,10 @@
"""
frappe.reload_doc("core", "doctype", "system_settings")
- doc = frappe.get_doc("System Settings", "System Settings")
+ doc = frappe.get_doc("System Settings")
doc.flags.ignore_mandatory = True
+
+ if cint(doc.currency_precision) == 0:
+ doc.currency_precision = ''
+
doc.save(ignore_permissions=True)
diff --git a/erpnext/patches/v8_1/setup_gst_india.py b/erpnext/patches/v8_1/setup_gst_india.py
new file mode 100644
index 0000000..9e54815
--- /dev/null
+++ b/erpnext/patches/v8_1/setup_gst_india.py
@@ -0,0 +1,33 @@
+import frappe
+from frappe.email import sendmail_to_system_managers
+
+def execute():
+ frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
+
+ for report_name in ('GST Sales Register', 'GST Purchase Register',
+ 'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
+
+ frappe.reload_doc('regional', 'report', frappe.scrub(report_name))
+
+ if frappe.db.get_single_value('System Settings', 'country')=='India':
+ from erpnext.regional.india.setup import setup
+ setup()
+ send_gst_update_email()
+
+def send_gst_update_email():
+ message = """Hello,
+
+<p>ERPNext is now GST Ready.</p>
+
+<p>To start making GST Invoices from 1st of July, you just need to create new Tax Accounts, Templates and update your Customer's and Supplier's GST Numbers.</p>
+
+<p>Please refer {gst_document_link} to know more about how to setup and implement GST in ERPNext.</p>
+
+<p>Please contact us at support@erpnext.com, if you have any questions.</p>
+
+<p>Thanks,</p>
+ERPNext Team.
+ """.format(gst_document_link="<a href='http://frappe.github.io/erpnext/user/manual/en/regional/india/'> ERPNext GST Document </a>")
+
+ sendmail_to_system_managers("[Important] ERPNext GST updates", message)
+
diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css
index 86dec05..0660b39 100644
--- a/erpnext/public/css/erpnext.css
+++ b/erpnext/public/css/erpnext.css
@@ -104,7 +104,7 @@
}
body[data-route="pos"] .pos-payment-row:hover,
body[data-route="pos"] .pos-keyboard-key:hover {
- background-color: #FAFBFC;
+ background-color: #fafbfc;
cursor: pointer;
}
body[data-route="pos"] .pos-keyboard-key,
@@ -214,7 +214,7 @@
font-size: 16px;
}
body[data-route="pos"] .selected-payment-mode {
- background-color: #FAFBFC;
+ background-color: #fafbfc;
cursor: pointer;
}
body[data-route="pos"] .pos-invoice-list {
diff --git a/erpnext/public/js/pos/pos_selected_item.html b/erpnext/public/js/pos/pos_selected_item.html
index 64f8c16..0ed6c71 100644
--- a/erpnext/public/js/pos/pos_selected_item.html
+++ b/erpnext/public/js/pos/pos_selected_item.html
@@ -1,4 +1,4 @@
-<div class="pos-selected-item-action" data-item-code="{%= item_code %}">
+<div class="pos-selected-item-action" data-item-code="{%= item_code %}" data-idx="{%= idx %}">
<div class="pos-list-row">
<div class="cell">{{ __("Quantity") }}:</div>
<input type="tel" class="form-control cell pos-item-qty" value="{%= qty %}"/>
diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js
index 38f89a4..560a561 100644
--- a/erpnext/public/js/queries.js
+++ b/erpnext/public/js/queries.js
@@ -51,20 +51,28 @@
return {
query: 'frappe.contacts.doctype.contact.contact.contact_query',
- filters: { link_doctype: frappe.dynamic_link.doctype, link_name: doc[frappe.dynamic_link.fieldname] } };
+ filters: {
+ link_doctype: frappe.dynamic_link.doctype,
+ link_name: doc[frappe.dynamic_link.fieldname]
+ }
+ };
}
},
address_query: function(doc) {
if(frappe.dynamic_link) {
if(!doc[frappe.dynamic_link.fieldname]) {
- frappe.throw(__("Please set {0}",
+ frappe.throw(__("Please set {0}",
[__(frappe.meta.get_label(doc.doctype, frappe.dynamic_link.fieldname, doc.name))]));
}
return {
query: 'frappe.contacts.doctype.address.address.address_query',
- filters: { link_doctype: frappe.dynamic_link.doctype, link_name: doc[frappe.dynamic_link.fieldname] } };
+ filters: {
+ link_doctype: frappe.dynamic_link.doctype,
+ link_name: doc[frappe.dynamic_link.fieldname]
+ }
+ };
}
},
@@ -85,7 +93,7 @@
lead_filter: function(doc) {
if(!doc.lead) {
- frappe.throw(__("Please specify a {0}",
+ frappe.throw(__("Please specify a {0}",
[__(frappe.meta.get_label(doc.doctype, "lead", doc.name))]));
}
diff --git a/erpnext/public/js/templates/address_list.html b/erpnext/public/js/templates/address_list.html
index 02b44b8..2379ef6 100644
--- a/erpnext/public/js/templates/address_list.html
+++ b/erpnext/public/js/templates/address_list.html
@@ -1,6 +1,6 @@
-<p><button class="btn btn-xs btn-default btn-address">{{ __("New Address") }}</button></p>
<div class="clearfix"></div>
{% for(var i=0, l=addr_list.length; i<l; i++) { %}
+ <div class="address-box">
<p class="h6">
{%= i+1 %}. {%= addr_list[i].address_type!="Other" ? __(addr_list[i].address_type) : addr_list[i].address_title %}
{% if(addr_list[i].is_primary_address) { %}
@@ -9,14 +9,15 @@
<span class="text-muted">({%= __("Shipping") %})</span>{% } %}
<a href="#Form/Address/{%= encodeURIComponent(addr_list[i].name) %}"
- class="btn btn-default btn-xs pull-right">
+ class="btn btn-default btn-xs pull-right"
+ style="margin-top:-3px; margin-right: -5px;">
{%= __("Edit") %}</a>
- </p>
- <div style="padding-left: 15px;">
- <p style="margin-top: 5px; font-size: 12px;">
- {%= addr_list[i].display %}</p>
+ </p>
+ <p>{%= addr_list[i].display %}</p>
</div>
{% } %}
{% if(!addr_list.length) { %}
-<p class="text-muted">{%= __("No address added yet.") %}</p>
+<p class="text-muted small">{%= __("No address added yet.") %}</p>
{% } %}
+<p><button class="btn btn-xs btn-default btn-address">{{ __("New Address") }}</button></p>
+
diff --git a/erpnext/public/js/templates/contact_list.html b/erpnext/public/js/templates/contact_list.html
index abaadff..893b4e0 100644
--- a/erpnext/public/js/templates/contact_list.html
+++ b/erpnext/public/js/templates/contact_list.html
@@ -1,38 +1,38 @@
-<p><button class="btn btn-xs btn-default btn-contact">
- {{ __("New Contact") }}</button></p>
- <div class="clearfix"></div>
-<ol>
+<div class="clearfix"></div>
{% for(var i=0, l=contact_list.length; i<l; i++) { %}
- <p class="h6">
- <li>
- {%= contact_list[i].first_name %} {%= contact_list[i].last_name %}
- {% if(contact_list[i].is_primary_contact) { %}
- <span class="text-muted">({%= __("Primary") %})</span>
- {% } %}
- {% if(contact_list[i].designation){ %}
- <span class="text-muted">– {%= contact_list[i].designation %}</span>
- {% } %}
- <a href="#Form/Contact/{%= encodeURIComponent(contact_list[i].name) %}"
- class="btn btn-xs btn-default pull-right">
- {%= __("Edit") %}</a>
- </li>
- </p>
-
- <div style="padding-left: 15px;">
- <p style="padding-top: 5px; font-size: 12px;">
- {% if(contact_list[i].phone) { %}
- {%= __("Phone") %}: {%= contact_list[i].phone %}<br>
- {% } %}
- {% if(contact_list[i].mobile_no) { %}
- {%= __("Mobile No.") %}: {%= contact_list[i].mobile_no %}<br>
- {% } %}
- {% if(contact_list[i].email_id) { %}
- {%= __("Email Address") %}: {%= contact_list[i].email_id %}
- {% } %}
- </p>
- </div>
+ <div class="address-box">
+ <p class="h6">
+ {%= contact_list[i].first_name %} {%= contact_list[i].last_name %}
+ {% if(contact_list[i].is_primary_contact) { %}
+ <span class="text-muted">({%= __("Primary") %})</span>
+ {% } %}
+ {% if(contact_list[i].designation){ %}
+ <span class="text-muted">– {%= contact_list[i].designation %}</span>
+ {% } %}
+ <a href="#Form/Contact/{%= encodeURIComponent(contact_list[i].name) %}"
+ class="btn btn-xs btn-default pull-right"
+ style="margin-top:-3px; margin-right: -5px;">
+ {%= __("Edit") %}</a>
+ </p>
+ {% if (contact_list[i].phone || contact_list[i].mobile_no ||
+ contact_list[i].email_id) { %}
+ <p>
+ {% if(contact_list[i].phone) { %}
+ {%= __("Phone") %}: {%= contact_list[i].phone %}<br>
+ {% } %}
+ {% if(contact_list[i].mobile_no) { %}
+ {%= __("Mobile No.") %}: {%= contact_list[i].mobile_no %}<br>
+ {% } %}
+ {% if(contact_list[i].email_id) { %}
+ {%= __("Email Address") %}: {%= contact_list[i].email_id %}
+ {% } %}
+ </p>
+ {% endif %}
+ </div>
{% } %}
-</ol>
{% if(!contact_list.length) { %}
-<p class="text-muted">{%= __("No contacts added yet.") %}</p>
-{% } %}
\ No newline at end of file
+<p class="text-muted small">{%= __("No contacts added yet.") %}</p>
+{% } %}
+<p><button class="btn btn-xs btn-default btn-contact">
+ {{ __("New Contact") }}</button>
+</p>
\ No newline at end of file
diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/less/erpnext.less
index f6482eb..6c616c9 100644
--- a/erpnext/public/less/erpnext.less
+++ b/erpnext/public/less/erpnext.less
@@ -126,7 +126,7 @@
}
.pos-payment-row {
- border-bottom:1px solid #d1d8dd;
+ border-bottom:1px solid @border-color;
margin: 2px 0px 5px 0px;
height: 60px;
margin-top: 0px;
@@ -134,12 +134,12 @@
}
.pos-payment-row:hover, .pos-keyboard-key:hover{
- background-color: #FAFBFC;
+ background-color: @light-bg;
cursor: pointer;
}
.pos-keyboard-key, .delete-btn {
- border: 1px solid #d1d8dd;
+ border: 1px solid @border-color;
height:85px;
width:85px;
margin:10px 10px;
@@ -150,7 +150,7 @@
}
.numeric-keypad {
- border: 1px solid #d1d8dd;
+ border: 1px solid @border-color;
height:69px;
width:69px;
font-size:20px;
@@ -256,7 +256,7 @@
}
.selected-payment-mode {
- background-color: #FAFBFC;
+ background-color: @light-bg;
cursor: pointer;
}
@@ -355,7 +355,7 @@
.image-field {
height: 140px;
-
+
.placeholder-text {
font-size: 50px;
}
diff --git a/erpnext/regional/__init__.py b/erpnext/regional/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/__init__.py
diff --git a/erpnext/regional/doctype/__init__.py b/erpnext/regional/doctype/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/doctype/__init__.py
diff --git a/erpnext/regional/doctype/gst_hsn_code/__init__.py b/erpnext/regional/doctype/gst_hsn_code/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/doctype/gst_hsn_code/__init__.py
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js
new file mode 100644
index 0000000..e7cc919
--- /dev/null
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('GST HSN Code', {
+ refresh: function(frm) {
+
+ }
+});
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json
new file mode 100644
index 0000000..9aad1bf
--- /dev/null
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json
@@ -0,0 +1,103 @@
+{
+ "allow_copy": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "autoname": "fieldname:hsn_code",
+ "beta": 0,
+ "creation": "2017-06-21 10:48:56.422086",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "hsn_code",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "HSN Code",
+ "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": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "description",
+ "fieldtype": "Small Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Description",
+ "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,
+ "unique": 0
+ }
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "idx": 0,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2017-06-21 13:27:59.149202",
+ "modified_by": "Administrator",
+ "module": "Regional",
+ "name": "GST HSN Code",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "search_fields": "description",
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
new file mode 100644
index 0000000..9637c2e
--- /dev/null
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class GSTHSNCode(Document):
+ pass
diff --git a/erpnext/regional/doctype/gst_hsn_code/test_gst_hsn_code.py b/erpnext/regional/doctype/gst_hsn_code/test_gst_hsn_code.py
new file mode 100644
index 0000000..ed54f20
--- /dev/null
+++ b/erpnext/regional/doctype/gst_hsn_code/test_gst_hsn_code.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+class TestGSTHSNCode(unittest.TestCase):
+ pass
diff --git a/erpnext/regional/india/__init__.py b/erpnext/regional/india/__init__.py
new file mode 100644
index 0000000..0b1b163
--- /dev/null
+++ b/erpnext/regional/india/__init__.py
@@ -0,0 +1,76 @@
+states = [
+ '',
+ 'Andhra Pradesh',
+ 'Arunachal Pradesh',
+ 'Assam',
+ 'Bihar',
+ 'Chandigarh',
+ 'Chattisgarh',
+ 'Dadra and Nagar Haveli',
+ 'Daman and Diu',
+ 'Delhi',
+ 'Goa',
+ 'Gujarat',
+ 'Haryana',
+ 'Himachal Pradesh',
+ 'Jammu and Kashmir',
+ 'Jharkhand',
+ 'Karnataka',
+ 'Kerala',
+ 'Lakshadweep Islands',
+ 'Madhya Pradesh',
+ 'Maharashtra',
+ 'Manipur',
+ 'Meghalaya',
+ 'Mizoram',
+ 'Nagaland',
+ 'Odisha',
+ 'Pondicherry',
+ 'Punjab',
+ 'Rajasthan',
+ 'Sikkim',
+ 'Tamil Nadu',
+ 'Telangana',
+ 'Tripura',
+ 'Uttar Pradesh',
+ 'Uttarakhand',
+ 'West Bengal',
+]
+
+state_numbers = {
+ "Andhra Pradesh": "37",
+ "Arunachal Pradesh": "12",
+ "Assam": "18",
+ "Bihar": "10",
+ "Chandigarh": "04",
+ "Chattisgarh": "22",
+ "Dadra and Nagar Haveli": "26",
+ "Daman and Diu": "25",
+ "Delhi": "07",
+ "Goa": "30",
+ "Gujarat": "24",
+ "Haryana": "06",
+ "Himachal Pradesh": "02",
+ "Jammu and Kashmir": "01",
+ "Jharkhand": "20",
+ "Karnataka": "29",
+ "Kerala": "32",
+ "Lakshadweep Islands": "31",
+ "Madhya Pradesh": "23",
+ "Maharashtra": "27",
+ "Manipur": "14",
+ "Meghalaya": "17",
+ "Mizoram": "15",
+ "Nagaland": "13",
+ "Odisha": "21",
+ "Pondicherry": "34",
+ "Punjab": "03",
+ "Rajasthan": "08",
+ "Sikkim": "11",
+ "Tamil Nadu": "33",
+ "Telangana": "36",
+ "Tripura": "16",
+ "Uttar Pradesh": "35",
+ "Uttarakhand": "36",
+ "West Bengal": "37"
+}
\ No newline at end of file
diff --git a/erpnext/regional/india/address_template.html b/erpnext/regional/india/address_template.html
new file mode 100644
index 0000000..706c7a4
--- /dev/null
+++ b/erpnext/regional/india/address_template.html
@@ -0,0 +1,8 @@
+{{ address_line1 }}<br>{% if address_line2 %}{{ address_line2 }}<br>{% endif -%}{{ city }}<br>
+{% if state %}{{ state }}<br>{% endif -%}
+{% if pincode %}{{ pincode }}<br>{% endif -%}
+{{ country }}<br>
+{% if gstin %}GSTIN: {{ gstin }}<br>{% endif -%}
+{% if phone %}Phone: {{ phone }}<br>{% endif -%}
+{% if fax %}Fax: {{ fax }}<br>{% endif -%}
+{% if email_id %}Email: {{ email_id }}<br>{% endif -%}
\ No newline at end of file
diff --git a/erpnext/regional/india/gst_state_code_data.json b/erpnext/regional/india/gst_state_code_data.json
new file mode 100644
index 0000000..89dc193
--- /dev/null
+++ b/erpnext/regional/india/gst_state_code_data.json
@@ -0,0 +1,177 @@
+[
+ {
+ "state_number": "33",
+ "state_code": "TN",
+ "state_name": "Tamil Nadu"
+ },
+ {
+ "state_number": "35",
+ "state_code": "UP",
+ "state_name": "Uttar Pradesh"
+ },
+ {
+ "state_number": "36",
+ "state_code": "UT",
+ "state_name": "Uttarakhand"
+ },
+ {
+ "state_number": "37",
+ "state_code": "WB",
+ "state_name": "West Bengal"
+ },
+ {
+ "state_number": "16",
+ "state_code": "TR",
+ "state_name": "Tripura"
+ },
+ {
+ "state_number": "36",
+ "state_code": "TS",
+ "state_name": "Telangana"
+ },
+ {
+ "state_number": "11",
+ "state_code": "SK",
+ "state_name": "Sikkim"
+ },
+ {
+ "state_number": "08",
+ "state_code": "RJ",
+ "state_name": "Rajasthan"
+ },
+ {
+ "state_number": "03",
+ "state_code": "PB",
+ "state_name": "Punjab"
+ },
+ {
+ "state_number": "34",
+ "state_code": "PY",
+ "state_name": "Pondicherry"
+ },
+ {
+ "state_number": "21",
+ "state_code": "OR",
+ "state_name": "Odisha"
+ },
+ {
+ "state_number": "13",
+ "state_code": "NL",
+ "state_name": "Nagaland"
+ },
+ {
+ "state_number": "15",
+ "state_code": "MI",
+ "state_name": "Mizoram"
+ },
+ {
+ "state_number": "17",
+ "state_code": "ME",
+ "state_name": "Meghalaya"
+ },
+ {
+ "state_number": "14",
+ "state_code": "MN",
+ "state_name": "Manipur"
+ },
+ {
+ "state_number": "27",
+ "state_code": "MH",
+ "state_name": "Maharashtra"
+ },
+ {
+ "state_number": "23",
+ "state_code": "MP",
+ "state_name": "Madhya Pradesh"
+ },
+ {
+ "state_number": "31",
+ "state_code": "LD",
+ "state_name": "Lakshadweep Islands"
+ },
+ {
+ "state_number": "32",
+ "state_code": "KL",
+ "state_name": "Kerala"
+ },
+ {
+ "state_number": "29",
+ "state_code": "KA",
+ "state_name": "Karnataka"
+ },
+ {
+ "state_number": "20",
+ "state_code": "JH",
+ "state_name": "Jharkhand"
+ },
+ {
+ "state_number": "01",
+ "state_code": "JK",
+ "state_name": "Jammu and Kashmir"
+ },
+ {
+ "state_number": "02",
+ "state_code": "HP",
+ "state_name": "Himachal Pradesh"
+ },
+ {
+ "state_number": "06",
+ "state_code": "HR",
+ "state_name": "Haryana"
+ },
+ {
+ "state_number": "24",
+ "state_code": "GJ",
+ "state_name": "Gujarat"
+ },
+ {
+ "state_number": "30",
+ "state_code": "GA",
+ "state_name": "Goa"
+ },
+ {
+ "state_number": "07",
+ "state_code": "DL",
+ "state_name": "Delhi"
+ },
+ {
+ "state_number": "25",
+ "state_code": "DD",
+ "state_name": "Daman and Diu"
+ },
+ {
+ "state_number": "26",
+ "state_code": "DN",
+ "state_name": "Dadra and Nagar Haveli"
+ },
+ {
+ "state_number": "22",
+ "state_code": "CT",
+ "state_name": "Chattisgarh"
+ },
+ {
+ "state_number": "04",
+ "state_code": "CH",
+ "state_name": "Chandigarh"
+ },
+ {
+ "state_number": "10",
+ "state_code": "BH",
+ "state_name": "Bihar"
+ },
+ {
+ "state_number": "18",
+ "state_code": "AS",
+ "state_name": "Assam"
+ },
+ {
+ "state_number": "12",
+ "state_code": "AR",
+ "state_name": "Arunachal Pradesh"
+ },
+ {
+ "state_number": "37",
+ "state_code": "AD",
+ "state_name": "Andhra Pradesh (New)"
+ }
+]