mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-10 00:19:00 +00:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
777b16ffda | ||
|
|
efaf9f59db | ||
|
|
239c9387d1 | ||
|
|
e74e4b18c7 | ||
|
|
012f5b0a50 | ||
|
|
05d62127d0 | ||
|
|
7549a83b9b | ||
|
|
c3153655eb | ||
|
|
96488b0f34 | ||
|
|
1a60931435 | ||
|
|
8f507a984e | ||
|
|
57d3cecd68 | ||
|
|
de609a2fb6 | ||
|
|
7312186c76 | ||
|
|
0a32b7a6eb | ||
|
|
c1a1e62c0d | ||
|
|
b12f2109b5 | ||
|
|
a13c6a1bef | ||
|
|
79ed58fd36 | ||
|
|
860144feb7 | ||
|
|
1efb05233c | ||
|
|
ef8d6dc8f8 | ||
|
|
79c2191aa3 | ||
|
|
f012a9db70 | ||
|
|
4e1a3c1d58 | ||
|
|
fb8e59234b | ||
|
|
31af0849db | ||
|
|
bfdb726072 | ||
|
|
a8406e1544 | ||
|
|
b2aa867b70 | ||
|
|
30f2bcbccc | ||
|
|
7d885432eb | ||
|
|
3b5f774144 | ||
|
|
3a200bbc44 | ||
|
|
2bedca04ae | ||
|
|
1a0536bff4 | ||
|
|
cdba021802 | ||
|
|
3fe5ecc611 | ||
|
|
296fbfeaac | ||
|
|
4a7b4efbec | ||
|
|
b1f0fd4ac3 | ||
|
|
f7d2a59c18 | ||
|
|
0ac8542eaa | ||
|
|
c8b6d3badb | ||
|
|
cdf4320b3b | ||
|
|
5b2d3222f3 | ||
|
|
5d202ca31a | ||
|
|
7088db9e1f | ||
|
|
ec344ffa96 | ||
|
|
a52e726b6b | ||
|
|
cf82c3828e | ||
|
|
6fcfbaa1f9 | ||
|
|
a6c733d06c | ||
|
|
46ef26df71 | ||
|
|
99d571a786 | ||
|
|
e3ae600277 | ||
|
|
dd7a723214 | ||
|
|
ccaf36a00f | ||
|
|
101a021f7b | ||
|
|
68ed0488a3 | ||
|
|
75a233b472 | ||
|
|
5a174d61bc | ||
|
|
7a2815299e | ||
|
|
195d2b577f | ||
|
|
8c85562ceb | ||
|
|
77aa4762b8 | ||
|
|
35ecab6a52 | ||
|
|
097da8cc89 | ||
|
|
1d52a4df22 | ||
|
|
cd61a20fb4 | ||
|
|
8f7eb358b8 | ||
|
|
0e285265b1 | ||
|
|
b866fcf14f | ||
|
|
3d190a15ab | ||
|
|
ab59e4769b | ||
|
|
7b5ca3e494 | ||
|
|
8f2c8f6e9d | ||
|
|
76c5924cbe | ||
|
|
6eb55042d8 | ||
|
|
9589527784 | ||
|
|
dba3f0048b | ||
|
|
3f6a5b2539 | ||
|
|
cf7f72e586 | ||
|
|
74d07c695b | ||
|
|
5cf3868d03 | ||
|
|
1b36336fc3 | ||
|
|
3f3ac5652f | ||
|
|
7b8d366e3a | ||
|
|
a29442d6bf | ||
|
|
bbe16c80ff | ||
|
|
4e21f11864 | ||
|
|
19d52dc503 | ||
|
|
701f7cccbf | ||
|
|
8b486b0f28 | ||
|
|
6705ab3eaf | ||
|
|
233a19a373 | ||
|
|
fbb5945ff3 | ||
|
|
7773ee8960 | ||
|
|
8ad168ac67 | ||
|
|
3e9520b276 | ||
|
|
934e69fe0b | ||
|
|
bedb486c55 | ||
|
|
19d9381197 | ||
|
|
7640858510 |
50
.travis.yml
50
.travis.yml
@@ -1,6 +1,12 @@
|
||||
language: python
|
||||
dist: trusty
|
||||
group: deprecated-2017Q2
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- google-chrome
|
||||
packages:
|
||||
- google-chrome-stable
|
||||
|
||||
python:
|
||||
- "2.7"
|
||||
@@ -8,43 +14,43 @@ python:
|
||||
services:
|
||||
- mysql
|
||||
|
||||
before_install:
|
||||
- "export DISPLAY=:99.0"
|
||||
- "sh -e /etc/init.d/xvfb start"
|
||||
|
||||
install:
|
||||
- sudo rm /etc/apt/sources.list.d/docker.list
|
||||
- sudo apt-get purge -y mysql-common mysql-server mysql-client
|
||||
- nvm install v7.10.0
|
||||
# - wget https://raw.githubusercontent.com/frappe/bench/master/install_scripts/setup_frappe.sh
|
||||
# - sudo bash setup_frappe.sh --skip-setup-bench --mysql-root-password travis --bench-branch develop
|
||||
- wget https://raw.githubusercontent.com/frappe/bench/master/playbooks/install.py
|
||||
- sudo python install.py --develop --user travis --without-bench-setup
|
||||
- sudo pip install -e ~/bench
|
||||
|
||||
# - sudo pip install --upgrade pip
|
||||
- rm $TRAVIS_BUILD_DIR/.git/shallow
|
||||
- bash $TRAVIS_BUILD_DIR/travis/bench_init.sh
|
||||
- cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/
|
||||
|
||||
script:
|
||||
before_script:
|
||||
- wget http://chromedriver.storage.googleapis.com/2.27/chromedriver_linux64.zip
|
||||
- unzip chromedriver_linux64.zip
|
||||
- sudo apt-get install libnss3
|
||||
- sudo apt-get --only-upgrade install google-chrome-stable
|
||||
- sudo cp chromedriver /usr/local/bin/.
|
||||
- sudo chmod +x /usr/local/bin/chromedriver
|
||||
- export DISPLAY=:99.0
|
||||
- sh -e /etc/init.d/xvfb start
|
||||
- sleep 3
|
||||
- mysql -u root -ptravis -e 'create database test_frappe'
|
||||
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root -ptravis
|
||||
- echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root -ptravis
|
||||
|
||||
- cd ~/frappe-bench
|
||||
- bench get-app erpnext $TRAVIS_BUILD_DIR
|
||||
- bench use test_site
|
||||
- bench reinstall --yes
|
||||
- bench build
|
||||
- bench scheduler disable
|
||||
- bench start &
|
||||
- sleep 10
|
||||
- bench --verbose run-tests --driver Firefox
|
||||
|
||||
before_script:
|
||||
- mysql -u root -ptravis -e 'create database test_frappe'
|
||||
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root -ptravis
|
||||
- echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root -ptravis
|
||||
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- https://webhooks.gitter.im/e/92b3bea86d8c5397beef
|
||||
on_success: always
|
||||
on_failure: always
|
||||
on_start: never
|
||||
script:
|
||||
- set -e
|
||||
- bench --verbose run-tests
|
||||
- sleep 5
|
||||
- bench --verbose run-tests --ui-tests
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
__version__ = '8.3.1'
|
||||
|
||||
__version__ = '8.4.1'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
|
||||
@@ -83,7 +83,7 @@ def validate_expense_against_budget(args):
|
||||
|
||||
budget_records = frappe.db.sql("""
|
||||
select
|
||||
b.{budget_against_field}, ba.budget_amount, b.monthly_distribution,
|
||||
b.{budget_against_field} as budget_against, ba.budget_amount, b.monthly_distribution,
|
||||
b.action_if_annual_budget_exceeded,
|
||||
b.action_if_accumulated_monthly_budget_exceeded
|
||||
from
|
||||
@@ -111,15 +111,15 @@ def validate_budget_records(args, budget_records):
|
||||
args["month_end_date"] = get_last_day(args.posting_date)
|
||||
|
||||
compare_expense_with_budget(args, budget_amount,
|
||||
_("Accumulated Monthly"), monthly_action)
|
||||
_("Accumulated Monthly"), monthly_action, budget.budget_against)
|
||||
|
||||
if yearly_action in ("Stop", "Warn") and monthly_action != "Stop" \
|
||||
and yearly_action != monthly_action:
|
||||
compare_expense_with_budget(args, flt(budget.budget_amount),
|
||||
_("Annual"), yearly_action)
|
||||
_("Annual"), yearly_action, budget.budget_against)
|
||||
|
||||
|
||||
def compare_expense_with_budget(args, budget_amount, action_for, action):
|
||||
def compare_expense_with_budget(args, budget_amount, action_for, action, budget_against):
|
||||
actual_expense = get_actual_expense(args)
|
||||
if actual_expense > budget_amount:
|
||||
diff = actual_expense - budget_amount
|
||||
@@ -127,7 +127,7 @@ def compare_expense_with_budget(args, budget_amount, action_for, action):
|
||||
|
||||
msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It will exceed by {5}").format(
|
||||
_(action_for), frappe.bold(args.account), args.budget_against_field,
|
||||
frappe.bold(args.budget_against),
|
||||
frappe.bold(budget_against),
|
||||
frappe.bold(fmt_money(budget_amount, currency=currency)),
|
||||
frappe.bold(fmt_money(diff, currency=currency)))
|
||||
|
||||
|
||||
@@ -140,6 +140,33 @@ class TestBudget(unittest.TestCase):
|
||||
budget.load_from_db()
|
||||
budget.cancel()
|
||||
|
||||
def test_monthly_budget_against_parent_group_cost_center(self):
|
||||
cost_center = "_Test Cost Center 3 - _TC"
|
||||
|
||||
if not frappe.db.exists("Cost Center", cost_center):
|
||||
frappe.get_doc({
|
||||
'doctype': 'Cost Center',
|
||||
'cost_center_name': '_Test Cost Center 3',
|
||||
'parent_cost_center': "_Test Company - _TC",
|
||||
'company': '_Test Company',
|
||||
'is_group': 0
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
budget = make_budget("Cost Center", cost_center)
|
||||
frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
|
||||
|
||||
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
|
||||
"_Test Bank - _TC", 40000, cost_center)
|
||||
|
||||
self.assertRaises(BudgetError, jv.submit)
|
||||
|
||||
budget.load_from_db()
|
||||
budget.cancel()
|
||||
jv.cancel()
|
||||
|
||||
frappe.delete_doc('Journal Entry', jv.name)
|
||||
frappe.delete_doc('Cost Center', cost_center)
|
||||
|
||||
def set_total_expense_zero(posting_date, budget_against_field=None, budget_against_CC=None):
|
||||
if budget_against_field == "Project":
|
||||
budget_against = "_Test Project"
|
||||
@@ -167,7 +194,8 @@ def make_budget(budget_against=None, cost_center=None):
|
||||
if budget_against == "Project":
|
||||
budget_list = frappe.get_all("Budget", fields=["name"], filters = {"name": ("like", "_Test Project/_Test Fiscal Year 2013%")})
|
||||
else:
|
||||
budget_list = frappe.get_all("Budget", fields=["name"], filters = {"name": ("like", "_Test Cost Center - _TC/_Test Fiscal Year 2013%")})
|
||||
cost_center_name = "{0}%".format(cost_center or "_Test Cost Center - _TC/_Test Fiscal Year 2013")
|
||||
budget_list = frappe.get_all("Budget", fields=["name"], filters = {"name": ("like", cost_center_name)})
|
||||
for d in budget_list:
|
||||
frappe.db.sql("delete from `tabBudget` where name = %(name)s", d)
|
||||
frappe.db.sql("delete from `tabBudget Account` where parent = %(name)s", d)
|
||||
|
||||
@@ -291,37 +291,39 @@ frappe.ui.form.on('Payment Entry', {
|
||||
|
||||
set_account_currency_and_balance: function(frm, account, currency_field,
|
||||
balance_field, callback_function) {
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.payment_entry.payment_entry.get_account_details",
|
||||
args: {
|
||||
"account": account,
|
||||
"date": frm.doc.posting_date
|
||||
},
|
||||
callback: function(r, rt) {
|
||||
if(r.message) {
|
||||
frm.set_value(currency_field, r.message['account_currency']);
|
||||
frm.set_value(balance_field, r.message['account_balance']);
|
||||
if (frm.doc.posting_date) {
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.payment_entry.payment_entry.get_account_details",
|
||||
args: {
|
||||
"account": account,
|
||||
"date": frm.doc.posting_date
|
||||
},
|
||||
callback: function(r, rt) {
|
||||
if(r.message) {
|
||||
frm.set_value(currency_field, r.message['account_currency']);
|
||||
frm.set_value(balance_field, r.message['account_balance']);
|
||||
|
||||
if(frm.doc.payment_type=="Receive" && currency_field=="paid_to_account_currency") {
|
||||
frm.toggle_reqd(["reference_no", "reference_date"],
|
||||
(r.message['account_type'] == "Bank" ? 1 : 0));
|
||||
if(!frm.doc.received_amount && frm.doc.paid_amount)
|
||||
frm.events.paid_amount(frm);
|
||||
} else if(frm.doc.payment_type=="Pay" && currency_field=="paid_from_account_currency") {
|
||||
frm.toggle_reqd(["reference_no", "reference_date"],
|
||||
(r.message['account_type'] == "Bank" ? 1 : 0));
|
||||
if(frm.doc.payment_type=="Receive" && currency_field=="paid_to_account_currency") {
|
||||
frm.toggle_reqd(["reference_no", "reference_date"],
|
||||
(r.message['account_type'] == "Bank" ? 1 : 0));
|
||||
if(!frm.doc.received_amount && frm.doc.paid_amount)
|
||||
frm.events.paid_amount(frm);
|
||||
} else if(frm.doc.payment_type=="Pay" && currency_field=="paid_from_account_currency") {
|
||||
frm.toggle_reqd(["reference_no", "reference_date"],
|
||||
(r.message['account_type'] == "Bank" ? 1 : 0));
|
||||
|
||||
if(!frm.doc.paid_amount && frm.doc.received_amount)
|
||||
frm.events.received_amount(frm);
|
||||
if(!frm.doc.paid_amount && frm.doc.received_amount)
|
||||
frm.events.received_amount(frm);
|
||||
}
|
||||
|
||||
if(callback_function) callback_function(frm);
|
||||
|
||||
frm.events.hide_unhide_fields(frm);
|
||||
frm.events.set_dynamic_labels(frm);
|
||||
}
|
||||
|
||||
if(callback_function) callback_function(frm);
|
||||
|
||||
frm.events.hide_unhide_fields(frm);
|
||||
frm.events.set_dynamic_labels(frm);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
paid_from_account_currency: function(frm) {
|
||||
|
||||
@@ -492,9 +492,13 @@ def get_outstanding_reference_documents(args):
|
||||
|
||||
for d in outstanding_invoices:
|
||||
d["exchange_rate"] = 1
|
||||
if party_account_currency != company_currency \
|
||||
and d.voucher_type in ("Sales Invoice", "Purchase Invoice"):
|
||||
if party_account_currency != company_currency:
|
||||
if d.voucher_type in ("Sales Invoice", "Purchase Invoice"):
|
||||
d["exchange_rate"] = frappe.db.get_value(d.voucher_type, d.voucher_no, "conversion_rate")
|
||||
elif d.voucher_type == "Journal Entry":
|
||||
d["exchange_rate"] = get_exchange_rate(
|
||||
party_account_currency, company_currency, d.posting_date
|
||||
)
|
||||
|
||||
# Get all SO / PO which are not fully billed or aginst which full advance not paid
|
||||
orders_to_be_billed = get_orders_to_be_billed(args.get("posting_date"),args.get("party_type"), args.get("party"),
|
||||
|
||||
@@ -185,7 +185,7 @@ def get_pricing_rule_for_item(args):
|
||||
"discount_percentage": 0.0
|
||||
})
|
||||
else:
|
||||
item_details.discount_percentage = pricing_rule.discount_percentage
|
||||
item_details.discount_percentage = pricing_rule.discount_percentage or args.discount_percentage
|
||||
elif args.get('pricing_rule'):
|
||||
item_details = remove_pricing_rule_for_item(args.get("pricing_rule"), item_details)
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
||||
import unittest
|
||||
import frappe
|
||||
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
|
||||
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
|
||||
from erpnext.stock.get_item_details import get_item_details
|
||||
from frappe import MandatoryError
|
||||
|
||||
@@ -248,4 +249,51 @@ class TestPricingRule(unittest.TestCase):
|
||||
so.submit()
|
||||
so = frappe.get_doc('Sales Order', so.name)
|
||||
self.assertEquals(so.items[0].discount_percentage, 0)
|
||||
self.assertEquals(so.items[0].rate, 100)
|
||||
self.assertEquals(so.items[0].rate, 100)
|
||||
|
||||
def test_pricing_rule_with_margin_and_discount(self):
|
||||
make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10)
|
||||
si = create_sales_invoice(do_not_save=True)
|
||||
si.items[0].price_list_rate = 1000
|
||||
si.insert(ignore_permissions=True)
|
||||
|
||||
item = si.items[0]
|
||||
self.assertEquals(item.rate, 1100)
|
||||
self.assertEquals(item.margin_rate_or_amount, 10)
|
||||
|
||||
# With discount
|
||||
item.discount_percentage = 10
|
||||
si.save()
|
||||
item = si.items[0]
|
||||
self.assertEquals(item.rate, 990)
|
||||
self.assertEquals(item.discount_percentage, 10)
|
||||
frappe.db.sql("delete from `tabPricing Rule`")
|
||||
|
||||
def make_pricing_rule(**args):
|
||||
args = frappe._dict(args)
|
||||
|
||||
doc = frappe.get_doc({
|
||||
"doctype": "Pricing Rule",
|
||||
"title": args.title or "_Test Pricing Rule",
|
||||
"company": args.company or "_Test Company",
|
||||
"apply_on": args.apply_on or "Item Code",
|
||||
"item_code": args.item_code or "_Test Item",
|
||||
"applicable_for": args.applicable_for,
|
||||
"selling": args.selling or 0,
|
||||
"buying": args.buying or 0,
|
||||
"min_qty": args.min_qty or 0.0,
|
||||
"max_qty": args.max_qty or 0.0,
|
||||
"price_or_discount": args.price_or_discount or "Discount Percentage",
|
||||
"discount_percentage": args.discount_percentage or 0.0,
|
||||
"price": args.price or 0.0,
|
||||
"margin_type": args.margin_type,
|
||||
"margin_rate_or_amount": args.margin_rate_or_amount or 0.0
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
apply_on = doc.apply_on.replace(' ', '_').lower()
|
||||
if args.get(apply_on) and apply_on != "item_code":
|
||||
doc.db_set(apply_on, args.get(apply_on))
|
||||
|
||||
applicable_for = doc.applicable_for.replace(' ', '_').lower()
|
||||
if args.get(applicable_for):
|
||||
doc.db_set(applicable_for, args.get(applicable_for))
|
||||
@@ -12,6 +12,7 @@
|
||||
"doctype": "DocType",
|
||||
"document_type": "",
|
||||
"editable_grid": 0,
|
||||
"engine": "InnoDB",
|
||||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
@@ -1927,7 +1928,7 @@
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Item-wise Tax Breakup",
|
||||
"label": "Tax Breakup",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
@@ -4687,7 +4688,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2017-07-04 17:11:09.477003",
|
||||
"modified": "2017-07-07 13:05:37.469682",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Sales Invoice",
|
||||
|
||||
@@ -803,9 +803,10 @@ class SalesInvoice(SellingController):
|
||||
continue
|
||||
|
||||
for serial_no in item.serial_no.split("\n"):
|
||||
sno = frappe.get_doc('Serial No', serial_no)
|
||||
sno.sales_invoice = invoice
|
||||
sno.db_update()
|
||||
if serial_no and frappe.db.exists('Serial No', serial_no):
|
||||
sno = frappe.get_doc('Serial No', serial_no)
|
||||
sno.sales_invoice = invoice
|
||||
sno.db_update()
|
||||
|
||||
def validate_serial_numbers(self):
|
||||
"""
|
||||
|
||||
@@ -1107,6 +1107,16 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
|
||||
def test_item_wise_tax_breakup(self):
|
||||
si = create_sales_invoice(qty=100, rate=50, do_not_save=True)
|
||||
si.append("items", {
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
"qty": 100,
|
||||
"rate": 50,
|
||||
"income_account": "Sales - _TC",
|
||||
"expense_account": "Cost of Goods Sold - _TC",
|
||||
"cost_center": "_Test Cost Center - _TC"
|
||||
})
|
||||
|
||||
si.append("taxes", {
|
||||
"charge_type": "On Net Total",
|
||||
"account_head": "_Test Account Service Tax - _TC",
|
||||
@@ -1115,8 +1125,8 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
"rate": 10
|
||||
})
|
||||
si.insert()
|
||||
|
||||
tax_breakup_html = '''\n<div class="tax-break-up" style="overflow-x: auto;">\n\t<table class="table table-bordered table-hover">\n\t\t<thead><tr><th class="text-left" style="min-width: 120px;">Item Name</th>\n<th class="text-right" style="min-width: 80px;">Taxable Amount</th>\n<th class="text-right" style="min-width: 80px;">_Test Account Service Tax - _TC</th></tr></thead>\n\t\t<tbody><tr><td>_Test Item</td><td class="text-right">\u20b9 5,000.00</td><td class="text-right">(10.0%) \u20b9 500.00</td></tr></tbody>\n\t</table>\n</div>'''
|
||||
|
||||
tax_breakup_html = '''\n<div class="tax-break-up" style="overflow-x: auto;">\n\t<table class="table table-bordered table-hover">\n\t\t<thead><tr><th class="text-left" style="min-width: 120px;">Item Name</th><th class="text-right" style="min-width: 80px;">Taxable Amount</th><th class="text-right" style="min-width: 80px;">_Test Account Service Tax - _TC</th></tr></thead>\n\t\t<tbody><tr><td>_Test Item</td><td class="text-right">\u20b9 10,000.00</td><td class="text-right">(10.0%) \u20b9 1,000.00</td></tr></tbody>\n\t</table>\n</div>'''
|
||||
|
||||
self.assertEqual(si.other_charges_calculation, tax_breakup_html)
|
||||
|
||||
|
||||
@@ -1078,7 +1078,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
} else if (item.barcode == me.serach_item.$input.val()) {
|
||||
search_status = false;
|
||||
return item.barcode == me.serach_item.$input.val();
|
||||
} else if (reg.test(item.item_code.toLowerCase()) || reg.test(item.description.toLowerCase()) ||
|
||||
} else if (reg.test(item.item_code.toLowerCase()) || (item.description && reg.test(item.description.toLowerCase())) ||
|
||||
reg.test(item.item_name.toLowerCase()) || reg.test(item.item_group.toLowerCase())) {
|
||||
return true
|
||||
}
|
||||
@@ -1351,7 +1351,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.child.item_name = this.items[0].item_name;
|
||||
this.child.stock_uom = this.items[0].stock_uom;
|
||||
this.child.brand = this.items[0].brand;
|
||||
this.child.description = this.items[0].description;
|
||||
this.child.description = this.items[0].description || this.items[0].item_name;
|
||||
this.child.discount_percentage = 0.0;
|
||||
this.child.qty = 1;
|
||||
this.child.item_group = this.items[0].item_group;
|
||||
|
||||
@@ -8,9 +8,10 @@ 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.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, get_company_address)
|
||||
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
|
||||
from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency
|
||||
from erpnext.accounts.utils import get_fiscal_year
|
||||
@@ -77,8 +78,9 @@ def set_address_details(out, party, party_type, doctype=None, company=None):
|
||||
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))
|
||||
out.update(get_company_address(company))
|
||||
if out.company_address:
|
||||
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)
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
{% var letterhead= filters.letter_head || (frappe.get_doc(":Company", filters.company) && frappe.get_doc(":Company", filters.company).default_letter_head) || frappe.defaults.get_default("letter_head"); %}
|
||||
{% if(letterhead) { %}
|
||||
<div style="margin-bottom: 7px;" class="text-center">
|
||||
{%= frappe.boot.letter_heads[letterhead].header %}
|
||||
</div>
|
||||
{% } %}
|
||||
<h2 class="text-center">{%= __(report.report_name) %}</h2>
|
||||
<h4 class="text-center">{%= filters.customer || filters.supplier %} </h4>
|
||||
<h5 class="text-center">
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
{% var letterhead= filters.letter_head || (frappe.get_doc(":Company", filters.company) && frappe.get_doc(":Company", filters.company).default_letter_head) || frappe.defaults.get_default("letter_head"); %}
|
||||
{% if(letterhead) { %}
|
||||
<div style="margin-bottom: 7px;" class="text-center">
|
||||
{%= frappe.boot.letter_heads[letterhead].header %}
|
||||
</div>
|
||||
{% } %}
|
||||
<h2 class="text-center">{%= __("Statement of Account") %}</h2>
|
||||
<h4 class="text-center">
|
||||
{% if (filters.party_name) { %}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"allow_copy": 0,
|
||||
"allow_guest_to_view": 0,
|
||||
"allow_import": 0,
|
||||
"allow_rename": 0,
|
||||
"autoname": "hash",
|
||||
@@ -13,6 +14,7 @@
|
||||
"engine": "InnoDB",
|
||||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
@@ -44,6 +46,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -73,34 +76,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break",
|
||||
"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,
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -131,6 +107,66 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break",
|
||||
"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,
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "lead_time_days",
|
||||
"fieldtype": "Int",
|
||||
"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": "Lead Time in days",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
@@ -160,6 +196,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -192,6 +229,7 @@
|
||||
"width": "300px"
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -219,6 +257,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -248,6 +287,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -278,6 +318,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -306,6 +347,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
@@ -338,6 +380,7 @@
|
||||
"width": "60px"
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -368,6 +411,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -397,6 +441,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -426,6 +471,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -453,6 +499,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -486,6 +533,7 @@
|
||||
"width": "100px"
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -515,6 +563,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -544,6 +593,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -571,6 +621,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
@@ -602,6 +653,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -633,6 +685,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -660,6 +713,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -694,6 +748,7 @@
|
||||
"width": "100px"
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -725,6 +780,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -754,6 +810,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -782,6 +839,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -811,6 +869,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -841,6 +900,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -869,6 +929,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -899,6 +960,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -929,6 +991,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -957,6 +1020,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -988,6 +1052,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1017,6 +1082,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1047,6 +1113,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1080,6 +1147,7 @@
|
||||
"width": "120px"
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1110,6 +1178,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1137,6 +1206,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1167,6 +1237,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1196,6 +1267,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1227,6 +1299,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1259,6 +1332,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1290,6 +1364,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1318,6 +1393,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1347,6 +1423,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 1,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -1377,17 +1454,17 @@
|
||||
"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,
|
||||
"modified": "2017-02-17 16:43:59.582188",
|
||||
"modified": "2017-07-10 09:08:52.015387",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Buying",
|
||||
"name": "Supplier Quotation Item",
|
||||
|
||||
@@ -517,9 +517,9 @@ class calculate_taxes_and_totals(object):
|
||||
|
||||
headings = get_table_column_headings(tax_accounts)
|
||||
|
||||
distinct_items = self.get_distinct_items()
|
||||
distinct_items, taxable_amount = self.get_distinct_items()
|
||||
|
||||
rows = get_table_rows(distinct_items, item_tax, tax_accounts, company_currency)
|
||||
rows = get_table_rows(distinct_items, item_tax, tax_accounts, company_currency, taxable_amount)
|
||||
|
||||
if not rows:
|
||||
self.doc.other_charges_calculation = ""
|
||||
@@ -531,8 +531,8 @@ class calculate_taxes_and_totals(object):
|
||||
<tbody>{rows}</tbody>
|
||||
</table>
|
||||
</div>'''.format(**{
|
||||
"headings": "\n".join(headings),
|
||||
"rows": "\n".join(rows)
|
||||
"headings": "".join(headings),
|
||||
"rows": "".join(rows)
|
||||
})
|
||||
|
||||
def get_item_tax(self, item_tax, tax_accounts, company_currency):
|
||||
@@ -559,7 +559,7 @@ class calculate_taxes_and_totals(object):
|
||||
|
||||
item_tax[item_code][tax.name] = [tax_rate, tax_amount]
|
||||
else:
|
||||
item_tax[item_code][tax.name] = [cstr(flt(tax_data, tax_rate_precision)) + "%", ""]
|
||||
item_tax[item_code][tax.name] = [cstr(flt(tax_data, tax_rate_precision)) + "%", "0.00"]
|
||||
tax_accounts.append([tax.name, tax.account_head])
|
||||
|
||||
return item_tax, tax_accounts
|
||||
@@ -568,13 +568,17 @@ class calculate_taxes_and_totals(object):
|
||||
def get_distinct_items(self):
|
||||
distinct_item_names = []
|
||||
distinct_items = []
|
||||
taxable_amount = {}
|
||||
for item in self.doc.items:
|
||||
item_code = item.item_code or item.item_name
|
||||
if item_code not in distinct_item_names:
|
||||
distinct_item_names.append(item_code)
|
||||
distinct_items.append(item)
|
||||
taxable_amount[item_code] = item.net_amount
|
||||
else:
|
||||
taxable_amount[item_code] = taxable_amount.get(item_code, 0) + item.net_amount
|
||||
|
||||
return distinct_items
|
||||
return distinct_items, taxable_amount
|
||||
|
||||
def get_table_column_headings(tax_accounts):
|
||||
headings_name = [_("Item Name"), _("Taxable Amount")] + [d[1] for d in tax_accounts]
|
||||
@@ -587,7 +591,7 @@ def get_table_column_headings(tax_accounts):
|
||||
|
||||
return headings
|
||||
|
||||
def get_table_rows(distinct_items, item_tax, tax_accounts, company_currency):
|
||||
def get_table_rows(distinct_items, item_tax, tax_accounts, company_currency, taxable_amount):
|
||||
rows = []
|
||||
for item in distinct_items:
|
||||
item_tax_record = item_tax.get(item.item_code or item.item_name)
|
||||
@@ -601,11 +605,12 @@ def get_table_rows(distinct_items, item_tax, tax_accounts, company_currency):
|
||||
+ item_tax_record[head[0]][1] + "</td>")
|
||||
else:
|
||||
taxes.append("<td></td>")
|
||||
|
||||
|
||||
item_code = item.item_code or item.item_name
|
||||
rows.append("<tr><td>{item_name}</td><td class='text-right'>{taxable_amount}</td>{taxes}</tr>".format(**{
|
||||
"item_name": item.item_name,
|
||||
"taxable_amount": fmt_money(item.net_amount, item.precision("net_amount"), company_currency),
|
||||
"taxes": "\n".join(taxes)
|
||||
"taxable_amount": fmt_money(taxable_amount.get(item_code, 0), item.precision("net_amount"), company_currency),
|
||||
"taxes": "".join(taxes)
|
||||
}))
|
||||
|
||||
return rows
|
||||
@@ -56,7 +56,7 @@
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Series",
|
||||
"length": 0,
|
||||
@@ -88,7 +88,7 @@
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Opportunity From",
|
||||
"length": 0,
|
||||
@@ -277,8 +277,8 @@
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 1,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Opportunity Type",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
@@ -310,7 +310,7 @@
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Status",
|
||||
"length": 0,
|
||||
@@ -1189,7 +1189,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-06-13 14:29:07.077697",
|
||||
"modified": "2017-07-10 15:29:23.921967",
|
||||
"modified_by": "Administrator",
|
||||
"module": "CRM",
|
||||
"name": "Opportunity",
|
||||
|
||||
@@ -272,4 +272,6 @@ def auto_close_opportunity():
|
||||
for opportunity in opportunities:
|
||||
doc = frappe.get_doc("Opportunity", opportunity.get("name"))
|
||||
doc.status = "Closed"
|
||||
doc.save(ignore_permissions=True)
|
||||
doc.flags.ignore_permissions = True
|
||||
doc.flags.ignore_mandatory = True
|
||||
doc.save()
|
||||
BIN
erpnext/docs/assets/img/setup/email/email-alert-set-property.png
Normal file
BIN
erpnext/docs/assets/img/setup/email/email-alert-set-property.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 204 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -640,8 +640,8 @@ attach them to the start of each source file to most effectively state
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.</p>
|
||||
|
||||
<pre><code> <one line="" to="" give="" the="" program's="" name="" and="" a="" brief="" idea="" of="" what="" it="" does.="">
|
||||
Copyright (C) <year> <name of="" author="">
|
||||
<pre><code> <one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -42,6 +42,7 @@ Email alerts allow you to set conditions according to the field data in your doc
|
||||
|
||||
The above example will send an Email Alert when a Task is saved with the status "Open" and the Expected End Date for the Task is the date on or before the date on which it was saved on.
|
||||
|
||||
|
||||
### Setting a Message
|
||||
|
||||
You can use both Jinja Tags (`{% raw %}{{ doc.[field_name] }}{% endraw %}`) and HTML tags in the message textbox.
|
||||
@@ -64,6 +65,17 @@ You can use both Jinja Tags (`{% raw %}{{ doc.[field_name] }}{% endraw %}`) and
|
||||
|
||||
---
|
||||
|
||||
### Setting a Value after the Alert is Set
|
||||
|
||||
Sometimes to make sure that the email alert is not sent multiple times, you can
|
||||
define a custom property (via Customize Form) like "Email Alert Sent" and then
|
||||
set this property after the alert is sent by setting the **Set Property After Alert**
|
||||
field.
|
||||
|
||||
Then you can use that as a condition in the **Condition** rules to ensure emails are not sent multiple times
|
||||
|
||||
<img class="screenshot" alt="Setting Property in Email Alert" src="{{docs_base_url}}/assets/img/setup/email/email-alert-subject.png">
|
||||
|
||||
### Example
|
||||
|
||||
1. Defining the Criteria
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# User Interface and Navigation
|
||||
|
||||
<iframe width="660" height="371" src="https://www.youtube.com/embed/HdblX7kOWWs" frameborder="0" allowfullscreen></iframe>
|
||||
<iframe width="660" height="371" src="https://www.youtube.com/embed/vKjHRzMEei0" frameborder="0" allowfullscreen></iframe>
|
||||
|
||||
**Duration: 2:17**
|
||||
**Duration: 2:41**
|
||||
|
||||
This video walks you through using the ERPNext "Desk" interface. The ERPNext User Interface is very web friendly and if you have used a website or mobile app before, the navigation should be very intuitive.
|
||||
|
||||
@@ -80,6 +80,13 @@ website_route_rules = [
|
||||
"parents": [{"title": _("Supplier Quotation"), "name": "quotations"}]
|
||||
}
|
||||
},
|
||||
{"from_route": "/quotes", "to_route": "Quotation"},
|
||||
{"from_route": "/quotes/<path:name>", "to_route": "order",
|
||||
"defaults": {
|
||||
"doctype": "Quotation",
|
||||
"parents": [{"title": _("Quotes"), "name": "quotes"}]
|
||||
}
|
||||
},
|
||||
{"from_route": "/shipments", "to_route": "Delivery Note"},
|
||||
{"from_route": "/shipments/<path:name>", "to_route": "order",
|
||||
"defaults": {
|
||||
@@ -110,6 +117,7 @@ standard_portal_menu_items = [
|
||||
{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
|
||||
{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
|
||||
{"title": _("Supplier Quotation"), "route": "/quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
|
||||
{"title": _("Quotes"), "route": "/quotes", "reference_doctype": "Quotation", "role":"Customer"},
|
||||
{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
|
||||
{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
|
||||
{"title": _("Shipments"), "route": "/shipments", "reference_doctype": "Delivery Note", "role":"Customer"},
|
||||
|
||||
@@ -12,32 +12,31 @@ import frappe.utils
|
||||
|
||||
class TestDailyWorkSummary(unittest.TestCase):
|
||||
def test_email_trigger(self):
|
||||
settings, employees, emails = self.setup_and_prepare_test()
|
||||
|
||||
for d in employees:
|
||||
self.setup_and_prepare_test()
|
||||
for d in self.employees:
|
||||
# check that email is sent to this employee
|
||||
self.assertTrue(d.user_id in [d.recipient for d in emails
|
||||
if settings.subject in d.message])
|
||||
self.assertTrue(d.user_id in [d.recipient for d in self.emails
|
||||
if self.settings.subject in d.message])
|
||||
|
||||
def test_email_trigger_failed(self):
|
||||
hour = '00'
|
||||
if frappe.utils.nowtime().split(':')[0]=='00':
|
||||
hour = '01'
|
||||
|
||||
settings, employees, emails = self.setup_and_prepare_test(hour)
|
||||
self.setup_and_prepare_test(hour)
|
||||
|
||||
for d in employees:
|
||||
for d in self.employees:
|
||||
# check that email is sent to this employee
|
||||
self.assertFalse(d.user_id in [d.recipient for d in emails
|
||||
if settings.subject in d.message])
|
||||
self.assertFalse(d.user_id in [d.recipient for d in self.emails
|
||||
if self.settings.subject in d.message])
|
||||
|
||||
def test_incoming(self):
|
||||
settings, employees, emails = self.setup_and_prepare_test()
|
||||
|
||||
# get test mail with message-id as in-reply-to
|
||||
self.setup_and_prepare_test()
|
||||
|
||||
with open(os.path.join(os.path.dirname(__file__), "test_data", "test-reply.raw"), "r") as f:
|
||||
test_mails = [f.read().replace('{{ sender }}', employees[-1].user_id)\
|
||||
.replace('{{ message_id }}', emails[-1].message_id)]
|
||||
test_mails = [f.read().replace('{{ sender }}', self.employees[-1].user_id)\
|
||||
.replace('{{ message_id }}', self.emails[-1].message_id)]
|
||||
|
||||
# pull the mail
|
||||
email_account = frappe.get_doc("Email Account", "_Test Email Account 1")
|
||||
@@ -52,30 +51,34 @@ class TestDailyWorkSummary(unittest.TestCase):
|
||||
self.assertTrue('I built Daily Work Summary!' in summary)
|
||||
|
||||
def setup_and_prepare_test(self, hour=None):
|
||||
if not hour:
|
||||
hour = frappe.utils.nowtime().split(':')[0]
|
||||
frappe.db.sql('delete from `tabDaily Work Summary`')
|
||||
frappe.db.sql('delete from `tabEmail Queue`')
|
||||
frappe.db.sql('delete from `tabEmail Queue Recipient`')
|
||||
frappe.db.sql('delete from `tabCommunication`')
|
||||
|
||||
# setup email to trigger at this our
|
||||
settings = frappe.get_doc('Daily Work Summary Settings')
|
||||
settings.companies = []
|
||||
|
||||
settings.append('companies', dict(company='_Test Company',
|
||||
send_emails_at=hour + ':00'))
|
||||
settings.test_subject = 'this is a subject for testing summary emails'
|
||||
settings.save()
|
||||
self.setup_settings(hour)
|
||||
|
||||
from erpnext.hr.doctype.daily_work_summary_settings.daily_work_summary_settings \
|
||||
import trigger_emails
|
||||
trigger_emails()
|
||||
|
||||
# check if emails are created
|
||||
employees = frappe.get_all('Employee', fields = ['user_id'],
|
||||
filters=dict(company='_Test Company', status='Active'))
|
||||
self.employees = frappe.get_all('Employee', fields = ['user_id'],
|
||||
filters=dict(company='_Test Company', status='Active', user_id=('!=', 'test@example.com')))
|
||||
|
||||
emails = frappe.db.sql("""select r.recipient, q.message, q.message_id from `tabEmail Queue` as q, `tabEmail Queue Recipient` as r where q.name = r.parent""", as_dict=1)
|
||||
self.emails = frappe.db.sql("""select r.recipient, q.message, q.message_id from `tabEmail Queue` as q, `tabEmail Queue Recipient` as r where q.name = r.parent""", as_dict=1)
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
def setup_settings(self, hour=None):
|
||||
# setup email to trigger at this our
|
||||
if not hour:
|
||||
hour = frappe.utils.nowtime().split(':')[0]
|
||||
self.settings = frappe.get_doc('Daily Work Summary Settings')
|
||||
self.settings.companies = []
|
||||
|
||||
self.settings.append('companies', dict(company='_Test Company',
|
||||
send_emails_at=hour + ':00'))
|
||||
self.settings.test_subject = 'this is a subject for testing summary emails'
|
||||
self.settings.save()
|
||||
|
||||
return settings, employees, emails
|
||||
@@ -365,9 +365,6 @@ class BOM(WebsiteGenerator):
|
||||
base_total_rm_cost = 0
|
||||
|
||||
for d in self.get('items'):
|
||||
if d.bom_no:
|
||||
d.rate = self.get_bom_unitcost(d.bom_no)
|
||||
|
||||
d.base_rate = flt(d.rate) * flt(self.conversion_rate)
|
||||
d.amount = flt(d.rate, self.precision("rate", d)) * flt(d.stock_qty, self.precision("stock_qty", d))
|
||||
d.base_amount = d.amount * flt(self.conversion_rate)
|
||||
|
||||
@@ -151,26 +151,28 @@ frappe.ui.form.on("Production Order", {
|
||||
},
|
||||
|
||||
production_item: function(frm) {
|
||||
frappe.call({
|
||||
method: "erpnext.manufacturing.doctype.production_order.production_order.get_item_details",
|
||||
args: {
|
||||
item: frm.doc.production_item,
|
||||
project: frm.doc.project
|
||||
},
|
||||
callback: function(r) {
|
||||
if(r.message) {
|
||||
erpnext.in_production_item_onchange = true;
|
||||
$.each(["description", "stock_uom", "project", "bom_no"], function(i, field) {
|
||||
frm.set_value(field, r.message[field]);
|
||||
});
|
||||
if (frm.doc.production_item) {
|
||||
frappe.call({
|
||||
method: "erpnext.manufacturing.doctype.production_order.production_order.get_item_details",
|
||||
args: {
|
||||
item: frm.doc.production_item,
|
||||
project: frm.doc.project
|
||||
},
|
||||
callback: function(r) {
|
||||
if(r.message) {
|
||||
erpnext.in_production_item_onchange = true;
|
||||
$.each(["description", "stock_uom", "project", "bom_no"], function(i, field) {
|
||||
frm.set_value(field, r.message[field]);
|
||||
});
|
||||
|
||||
if(r.message["set_scrap_wh_mandatory"]){
|
||||
frm.toggle_reqd("scrap_warehouse", true);
|
||||
if(r.message["set_scrap_wh_mandatory"]){
|
||||
frm.toggle_reqd("scrap_warehouse", true);
|
||||
}
|
||||
erpnext.in_production_item_onchange = false;
|
||||
}
|
||||
erpnext.in_production_item_onchange = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
project: function(frm) {
|
||||
@@ -210,7 +212,9 @@ frappe.ui.form.on("Production Order", {
|
||||
frappe.ui.form.on("Production Order Item", {
|
||||
source_warehouse: function(frm, cdt, cdn) {
|
||||
var row = locals[cdt][cdn];
|
||||
if(row.source_warehouse) {
|
||||
if(!row.item_code) {
|
||||
frappe.throw(__("Please set the Item Code first"));
|
||||
} else if(row.source_warehouse) {
|
||||
frappe.call({
|
||||
"method": "erpnext.stock.utils.get_latest_stock_qty",
|
||||
args: {
|
||||
@@ -263,7 +267,7 @@ erpnext.production_order = {
|
||||
erpnext.production_order.stop_production_order(frm, "Resumed");
|
||||
}, __("Status"));
|
||||
}
|
||||
|
||||
|
||||
if(!frm.doc.skip_transfer){
|
||||
if ((flt(doc.material_transferred_for_manufacturing) < flt(doc.qty))
|
||||
&& frm.doc.status != 'Stopped') {
|
||||
@@ -272,7 +276,7 @@ erpnext.production_order = {
|
||||
erpnext.production_order.make_se(frm, 'Material Transfer for Manufacture');
|
||||
});
|
||||
start_btn.addClass('btn-primary');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!frm.doc.skip_transfer){
|
||||
@@ -291,8 +295,9 @@ erpnext.production_order = {
|
||||
} else {
|
||||
if ((flt(doc.produced_qty) < flt(doc.qty)) && frm.doc.status != 'Stopped') {
|
||||
frm.has_finish_btn = true;
|
||||
var finish_btn = frm.add_custom_button(__('Finish'),
|
||||
cur_frm.cscript['Update Finished Goods']);
|
||||
var finish_btn = frm.add_custom_button(__('Finish'), function() {
|
||||
erpnext.production_order.make_se(frm, 'Manufacture');
|
||||
});
|
||||
finish_btn.addClass('btn-primary');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1358,7 +1358,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-06-13 14:29:00.457874",
|
||||
"modified": "2017-07-10 14:29:00.457874",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Manufacturing",
|
||||
"name": "Production Order",
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-05-15 17:37:20.212361",
|
||||
"modified": "2017-07-10 17:37:20.212361",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Manufacturing",
|
||||
"name": "Production Order Item",
|
||||
|
||||
@@ -413,4 +413,7 @@ execute:frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
|
||||
erpnext.patches.v8_1.removed_roles_from_gst_report_non_indian_account
|
||||
erpnext.patches.v8_1.gst_fixes #2017-07-06
|
||||
erpnext.patches.v8_0.update_production_orders
|
||||
erpnext.patches.v8_1.remove_sales_invoice_from_returned_serial_no
|
||||
erpnext.patches.v8_1.remove_sales_invoice_from_returned_serial_no
|
||||
erpnext.patches.v8_1.allow_invoice_copy_to_edit_after_submit
|
||||
erpnext.patches.v8_1.add_hsn_sac_codes
|
||||
erpnext.patches.v8_1.update_gst_state
|
||||
@@ -51,7 +51,7 @@ def check_is_warehouse_associated_with_company():
|
||||
def make_warehouse_nestedset(company=None):
|
||||
validate_parent_account_for_warehouse(company)
|
||||
stock_account_group = get_stock_account_group(company.name)
|
||||
enable_perpetual_inventory = cint(erpnext.is_perpetual_inventory_enabled(company)) or 0
|
||||
enable_perpetual_inventory = cint(erpnext.is_perpetual_inventory_enabled(company.name)) or 0
|
||||
if not stock_account_group and enable_perpetual_inventory:
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# Copyright (c) 2017, Frappe and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
def execute():
|
||||
# new field address_html is created in place of address field for the company's address in PR #8754 (without patch)
|
||||
# so here is the patch for moving the address details in the address doc
|
||||
company_list = []
|
||||
if 'address' in frappe.db.get_table_columns('Company'):
|
||||
company_list = frappe.db.sql('''select name, address from `tabCompany`
|
||||
where address is not null and address != ""''', as_dict=1)
|
||||
|
||||
for company in company_list:
|
||||
add_list = company.address.split(" ")
|
||||
if ',' in company.address:
|
||||
add_list = company.address.rpartition(',')
|
||||
elif ' ' in company.address:
|
||||
add_list = company.address.rpartition(' ')
|
||||
else:
|
||||
add_list = [company.address, None, company.address]
|
||||
|
||||
doc = frappe.get_doc({
|
||||
"doctype":"Address",
|
||||
"address_line1": add_list[0],
|
||||
"city": add_list[2],
|
||||
"links": [{
|
||||
"link_doctype": "Company",
|
||||
"link_name": company.name
|
||||
}]
|
||||
})
|
||||
doc.save()
|
||||
@@ -9,8 +9,8 @@ from frappe.model.mapper import get_mapped_doc
|
||||
|
||||
def execute():
|
||||
# for converting student batch into student group
|
||||
for doctype in ["Student Group", "Student Group Student", "Student Group Instructor", "Student Attendance"]:
|
||||
frappe.reload_doc("schools", "doctype", doctype)
|
||||
for doctype in ["Student Group", "Student Group Student", "Student Group Instructor", "Student Attendance", "Student"]:
|
||||
frappe.reload_doc("schools", "doctype", frappe.scrub(doctype))
|
||||
|
||||
if frappe.db.table_exists("Student Batch"):
|
||||
student_batches = frappe.db.sql('''select name as student_group_name, student_batch_name as batch,
|
||||
|
||||
10
erpnext/patches/v8_1/add_hsn_sac_codes.py
Normal file
10
erpnext/patches/v8_1/add_hsn_sac_codes.py
Normal file
@@ -0,0 +1,10 @@
|
||||
import frappe
|
||||
from erpnext.regional.india.setup import setup
|
||||
|
||||
def execute():
|
||||
company = frappe.get_all('Company', filters = {'country': 'India'})
|
||||
if not company:
|
||||
return
|
||||
|
||||
# call setup for india
|
||||
setup(patch=True)
|
||||
@@ -0,0 +1,12 @@
|
||||
import frappe
|
||||
|
||||
def execute():
|
||||
inv_copy_options = "ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nDUPLICATE FOR SUPPLIER\nTRIPLICATE FOR SUPPLIER"
|
||||
|
||||
frappe.db.sql("""update `tabCustom Field` set allow_on_submit=1, options=%s
|
||||
where fieldname='invoice_copy' and dt = 'Sales Invoice'
|
||||
""", inv_copy_options)
|
||||
|
||||
frappe.db.sql("""update `tabCustom Field` set read_only=1
|
||||
where fieldname='gst_state_number' and dt = 'Address'
|
||||
""")
|
||||
@@ -44,7 +44,7 @@ def add_custom_fields():
|
||||
],
|
||||
'Sales Invoice': [
|
||||
dict(fieldname='invoice_copy', label='Invoice Copy',
|
||||
fieldtype='Select', insert_after='project', print_hide=1,
|
||||
fieldtype='Select', insert_after='project', print_hide=1, allow_on_submit=1,
|
||||
options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nTRIPLICATE FOR SUPPLIER'),
|
||||
],
|
||||
'Sales Order Item': [hsn_sac_field],
|
||||
|
||||
@@ -5,6 +5,7 @@ def execute():
|
||||
frappe.reload_doc('regional', 'doctype', 'gst_settings')
|
||||
frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
|
||||
frappe.reload_doc('stock', 'doctype', 'item')
|
||||
frappe.reload_doc("stock", "doctype", "customs_tariff_number")
|
||||
|
||||
for report_name in ('GST Sales Register', 'GST Purchase Register',
|
||||
'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
|
||||
|
||||
13
erpnext/patches/v8_1/update_gst_state.py
Normal file
13
erpnext/patches/v8_1/update_gst_state.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import frappe
|
||||
from erpnext.regional.india import states
|
||||
|
||||
def execute():
|
||||
company = frappe.get_all('Company', filters = {'country': 'India'})
|
||||
if not company:
|
||||
return
|
||||
|
||||
if not frappe.db.get_value("Custom Field", filters={'fieldname':'gst_state'}):
|
||||
return
|
||||
|
||||
frappe.db.sql("update `tabCustom Field` set options=%s where fieldname='gst_state'", '\n'.join(states))
|
||||
frappe.db.sql("update `tabAddress` set gst_state='Chhattisgarh' where gst_state='Chattisgarh'")
|
||||
@@ -89,7 +89,11 @@ frappe.ui.form.on('Salary Structure', {
|
||||
}
|
||||
})
|
||||
|
||||
var get_payment_mode_account = function(frm, mode_of_payment, callback){
|
||||
var get_payment_mode_account = function(frm, mode_of_payment, callback) {
|
||||
if(!frm.doc.company) {
|
||||
frappe.throw(__("Please select the Company first"));
|
||||
}
|
||||
|
||||
return frappe.call({
|
||||
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
|
||||
args: {
|
||||
|
||||
@@ -675,7 +675,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
|
||||
item_tax[item_code][tax.name] = [tax_rate, tax_amount];
|
||||
} else {
|
||||
item_tax[item_code][tax.name] = [flt(tax_data, tax_rate_precision) + "%", ""];
|
||||
item_tax[item_code][tax.name] = [flt(tax_data, tax_rate_precision) + "%", "0.00"];
|
||||
}
|
||||
});
|
||||
tax_accounts.push([tax.name, tax.account_head]);
|
||||
@@ -689,31 +689,38 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
return '<th style="min-width: 80px;" class="text-right">' + (head || "") + "</th>";
|
||||
}
|
||||
}
|
||||
).join("\n");
|
||||
).join("");
|
||||
|
||||
var distinct_item_names = [];
|
||||
var distinct_items = [];
|
||||
var taxable_amount = {};
|
||||
$.each(this.frm.doc["items"] || [], function(i, item) {
|
||||
if(distinct_item_names.indexOf(item.item_code || item.item_name)===-1) {
|
||||
distinct_item_names.push(item.item_code || item.item_name);
|
||||
var item_code = item.item_code || item.item_name;
|
||||
if(distinct_item_names.indexOf(item_code)===-1) {
|
||||
distinct_item_names.push(item_code);
|
||||
distinct_items.push(item);
|
||||
taxable_amount[item_code] = item.net_amount;
|
||||
} else {
|
||||
taxable_amount[item_code] = taxable_amount[item_code] + item.net_amount;
|
||||
}
|
||||
});
|
||||
|
||||
var rows = $.map(distinct_items, function(item) {
|
||||
var item_tax_record = item_tax[item.item_code || item.item_name];
|
||||
var item_code = item.item_code || item.item_name;
|
||||
var item_tax_record = item_tax[item_code];
|
||||
if(!item_tax_record) { return null; }
|
||||
|
||||
return repl("<tr><td>%(item_name)s</td><td class='text-right'>%(taxable_amount)s</td>%(taxes)s</tr>", {
|
||||
item_name: item.item_name,
|
||||
taxable_amount: format_currency(item.net_amount,
|
||||
taxable_amount: format_currency(taxable_amount[item_code],
|
||||
company_currency, precision("net_amount", item)),
|
||||
taxes: $.map(tax_accounts, function(head) {
|
||||
return item_tax_record[head[0]] ?
|
||||
"<td class='text-right'>(" + item_tax_record[head[0]][0] + ") " + item_tax_record[head[0]][1] + "</td>" :
|
||||
"<td></td>";
|
||||
}).join("\n")
|
||||
}).join("")
|
||||
});
|
||||
}).join("\n");
|
||||
}).join("");
|
||||
|
||||
if(!rows) return "";
|
||||
return '<div class="tax-break-up" style="overflow-x: auto;">\
|
||||
|
||||
@@ -63,37 +63,32 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
});
|
||||
|
||||
frappe.ui.form.on(this.frm.doctype, "additional_discount_percentage", function(frm) {
|
||||
if (frm.via_discount_amount) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!frm.doc.apply_discount_on) {
|
||||
frappe.msgprint(__("Please set 'Apply Additional Discount On'"));
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
frm.via_discount_percentage = true;
|
||||
|
||||
if(frm.doc.additional_discount_percentage && frm.doc.discount_amount) {
|
||||
// Reset discount amount and net / grand total
|
||||
frm.set_value("discount_amount", 0);
|
||||
frm.doc.discount_amount = 0;
|
||||
frm.cscript.calculate_taxes_and_totals();
|
||||
}
|
||||
|
||||
var total = flt(frm.doc[frappe.model.scrub(frm.doc.apply_discount_on)]);
|
||||
var discount_amount = flt(total*flt(frm.doc.additional_discount_percentage) / 100,
|
||||
precision("discount_amount"));
|
||||
|
||||
frm.set_value("discount_amount", discount_amount);
|
||||
delete frm.via_discount_percentage;
|
||||
frm.set_value("discount_amount", discount_amount)
|
||||
.then(() => delete frm.via_discount_percentage);
|
||||
});
|
||||
|
||||
frappe.ui.form.on(this.frm.doctype, "discount_amount", function(frm) {
|
||||
frm.cscript.set_dynamic_labels();
|
||||
|
||||
if (!frm.via_discount_percentage) {
|
||||
frm.via_discount_amount = true;
|
||||
frm.set_value("additional_discount_percentage", 0);
|
||||
delete frm.via_discount_amount;
|
||||
frm.doc.additional_discount_percentage = 0;
|
||||
}
|
||||
|
||||
frm.cscript.calculate_taxes_and_totals();
|
||||
@@ -343,7 +338,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
this.frm.trigger("item_code", cdt, cdn);
|
||||
}
|
||||
else {
|
||||
var sr_no = [];
|
||||
var valid_serial_nos = [];
|
||||
|
||||
// Replacing all occurences of comma with carriage return
|
||||
var serial_nos = item.serial_no.trim().replace(/,/g, '\n');
|
||||
@@ -352,21 +347,19 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
|
||||
// Trim each string and push unique string to new list
|
||||
for (var x=0; x<=serial_nos.length - 1; x++) {
|
||||
if (serial_nos[x].trim() != "" && sr_no.indexOf(serial_nos[x].trim()) == -1) {
|
||||
sr_no.push(serial_nos[x].trim());
|
||||
if (serial_nos[x].trim() != "" && valid_serial_nos.indexOf(serial_nos[x].trim()) == -1) {
|
||||
valid_serial_nos.push(serial_nos[x].trim());
|
||||
}
|
||||
}
|
||||
|
||||
// Add the new list to the serial no. field in grid with each in new line
|
||||
item.serial_no = "";
|
||||
for (var x=0; x<=sr_no.length - 1; x++)
|
||||
item.serial_no += sr_no[x] + '\n';
|
||||
item.serial_no = valid_serial_nos.join('\n');
|
||||
|
||||
refresh_field("serial_no", item.name, item.parentfield);
|
||||
if(!doc.is_return) {
|
||||
frappe.model.set_value(item.doctype, item.name,
|
||||
"qty", sr_no.length / item.conversion_factor);
|
||||
frappe.model.set_value(item.doctype, item.name, "stock_qty", sr_no.length);
|
||||
"qty", valid_serial_nos.length / item.conversion_factor);
|
||||
frappe.model.set_value(item.doctype, item.name, "stock_qty", valid_serial_nos.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -866,6 +859,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
"pricing_rule": d.pricing_rule,
|
||||
"warehouse": d.warehouse,
|
||||
"serial_no": d.serial_no,
|
||||
"discount_percentage": d.discount_percentage || 0.0,
|
||||
"conversion_factor": d.conversion_factor || 1.0
|
||||
});
|
||||
|
||||
|
||||
@@ -68,13 +68,13 @@ var erpnext_slides = [
|
||||
slide.get_input("company_name").on("change", function () {
|
||||
var parts = slide.get_input("company_name").val().split(" ");
|
||||
var abbr = $.map(parts, function (p) { return p ? p.substr(0, 1) : null }).join("");
|
||||
slide.get_field("company_abbr").set_input(abbr.slice(0, 5).toUpperCase());
|
||||
slide.get_field("company_abbr").set_value(abbr.slice(0, 5).toUpperCase());
|
||||
}).val(frappe.boot.sysdefaults.company_name || "").trigger("change");
|
||||
|
||||
slide.get_input("company_abbr").on("change", function () {
|
||||
if (slide.get_input("company_abbr").val().length > 5) {
|
||||
frappe.msgprint("Company Abbreviation cannot have more than 5 characters");
|
||||
slide.get_field("company_abbr").set_input("");
|
||||
slide.get_field("company_abbr").set_value("");
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -189,6 +189,32 @@ var erpnext_slides = [
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
// Users
|
||||
name: 'users',
|
||||
domains: ["all"],
|
||||
title: __("Add Users"),
|
||||
help: __("Add users to your organization, other than yourself"),
|
||||
add_more: 1,
|
||||
max_count: 3,
|
||||
fields: [
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"user_fullname",
|
||||
label:__("Full Name"), static: 1},
|
||||
{fieldtype:"Data", fieldname:"user_email", label:__("Email ID"),
|
||||
placeholder:__("user@example.com"), options: "Email", static: 1},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype: "Check", fieldname: "user_sales",
|
||||
label:__("Sales"), "default": 1, static: 1,
|
||||
hidden: frappe.setup.domain==='Education' ? 1 : 0},
|
||||
{fieldtype: "Check", fieldname: "user_purchaser",
|
||||
label:__("Purchaser"), "default": 1, static: 1,
|
||||
hidden: frappe.setup.domain==='Education' ? 1 : 0},
|
||||
{fieldtype: "Check", fieldname: "user_accountant",
|
||||
label:__("Accountant"), "default": 1, static: 1,
|
||||
hidden: frappe.setup.domain==='Education' ? 1 : 0},
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
// Taxes
|
||||
@@ -198,7 +224,8 @@ var erpnext_slides = [
|
||||
title: __("Add Taxes"),
|
||||
help: __("List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."),
|
||||
add_more: 1,
|
||||
max_count: 4,
|
||||
max_count: 3,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"tax", label:__("Tax"),
|
||||
@@ -216,7 +243,8 @@ var erpnext_slides = [
|
||||
title: __("Add Customers"),
|
||||
help: __("List a few of your customers. They could be organizations or individuals."),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"customer", label:__("Customer"),
|
||||
@@ -235,7 +263,8 @@ var erpnext_slides = [
|
||||
title: __("Your Suppliers"),
|
||||
help: __("List a few of your suppliers. They could be organizations or individuals."),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"supplier", label:__("Supplier"),
|
||||
@@ -254,7 +283,8 @@ var erpnext_slides = [
|
||||
title: __("Your Products or Services"),
|
||||
help: __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"item", label:__("Item"),
|
||||
@@ -262,16 +292,16 @@ var erpnext_slides = [
|
||||
{fieldtype:"Select", label:__("Group"), fieldname:"item_group",
|
||||
options:[__("Products"), __("Services"),
|
||||
__("Raw Material"), __("Consumable"), __("Sub Assemblies")],
|
||||
"default": __("Products")},
|
||||
"default": __("Products"), static: 1},
|
||||
{fieldtype:"Select", fieldname:"item_uom", label:__("UOM"),
|
||||
options:[__("Unit"), __("Nos"), __("Box"), __("Pair"), __("Kg"), __("Set"),
|
||||
__("Hour"), __("Minute"), __("Litre"), __("Meter"), __("Gram")],
|
||||
"default": __("Unit")},
|
||||
{fieldtype: "Check", fieldname: "is_sales_item", label:__("We sell this Item"), default: 1},
|
||||
{fieldtype: "Check", fieldname: "is_purchase_item", label:__("We buy this Item")},
|
||||
"default": __("Unit"), static: 1},
|
||||
{fieldtype: "Check", fieldname: "is_sales_item", label:__("We sell this Item"), default: 1, static: 1},
|
||||
{fieldtype: "Check", fieldname: "is_purchase_item", label:__("We buy this Item"), static: 1},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Currency", fieldname:"item_price", label:__("Rate")},
|
||||
{fieldtype:"Attach Image", fieldname:"item_img", label:__("Attach Image"), is_private: 0},
|
||||
{fieldtype:"Currency", fieldname:"item_price", label:__("Rate"), static: 1},
|
||||
{fieldtype:"Attach Image", fieldname:"item_img", label:__("Attach Image"), is_private: 0, static: 1},
|
||||
],
|
||||
get_item_count: function() {
|
||||
return this.item_count;
|
||||
@@ -285,7 +315,8 @@ var erpnext_slides = [
|
||||
title: __("Program"),
|
||||
help: __("Example: Masters in Computer Science"),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"program", label:__("Program"), placeholder: __("Program Name")},
|
||||
@@ -299,7 +330,8 @@ var erpnext_slides = [
|
||||
title: __("Course"),
|
||||
help: __("Example: Basic Mathematics"),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"course", label:__("Course"), placeholder: __("Course Name")},
|
||||
@@ -313,7 +345,8 @@ var erpnext_slides = [
|
||||
title: __("Instructor"),
|
||||
help: __("People who teach at your organisation"),
|
||||
add_more: 1,
|
||||
max_count: 6,
|
||||
max_count: 5,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"instructor", label:__("Instructor"), placeholder: __("Instructor Name")},
|
||||
@@ -327,20 +360,21 @@ var erpnext_slides = [
|
||||
title: __("Room"),
|
||||
help: __("Classrooms/ Laboratories etc where lectures can be scheduled."),
|
||||
add_more: 1,
|
||||
max_count: 4,
|
||||
max_count: 3,
|
||||
mandatory_entry: 1,
|
||||
fields: [
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"room", label:__("Room")},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Int", fieldname:"room_capacity", label:__("Room") + " Capacity"},
|
||||
{fieldtype:"Int", fieldname:"room_capacity", label:__("Room") + " Capacity", static: 1},
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
// last slide: Bootstrap
|
||||
// last slide: Sample Data
|
||||
name: 'bootstrap',
|
||||
domains: ["all"],
|
||||
title: __("Bootstrap"),
|
||||
title: __("Sample Data"),
|
||||
fields: [{fieldtype: "Section Break"},
|
||||
{fieldtype: "Check", fieldname: "add_sample_data",
|
||||
label: __("Add a few sample records"), "default": 1},
|
||||
|
||||
@@ -50,6 +50,14 @@ erpnext.SerialNoBatchSelector = Class.extend({
|
||||
batches.grid.refresh();
|
||||
batches.grid.add_new_row(null, null, null);
|
||||
}
|
||||
},
|
||||
get_query: function() {
|
||||
return {
|
||||
filters: {
|
||||
is_group: 0,
|
||||
company: me.frm.doc.company
|
||||
}
|
||||
};
|
||||
}
|
||||
},
|
||||
{fieldtype:'Column Break'},
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
states = [
|
||||
'',
|
||||
'Andaman and Nicobar Islands',
|
||||
'Andhra Pradesh',
|
||||
'Arunachal Pradesh',
|
||||
'Assam',
|
||||
'Bihar',
|
||||
'Chandigarh',
|
||||
'Chattisgarh',
|
||||
'Chhattisgarh',
|
||||
'Dadra and Nagar Haveli',
|
||||
'Daman and Diu',
|
||||
'Delhi',
|
||||
@@ -25,6 +26,7 @@ states = [
|
||||
'Mizoram',
|
||||
'Nagaland',
|
||||
'Odisha',
|
||||
'Other Territory',
|
||||
'Pondicherry',
|
||||
'Punjab',
|
||||
'Rajasthan',
|
||||
@@ -38,12 +40,13 @@ states = [
|
||||
]
|
||||
|
||||
state_numbers = {
|
||||
"Andaman and Nicobar Islands": "35",
|
||||
"Andhra Pradesh": "37",
|
||||
"Arunachal Pradesh": "12",
|
||||
"Assam": "18",
|
||||
"Bihar": "10",
|
||||
"Chandigarh": "04",
|
||||
"Chattisgarh": "22",
|
||||
"Chhattisgarh": "22",
|
||||
"Dadra and Nagar Haveli": "26",
|
||||
"Daman and Diu": "25",
|
||||
"Delhi": "07",
|
||||
@@ -63,6 +66,7 @@ state_numbers = {
|
||||
"Mizoram": "15",
|
||||
"Nagaland": "13",
|
||||
"Odisha": "21",
|
||||
"Other Territory": "98",
|
||||
"Pondicherry": "34",
|
||||
"Punjab": "03",
|
||||
"Rajasthan": "08",
|
||||
@@ -70,7 +74,7 @@ state_numbers = {
|
||||
"Tamil Nadu": "33",
|
||||
"Telangana": "36",
|
||||
"Tripura": "16",
|
||||
"Uttar Pradesh": "35",
|
||||
"Uttarakhand": "36",
|
||||
"West Bengal": "37"
|
||||
"Uttar Pradesh": "09",
|
||||
"Uttarakhand": "05",
|
||||
"West Bengal": "19",
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
"state_name": "Uttarakhand"
|
||||
},
|
||||
{
|
||||
"state_number": "37",
|
||||
"state_number": "19",
|
||||
"state_code": "WB",
|
||||
"state_name": "West Bengal"
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2398
erpnext/regional/india/sac_code_data.json
Normal file
2398
erpnext/regional/india/sac_code_data.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -12,10 +12,10 @@ def setup(company=None, patch=True):
|
||||
make_custom_fields()
|
||||
add_permissions()
|
||||
add_custom_roles_for_reports()
|
||||
add_hsn_codes()
|
||||
update_address_template()
|
||||
add_hsn_sac_codes()
|
||||
add_print_formats()
|
||||
if not patch:
|
||||
update_address_template()
|
||||
make_fixtures()
|
||||
|
||||
def update_address_template():
|
||||
@@ -33,21 +33,26 @@ def update_address_template():
|
||||
template=html
|
||||
)).insert()
|
||||
|
||||
def add_hsn_codes():
|
||||
if frappe.db.count('GST HSN Code') > 100:
|
||||
return
|
||||
|
||||
def add_hsn_sac_codes():
|
||||
# HSN codes
|
||||
with open(os.path.join(os.path.dirname(__file__), 'hsn_code_data.json'), 'r') as f:
|
||||
hsn_codes = json.loads(f.read())
|
||||
|
||||
frappe.db.commit()
|
||||
frappe.db.sql('truncate `tabGST HSN Code`')
|
||||
|
||||
for d in hsn_codes:
|
||||
hsn_code = frappe.new_doc('GST HSN Code')
|
||||
hsn_code.update(d)
|
||||
hsn_code.name = hsn_code.hsn_code
|
||||
hsn_code.db_insert()
|
||||
create_hsn_codes(hsn_codes, code_field="hsn_code")
|
||||
|
||||
# SAC Codes
|
||||
with open(os.path.join(os.path.dirname(__file__), 'sac_code_data.json'), 'r') as f:
|
||||
sac_codes = json.loads(f.read())
|
||||
create_hsn_codes(sac_codes, code_field="sac_code")
|
||||
|
||||
def create_hsn_codes(data, code_field):
|
||||
for d in data:
|
||||
if not frappe.db.exists("GST HSN Code", d[code_field]):
|
||||
hsn_code = frappe.new_doc('GST HSN Code')
|
||||
hsn_code.description = d["description"]
|
||||
hsn_code.hsn_code = d[code_field]
|
||||
hsn_code.name = d[code_field]
|
||||
hsn_code.db_insert()
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
@@ -84,7 +89,7 @@ def make_custom_fields():
|
||||
dict(fieldname='gst_state', label='GST State', fieldtype='Select',
|
||||
options='\n'.join(states), insert_after='gstin'),
|
||||
dict(fieldname='gst_state_number', label='GST State Number',
|
||||
fieldtype='Int', insert_after='gst_state'),
|
||||
fieldtype='Int', insert_after='gst_state', read_only=1),
|
||||
],
|
||||
'Purchase Invoice': [
|
||||
dict(fieldname='supplier_gstin', label='Supplier GSTIN',
|
||||
@@ -102,8 +107,8 @@ def make_custom_fields():
|
||||
fieldtype='Data', insert_after='company_address',
|
||||
options='company_address.gstin', print_hide=1),
|
||||
dict(fieldname='invoice_copy', label='Invoice Copy',
|
||||
fieldtype='Select', insert_after='project', print_hide=1,
|
||||
options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nTRIPLICATE FOR SUPPLIER')
|
||||
fieldtype='Select', insert_after='project', print_hide=1, allow_on_submit=1,
|
||||
options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nDUPLICATE FOR SUPPLIER\nTRIPLICATE FOR SUPPLIER')
|
||||
],
|
||||
'Item': [
|
||||
dict(fieldname='gst_hsn_code', label='HSN/SAC',
|
||||
@@ -119,7 +124,13 @@ def make_custom_fields():
|
||||
|
||||
for doctype, fields in custom_fields.items():
|
||||
for df in fields:
|
||||
create_custom_field(doctype, df)
|
||||
field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": df["fieldname"]})
|
||||
if not field:
|
||||
create_custom_field(doctype, df)
|
||||
else:
|
||||
custom_field = frappe.get_doc("Custom Field", field)
|
||||
custom_field.update(df)
|
||||
custom_field.save()
|
||||
|
||||
def make_fixtures():
|
||||
docs = [
|
||||
|
||||
@@ -19,6 +19,6 @@ def validate_gstin_for_india(doc, method):
|
||||
|
||||
if doc.gst_state:
|
||||
doc.gst_state_number = state_numbers[doc.gst_state]
|
||||
if doc.gst_state_number != doc.gstin[:2]:
|
||||
if doc.gstin != "NA" and doc.gst_state_number != doc.gstin[:2]:
|
||||
frappe.throw(_("First 2 digits of GSTIN should match with State number {0}")
|
||||
.format(doc.gst_state_number))
|
||||
.format(doc.gst_state_number))
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
"docstatus": 0,
|
||||
"doctype": "Print Format",
|
||||
"font": "Default",
|
||||
"format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"<div class=\\\"print-heading\\\">\\n\\t<h2>\\n\\t\\tSALES INVOICE<br>\\n\\t\\t<small>{{ doc.name }}</small>\\n\\t</h2>\\n</div>\\n<h2 class=\\\"text-center\\\">\\n\\t{% if doc.invoice_copy -%}\\n\\t\\t<small>{{ doc.invoice_copy }}</small>\\n\\t{% endif -%}\\n</h2>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"company_address_display\", \"label\": \"Company Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"posting_date\", \"label\": \"Date\"}, {\"print_hide\": 0, \"fieldname\": \"due_date\", \"label\": \"Payment Due Date\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"options\": \"<hr>\", \"fieldname\": \"_custom_html\", \"fieldtype\": \"HTML\", \"label\": \"Custom HTML\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"customer_name\", \"label\": \"Customer Name\"}, {\"print_hide\": 0, \"fieldname\": \"address_display\", \"label\": \"Address\"}, {\"print_hide\": 0, \"fieldname\": \"contact_display\", \"label\": \"Contact\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"shipping_address\", \"label\": \"Shipping Address\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"item_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"200px\"}, {\"print_hide\": 0, \"fieldname\": \"gst_hsn_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"qty\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"uom\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"rate\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"items\", \"label\": \"Items\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"total\", \"label\": \"Total\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"300px\"}], \"print_hide\": 0, \"fieldname\": \"taxes\", \"label\": \"Sales Taxes and Charges\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"grand_total\", \"label\": \"Grand Total\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"in_words\", \"label\": \"In Words\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"other_charges_calculation\", \"align\": \"left\", \"label\": \"Item-wise Tax Breakup\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Terms\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"terms\", \"label\": \"Terms and Conditions Details\"}]",
|
||||
"format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"<div class=\\\"print-heading\\\">\\n\\t<h2>\\n\\t\\tTAX INVOICE<br>\\n\\t\\t<small>{{ doc.name }}</small>\\n\\t</h2>\\n</div>\\n<h2 class=\\\"text-center\\\">\\n\\t{% if doc.invoice_copy -%}\\n\\t\\t<small>{{ doc.invoice_copy }}</small>\\n\\t{% endif -%}\\n</h2>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"company_address_display\", \"label\": \"Company Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"posting_date\", \"label\": \"Date\"}, {\"print_hide\": 0, \"fieldname\": \"due_date\", \"label\": \"Payment Due Date\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"options\": \"<hr>\", \"fieldname\": \"_custom_html\", \"fieldtype\": \"HTML\", \"label\": \"Custom HTML\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"customer_name\", \"label\": \"Customer Name\"}, {\"print_hide\": 0, \"fieldname\": \"address_display\", \"label\": \"Address\"}, {\"print_hide\": 0, \"fieldname\": \"contact_display\", \"label\": \"Contact\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"shipping_address\", \"label\": \"Shipping Address\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"item_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"200px\"}, {\"print_hide\": 0, \"fieldname\": \"gst_hsn_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"qty\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"uom\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"rate\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"items\", \"label\": \"Items\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"total\", \"label\": \"Total\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"300px\"}], \"print_hide\": 0, \"fieldname\": \"taxes\", \"label\": \"Sales Taxes and Charges\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"grand_total\", \"label\": \"Grand Total\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"in_words\", \"label\": \"In Words\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"other_charges_calculation\", \"align\": \"left\", \"label\": \"Tax Breakup\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Terms\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"terms\", \"label\": \"Terms and Conditions Details\"}]",
|
||||
"idx": 0,
|
||||
"line_breaks": 0,
|
||||
"modified": "2017-07-06 17:47:38.279783",
|
||||
"modified": "2017-07-07 13:06:20.042807",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Regional",
|
||||
"name": "GST Tax Invoice",
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cur_frm.add_fetch("student_group", "course", "course");
|
||||
cur_frm.add_fetch("examiner", "instructor_name", "examiner_name");
|
||||
cur_frm.add_fetch("supervisor", "instructor_name", "supervisor_name");
|
||||
cur_frm.add_fetch("course", "default_grading_scale", "grading_scale");
|
||||
|
||||
frappe.ui.form.on("Assessment Plan", {
|
||||
onload: function(frm) {
|
||||
|
||||
@@ -143,9 +143,10 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "Today",
|
||||
"fieldname": "enrollment_date",
|
||||
"fieldtype": "Date",
|
||||
"default": "0",
|
||||
"description": "Check this if the Student is residing at the Institute's Hostel.",
|
||||
"fieldname": "boarding_student",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
@@ -153,9 +154,10 @@
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Enrollment Date",
|
||||
"label": "Boarding Student",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
@@ -163,7 +165,7 @@
|
||||
"read_only": 0,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -321,6 +323,37 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "Today",
|
||||
"fieldname": "enrollment_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Enrollment Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
@@ -370,7 +403,7 @@
|
||||
"label": "Mode of Transportation",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "\nSchool Bus\nPublic Transport\nSelf-Driving Vehicle\nPick/Drop by Guardian",
|
||||
"options": "\nWalking\nSchool Bus\nPublic Transport\nSelf-Driving Vehicle\nPick/Drop by Guardian",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
@@ -638,7 +671,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2017-06-30 08:21:49.430996",
|
||||
"modified": "2017-07-10 18:16:15.810616",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Schools",
|
||||
"name": "Program Enrollment",
|
||||
|
||||
@@ -589,67 +589,6 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "section_break_18",
|
||||
"fieldtype": "Section Break",
|
||||
"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": "Guardian Details",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "guardians",
|
||||
"fieldtype": "Table",
|
||||
"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": "Guardians",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Student Guardian",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
@@ -859,6 +798,67 @@
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "section_break_18",
|
||||
"fieldtype": "Section Break",
|
||||
"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": "Guardian Details",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "guardians",
|
||||
"fieldtype": "Table",
|
||||
"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": "Guardians",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Student Guardian",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
@@ -1114,7 +1114,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2017-06-30 08:21:50.423784",
|
||||
"modified": "2017-07-07 16:30:08.930882",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Schools",
|
||||
"name": "Student",
|
||||
|
||||
@@ -7,10 +7,24 @@ def get_data():
|
||||
'fieldname': 'student',
|
||||
'transactions': [
|
||||
{
|
||||
'items': ['Student Log', 'Student Group', 'Program Enrollment']
|
||||
'label': _('Admission'),
|
||||
'items': ['Program Enrollment']
|
||||
},
|
||||
{
|
||||
'items': ['Fees', 'Assessment Result', 'Student Attendance', 'Student Leave Application']
|
||||
'label': _('Student Activity'),
|
||||
'items': ['Student Log', 'Student Group', ]
|
||||
},
|
||||
{
|
||||
'label': _('Assessment'),
|
||||
'items': ['Assessment Result']
|
||||
},
|
||||
{
|
||||
'label': _('Attendance'),
|
||||
'items': ['Student Attendance', 'Student Leave Application']
|
||||
},
|
||||
{
|
||||
'label': _('Fee'),
|
||||
'items': ['Fees']
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -135,22 +135,24 @@ schools.StudentsEditor = Class.extend({
|
||||
frappe.confirm(__("Do you want to update attendance?<br>Present: {0}\
|
||||
<br>Absent: {1}", [students_present.length, students_absent.length]),
|
||||
function() { //ifyes
|
||||
frappe.call({
|
||||
method: "erpnext.schools.api.mark_attendance",
|
||||
freeze: true,
|
||||
freeze_message: "Marking attendance",
|
||||
args: {
|
||||
"students_present": students_present,
|
||||
"students_absent": students_absent,
|
||||
"student_group": frm.doc.student_group,
|
||||
"course_schedule": frm.doc.course_schedule,
|
||||
"date": frm.doc.date
|
||||
},
|
||||
callback: function(r) {
|
||||
$(me.wrapper.find(".btn-mark-att")).attr("disabled", false);
|
||||
frm.trigger("student_group");
|
||||
}
|
||||
});
|
||||
if(!frappe.request.ajax_count) {
|
||||
frappe.call({
|
||||
method: "erpnext.schools.api.mark_attendance",
|
||||
freeze: true,
|
||||
freeze_message: "Marking attendance",
|
||||
args: {
|
||||
"students_present": students_present,
|
||||
"students_absent": students_absent,
|
||||
"student_group": frm.doc.student_group,
|
||||
"course_schedule": frm.doc.course_schedule,
|
||||
"date": frm.doc.date
|
||||
},
|
||||
callback: function(r) {
|
||||
$(me.wrapper.find(".btn-mark-att")).attr("disabled", false);
|
||||
frm.trigger("student_group");
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
function() { //ifno
|
||||
$(me.wrapper.find(".btn-mark-att")).attr("disabled", false);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"allow_copy": 0,
|
||||
"allow_guest_to_view": 0,
|
||||
"allow_import": 0,
|
||||
"allow_rename": 0,
|
||||
"autoname": "SLog.####",
|
||||
@@ -13,6 +14,7 @@
|
||||
"engine": "InnoDB",
|
||||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -43,64 +45,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "type",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Type",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "General\nAcademic\nMedical\nAchievement",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break",
|
||||
"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,
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -131,6 +76,38 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "type",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Type",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "General\nAcademic\nMedical\nAchievement",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -160,6 +137,160 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break",
|
||||
"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,
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "academic_year",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Academic Year",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Academic Year",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "academic_term",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Academic Term",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Academic Term",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "program",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Program",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Program",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "student_batch",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Student Batch",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Student Batch Name",
|
||||
"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
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -188,6 +319,7 @@
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@@ -217,17 +349,17 @@
|
||||
"unique": 0
|
||||
}
|
||||
],
|
||||
"has_web_view": 0,
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"idx": 0,
|
||||
"image_view": 0,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"is_submittable": 0,
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-02-17 17:18:19.596892",
|
||||
"modified": "2017-07-06 12:42:05.777673",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Schools",
|
||||
"name": "Student Log",
|
||||
|
||||
@@ -4,9 +4,14 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import flt
|
||||
from collections import defaultdict
|
||||
from erpnext.schools.api import get_grade
|
||||
|
||||
|
||||
def execute(filters=None):
|
||||
data = []
|
||||
|
||||
args = frappe._dict()
|
||||
args["assessment_group"] = filters.get("assessment_group")
|
||||
if args["assessment_group"] == "All Assessment Groups":
|
||||
@@ -14,65 +19,112 @@ def execute(filters=None):
|
||||
|
||||
args["course"] = filters.get("course")
|
||||
args["student_group"] = filters.get("student_group")
|
||||
if args["student_group"]:
|
||||
cond = "and ap.student_group=%(student_group)s"
|
||||
else:
|
||||
cond = ''
|
||||
|
||||
# find all assessment plan linked with the filters provided
|
||||
assessment_plan = frappe.db.sql('''
|
||||
select
|
||||
ap.name, ap.student_group, apc.assessment_criteria, apc.maximum_score as max_score
|
||||
from
|
||||
`tabAssessment Plan` ap, `tabAssessment Plan Criteria` apc
|
||||
where
|
||||
ap.assessment_group=%(assessment_group)s and ap.course=%(course)s and
|
||||
ap.name=apc.parent and ap.docstatus=1 {0}
|
||||
order by
|
||||
apc.assessment_criteria'''.format(cond), (args), as_dict=1)
|
||||
|
||||
assessment_plan_list = set([d["name"] for d in assessment_plan])
|
||||
if not assessment_plan_list:
|
||||
frappe.throw(_("No assessment plan linked with this assessment group"))
|
||||
|
||||
student_group_list = set([d["student_group"] for d in assessment_plan])
|
||||
assessment_result = frappe.db.sql('''select ar.student, ard.assessment_criteria, ard.grade, ard.score
|
||||
from `tabAssessment Result` ar, `tabAssessment Result Detail` ard
|
||||
where ar.assessment_plan in (%s) and ar.name=ard.parent and ar.docstatus=1
|
||||
order by ard.assessment_criteria''' %', '.join(['%s']*len(assessment_plan_list)),
|
||||
tuple(assessment_plan_list), as_dict=1)
|
||||
|
||||
result_dict = defaultdict(dict)
|
||||
kounter = defaultdict(dict)
|
||||
for result in assessment_result:
|
||||
result_dict[result.student].update({frappe.scrub(result.assessment_criteria): result.grade,
|
||||
frappe.scrub(result.assessment_criteria)+"_score": result.score})
|
||||
if result.grade in kounter[result.assessment_criteria]:
|
||||
kounter[result.assessment_criteria][result.grade] += 1
|
||||
# find all assessment plan and related details linked with the given filters
|
||||
def get_assessment_details():
|
||||
if args["student_group"]:
|
||||
cond = "and ap.student_group=%(student_group)s"
|
||||
else:
|
||||
kounter[result.assessment_criteria].update({result.grade: 1})
|
||||
cond = ''
|
||||
|
||||
student_list = frappe.db.sql('''select sgs.student, sgs.student_name
|
||||
from `tabStudent Group` sg, `tabStudent Group Student` sgs
|
||||
where sg.name = sgs.parent and sg.name in (%s)
|
||||
order by sgs.group_roll_number asc''' %', '.join(['%s']*len(student_group_list)),
|
||||
tuple(student_group_list), as_dict=1)
|
||||
assessment_plan = frappe.db.sql('''
|
||||
select
|
||||
ap.name, ap.student_group, ap.grading_scale, apc.assessment_criteria, apc.maximum_score as max_score
|
||||
from
|
||||
`tabAssessment Plan` ap, `tabAssessment Plan Criteria` apc
|
||||
where
|
||||
ap.assessment_group=%(assessment_group)s and ap.course=%(course)s and
|
||||
ap.name=apc.parent and ap.docstatus=1 {0}
|
||||
order by
|
||||
apc.assessment_criteria'''.format(cond), (args), as_dict=1)
|
||||
|
||||
for student in student_list:
|
||||
student.update(result_dict[student.student])
|
||||
data = student_list
|
||||
assessment_plan_list = list(set([d["name"] for d in assessment_plan]))
|
||||
if not assessment_plan_list:
|
||||
frappe.throw(_("No assessment plan linked with this assessment group"))
|
||||
|
||||
columns = get_column(list(set([(d["assessment_criteria"],d["max_score"]) for d in assessment_plan])))
|
||||
assessment_criteria_list = list(set([(d["assessment_criteria"],d["max_score"]) for d in assessment_plan]))
|
||||
student_group_list = list(set([d["student_group"] for d in assessment_plan]))
|
||||
total_maximum_score = flt(sum([flt(d[1]) for d in assessment_criteria_list]))
|
||||
grading_scale = assessment_plan[0]["grading_scale"]
|
||||
|
||||
grading_scale = frappe.db.get_value("Assessment Plan", list(assessment_plan_list)[0], "grading_scale")
|
||||
grades = frappe.db.sql_list('''select grade_code from `tabGrading Scale Interval` where parent=%s''',
|
||||
(grading_scale))
|
||||
assessment_criteria_list = list(set([d["assessment_criteria"] for d in assessment_plan]))
|
||||
chart = get_chart_data(grades, assessment_criteria_list, kounter)
|
||||
return assessment_plan_list, assessment_criteria_list, total_maximum_score, grading_scale, student_group_list
|
||||
|
||||
|
||||
# get all the result and make a dict map student as the key and value as dict of result
|
||||
def get_result_map():
|
||||
result_dict = defaultdict(dict)
|
||||
kounter = defaultdict(dict)
|
||||
assessment_result = frappe.db.sql('''select ar.student, ard.assessment_criteria, ard.grade, ard.score
|
||||
from `tabAssessment Result` ar, `tabAssessment Result Detail` ard
|
||||
where ar.assessment_plan in (%s) and ar.name=ard.parent and ar.docstatus=1
|
||||
order by ard.assessment_criteria''' %', '.join(['%s']*len(assessment_plan_list)),
|
||||
tuple(assessment_plan_list), as_dict=1, debug=True)
|
||||
|
||||
for result in assessment_result:
|
||||
if "total_score" in result_dict[result.student]:
|
||||
total_score = result_dict[result.student]["total_score"] + result.score
|
||||
else:
|
||||
total_score = result.score
|
||||
total = get_grade(grading_scale, (total_score/total_maximum_score)*100)
|
||||
|
||||
if result.grade in kounter[result.assessment_criteria]:
|
||||
kounter[result.assessment_criteria][result.grade] += 1
|
||||
else:
|
||||
kounter[result.assessment_criteria].update({result.grade: 1})
|
||||
|
||||
if "Total" not in kounter:
|
||||
kounter["Total"] = {}
|
||||
|
||||
if "total" in result_dict[result.student]:
|
||||
prev_grade = result_dict[result.student]["total"]
|
||||
prev_grade_count = kounter["Total"].get(prev_grade) - 1
|
||||
kounter["Total"].update({prev_grade: prev_grade_count})
|
||||
latest_grade_count = kounter["Total"].get(total)+1 if kounter["Total"].get(total) else 1
|
||||
kounter["Total"].update({total: latest_grade_count})
|
||||
|
||||
result_dict[result.student].update({
|
||||
frappe.scrub(result.assessment_criteria): result.grade,
|
||||
frappe.scrub(result.assessment_criteria)+"_score": result.score,
|
||||
"total_score": total_score,
|
||||
"total": total
|
||||
})
|
||||
|
||||
return result_dict, kounter
|
||||
|
||||
# make data from the result dict
|
||||
def get_data():
|
||||
student_list = frappe.db.sql('''select sgs.student, sgs.student_name
|
||||
from `tabStudent Group` sg, `tabStudent Group Student` sgs
|
||||
where sg.name = sgs.parent and sg.name in (%s)
|
||||
order by sgs.group_roll_number asc''' %', '.join(['%s']*len(student_group_list)),
|
||||
tuple(student_group_list), as_dict=1)
|
||||
|
||||
for student in student_list:
|
||||
student.update(result_dict[student.student])
|
||||
return student_list
|
||||
|
||||
|
||||
# get chart data
|
||||
def get_chart():
|
||||
grading_scale = frappe.db.get_value("Assessment Plan", list(assessment_plan_list)[0], "grading_scale")
|
||||
grades = frappe.db.sql_list('''select grade_code from `tabGrading Scale Interval` where parent=%s''',
|
||||
(grading_scale))
|
||||
criteria_list = [d[0] for d in assessment_criteria_list] + ["Total"]
|
||||
return get_chart_data(grades, criteria_list, kounter)
|
||||
|
||||
|
||||
assessment_plan_list, assessment_criteria_list, total_maximum_score, grading_scale,\
|
||||
student_group_list = get_assessment_details()
|
||||
result_dict, kounter = get_result_map()
|
||||
data = get_data()
|
||||
|
||||
columns = get_column(assessment_criteria_list, total_maximum_score)
|
||||
chart = get_chart()
|
||||
|
||||
return columns, data, None, chart
|
||||
|
||||
def get_column(assessment_criteria):
|
||||
def get_column(assessment_criteria, total_maximum_score):
|
||||
columns = [{
|
||||
"fieldname": "student",
|
||||
"label": _("Student ID"),
|
||||
@@ -99,6 +151,20 @@ def get_column(assessment_criteria):
|
||||
"fieldtype": "Float",
|
||||
"width": 100
|
||||
})
|
||||
|
||||
columns += [{
|
||||
"fieldname": "total",
|
||||
"label": "Total",
|
||||
"fieldtype": "Data",
|
||||
"width": 100
|
||||
},
|
||||
{
|
||||
"fieldname": "total_score",
|
||||
"label": "Total Score("+ str(int(total_maximum_score)) + ")",
|
||||
"fieldtype": "Float",
|
||||
"width": 110
|
||||
}]
|
||||
|
||||
return columns
|
||||
|
||||
def get_chart_data(grades, assessment_criteria_list, kounter):
|
||||
|
||||
@@ -9,7 +9,7 @@ import frappe.defaults
|
||||
from frappe.utils import flt, cint, cstr
|
||||
from frappe.desk.reportview import build_match_conditions
|
||||
from erpnext.utilities.transaction_base import TransactionBase
|
||||
from erpnext.accounts.party import validate_party_accounts, get_dashboard_info # keep this
|
||||
from erpnext.accounts.party import validate_party_accounts, get_dashboard_info, get_timeline_data # keep this
|
||||
from frappe.contacts.address_and_contact import load_address_and_contact, delete_contact_and_address
|
||||
|
||||
class Customer(TransactionBase):
|
||||
|
||||
@@ -30,12 +30,8 @@ erpnext.selling.InstallationNote = frappe.ui.form.Controller.extend({
|
||||
setup_queries: function() {
|
||||
var me = this;
|
||||
|
||||
this.frm.set_query("customer_address", function() {
|
||||
return {
|
||||
filters: {'customer': me.frm.doc.customer }
|
||||
}
|
||||
});
|
||||
|
||||
frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
|
||||
frm.set_query('customer_address', erpnext.queries.address_query);
|
||||
this.frm.set_query('contact_person', erpnext.queries.contact_query);
|
||||
|
||||
this.frm.set_query("customer", function() {
|
||||
|
||||
@@ -86,6 +86,17 @@ class Quotation(SellingController):
|
||||
print_lst.append(lst1)
|
||||
return print_lst
|
||||
|
||||
def get_list_context(context=None):
|
||||
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||
list_context = get_list_context(context)
|
||||
list_context.update({
|
||||
'show_sidebar': True,
|
||||
'show_search': True,
|
||||
'no_breadcrumbs': True,
|
||||
'title': _('Quotes'),
|
||||
})
|
||||
|
||||
return list_context
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_sales_order(source_name, target_doc=None):
|
||||
|
||||
@@ -7,11 +7,12 @@ import json
|
||||
import frappe.utils
|
||||
from frappe.utils import cstr, flt, getdate, comma_and, cint
|
||||
from frappe import _
|
||||
from frappe.model.utils import get_fetch_values
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from erpnext.stock.stock_balance import update_bin_qty, get_reserved_qty
|
||||
from frappe.desk.notifications import clear_doctype_notifications
|
||||
from erpnext.controllers.recurring_document import month_map, get_next_date
|
||||
|
||||
from frappe.contacts.doctype.address.address import get_company_address
|
||||
from erpnext.controllers.selling_controller import SellingController
|
||||
|
||||
form_grid_templates = {
|
||||
@@ -504,6 +505,11 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
|
||||
target.run_method("set_missing_values")
|
||||
target.run_method("calculate_taxes_and_totals")
|
||||
|
||||
# set company address
|
||||
target.update(get_company_address(target.company))
|
||||
if target.company_address:
|
||||
target.update(get_fetch_values("Sales Invoice", 'company_address', target.company_address))
|
||||
|
||||
def update_item(source, target, source_parent):
|
||||
target.amount = flt(source.amount) - flt(source.billed_amt)
|
||||
target.base_amount = target.amount * flt(source_parent.conversion_rate)
|
||||
|
||||
@@ -69,7 +69,7 @@ class ItemGroup(NestedSet, WebsiteGenerator):
|
||||
context.update({
|
||||
"items": get_product_list_for_group(product_group = self.name, start=start,
|
||||
limit=context.page_length + 1, search=frappe.form_dict.get("search")),
|
||||
"parent_groups": get_parent_item_groups(self.name),
|
||||
"parents": get_parent_item_groups(self.parent_item_group),
|
||||
"title": self.name,
|
||||
"products_as_list": cint(frappe.db.get_single_value('Website Settings', 'products_as_list'))
|
||||
})
|
||||
@@ -136,7 +136,8 @@ def get_group_item_count(item_group):
|
||||
|
||||
def get_parent_item_groups(item_group_name):
|
||||
item_group = frappe.get_doc("Item Group", item_group_name)
|
||||
return frappe.db.sql("""select name, route from `tabItem Group`
|
||||
return [{"name": frappe._("Home"), "route":"/"}]+\
|
||||
frappe.db.sql("""select name, route from `tabItem Group`
|
||||
where lft <= %s and rgt >= %s
|
||||
and show_in_website=1
|
||||
order by lft asc""", (item_group.lft, item_group.rgt), as_dict=True)
|
||||
@@ -146,6 +147,6 @@ def invalidate_cache_for(doc, item_group=None):
|
||||
item_group = doc.name
|
||||
|
||||
for d in get_parent_item_groups(item_group):
|
||||
d = frappe.get_doc("Item Group", d.name)
|
||||
if d.route:
|
||||
clear_cache(d.route)
|
||||
item_group_name = frappe.db.get_value("Item Group", d.get('name'))
|
||||
if item_group_name:
|
||||
clear_cache(frappe.db.get_value('Item Group', item_group_name, 'route'))
|
||||
|
||||
@@ -351,7 +351,7 @@ def create_items(args):
|
||||
for i in xrange(1,6):
|
||||
item = args.get("item_" + str(i))
|
||||
if item:
|
||||
item_group = args.get("item_group_" + str(i))
|
||||
item_group = _(args.get("item_group_" + str(i)))
|
||||
is_sales_item = args.get("is_sales_item_" + str(i))
|
||||
is_purchase_item = args.get("is_purchase_item_" + str(i))
|
||||
is_stock_item = item_group!=_("Services")
|
||||
@@ -373,7 +373,7 @@ def create_items(args):
|
||||
"is_purchase_item": is_purchase_item,
|
||||
"is_stock_item": is_stock_item and 1 or 0,
|
||||
"item_group": item_group,
|
||||
"stock_uom": args.get("item_uom_" + str(i)),
|
||||
"stock_uom": _(args.get("item_uom_" + str(i))),
|
||||
"default_warehouse": default_warehouse
|
||||
}).insert()
|
||||
|
||||
|
||||
@@ -8,10 +8,12 @@ from frappe.utils import flt, cint
|
||||
|
||||
from frappe import msgprint, _
|
||||
import frappe.defaults
|
||||
from frappe.model.utils import get_fetch_values
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from erpnext.controllers.selling_controller import SellingController
|
||||
from frappe.desk.notifications import clear_doctype_notifications
|
||||
from erpnext.stock.doctype.batch.batch import set_batch_nos
|
||||
from frappe.contacts.doctype.address.address import get_company_address
|
||||
|
||||
form_grid_templates = {
|
||||
"items": "templates/form_grid/item_grid.html"
|
||||
@@ -371,7 +373,7 @@ def get_invoiced_qty_map(delivery_note):
|
||||
def make_sales_invoice(source_name, target_doc=None):
|
||||
invoiced_qty_map = get_invoiced_qty_map(source_name)
|
||||
|
||||
def update_accounts(source, target):
|
||||
def set_missing_values(source, target):
|
||||
target.is_pos = 0
|
||||
target.ignore_pricing_rule = 1
|
||||
target.run_method("set_missing_values")
|
||||
@@ -381,6 +383,11 @@ def make_sales_invoice(source_name, target_doc=None):
|
||||
|
||||
target.run_method("calculate_taxes_and_totals")
|
||||
|
||||
# set company address
|
||||
target.update(get_company_address(target.company))
|
||||
if target.company_address:
|
||||
target.update(get_fetch_values("Sales Invoice", 'company_address', target.company_address))
|
||||
|
||||
def update_item(source_doc, target_doc, source_parent):
|
||||
target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0)
|
||||
|
||||
@@ -415,7 +422,7 @@ def make_sales_invoice(source_name, target_doc=None):
|
||||
},
|
||||
"add_if_empty": True
|
||||
}
|
||||
}, target_doc, update_accounts)
|
||||
}, target_doc, set_missing_values)
|
||||
|
||||
return doc
|
||||
|
||||
|
||||
@@ -146,10 +146,6 @@ class Item(WebsiteGenerator):
|
||||
return cstr(frappe.db.get_value('Item Group', self.item_group,
|
||||
'route')) + '/' + self.scrub(self.item_name + '-' + random_string(5))
|
||||
|
||||
def get_parents(self, context):
|
||||
item_group, route = frappe.db.get_value('Item Group', self.item_group, ['name', 'route'])
|
||||
context.parents = [{'name': route, 'label': item_group}]
|
||||
|
||||
def validate_website_image(self):
|
||||
"""Validate if the website image is a public file"""
|
||||
auto_set_website_image = False
|
||||
@@ -242,15 +238,12 @@ class Item(WebsiteGenerator):
|
||||
context.show_search=True
|
||||
context.search_link = '/product_search'
|
||||
|
||||
context.parent_groups = get_parent_item_groups(self.item_group) + \
|
||||
[{"name": self.name}]
|
||||
context.parents = get_parent_item_groups(self.item_group)
|
||||
|
||||
self.set_variant_context(context)
|
||||
self.set_attribute_context(context)
|
||||
self.set_disabled_attributes(context)
|
||||
|
||||
self.get_parents(context)
|
||||
|
||||
return context
|
||||
|
||||
def set_variant_context(self, context):
|
||||
|
||||
@@ -1597,7 +1597,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": ":Company",
|
||||
"depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)",
|
||||
"depends_on": "eval:cint(erpnext.is_perpetual_inventory_enabled(parent.company))",
|
||||
"fieldname": "cost_center",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@@ -2044,7 +2044,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-06-16 17:23:01.404744",
|
||||
"modified": "2017-07-10 06:31:31.457497",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Purchase Receipt Item",
|
||||
|
||||
@@ -85,6 +85,10 @@ class SerialNo(StockController):
|
||||
self.supplier, self.supplier_name = \
|
||||
frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no,
|
||||
["supplier", "supplier_name"])
|
||||
|
||||
# If sales return entry
|
||||
if self.purchase_document_type == 'Delivery Note':
|
||||
self.sales_invoice = None
|
||||
else:
|
||||
for fieldname in ("purchase_document_type", "purchase_document_no",
|
||||
"purchase_date", "purchase_time", "purchase_rate", "supplier", "supplier_name"):
|
||||
|
||||
@@ -340,10 +340,15 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
||||
production_order: function() {
|
||||
var me = this;
|
||||
this.toggle_enable_bom();
|
||||
if(!me.frm.doc.production_order) {
|
||||
return;
|
||||
}
|
||||
|
||||
return frappe.call({
|
||||
method: "erpnext.stock.doctype.stock_entry.stock_entry.get_production_order_details",
|
||||
args: {production_order: me.frm.doc.production_order},
|
||||
args: {
|
||||
production_order: me.frm.doc.production_order
|
||||
},
|
||||
callback: function(r) {
|
||||
if (!r.exc) {
|
||||
$.each(["from_bom", "bom_no", "fg_completed_qty", "use_multi_level_bom"], function(i, field) {
|
||||
|
||||
@@ -960,7 +960,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:cint(frappe.sys_defaults.auto_accounting_for_stock)",
|
||||
"depends_on": "eval:cint(erpnext.is_perpetual_inventory_enabled(parent.company))",
|
||||
"fieldname": "expense_account",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@@ -1020,7 +1020,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": ":Company",
|
||||
"depends_on": "eval:cint(frappe.sys_defaults.auto_accounting_for_stock)",
|
||||
"depends_on": "eval:cint(erpnext.is_perpetual_inventory_enabled(parent.company))",
|
||||
"fieldname": "cost_center",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@@ -1266,7 +1266,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2017-06-16 17:32:56.989049",
|
||||
"modified": "2017-07-10 06:29:22.805345",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Stock Entry Detail",
|
||||
|
||||
@@ -90,7 +90,9 @@ def auto_close_tickets():
|
||||
for issue in issues:
|
||||
doc = frappe.get_doc("Issue", issue.get("name"))
|
||||
doc.status = "Closed"
|
||||
doc.save(ignore_permissions=True)
|
||||
doc.flags.ignore_permissions = True
|
||||
doc.flags.ignore_mandatory = True
|
||||
doc.save()
|
||||
|
||||
@frappe.whitelist()
|
||||
def set_multiple_status(names, status):
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
{{ render_discount_amount(doc) }}
|
||||
{%- endif -%}
|
||||
{%- for charge in data -%}
|
||||
{%- if not charge.included_in_print_rate -%}
|
||||
{%- if charge.tax_amount and not charge.included_in_print_rate -%}
|
||||
<div class="row">
|
||||
<div class="col-xs-5 {%- if not doc._align_labels_left %} text-right{%- endif -%}">
|
||||
<label>{{ charge.get_formatted("description") }}</label></div>
|
||||
|
||||
@@ -1,48 +1,216 @@
|
||||
$.extend(frappe.test_data, {
|
||||
'Customer': {
|
||||
'Test Customer 1': [
|
||||
{customer_name: 'Test Customer 1'}
|
||||
"Customer": {
|
||||
"Test Customer 1": [
|
||||
{customer_name: "Test Customer 1"}
|
||||
],
|
||||
'Test Customer 2': [
|
||||
{customer_name: 'Test Customer 2'}
|
||||
"Test Customer 2": [
|
||||
{customer_name: "Test Customer 2"}
|
||||
],
|
||||
'Test Customer 3': [
|
||||
{customer_name: 'Test Customer 3'}
|
||||
"Test Customer 3": [
|
||||
{customer_name: "Test Customer 3"}
|
||||
],
|
||||
},
|
||||
'Item': {
|
||||
'Test Product 1': [
|
||||
{item_code: 'Test Product 1'},
|
||||
{item_group: 'Products'},
|
||||
"Item": {
|
||||
"Test Product 1": [
|
||||
{item_code: "Test Product 1"},
|
||||
{item_group: "Products"},
|
||||
{is_stock_item: 1},
|
||||
{standard_rate: 100},
|
||||
{opening_stock: 100},
|
||||
],
|
||||
'Test Product 2': [
|
||||
{item_code: 'Test Product 2'},
|
||||
{item_group: 'Products'},
|
||||
"Test Product 2": [
|
||||
{item_code: "Test Product 2"},
|
||||
{item_group: "Products"},
|
||||
{is_stock_item: 1},
|
||||
{standard_rate: 150},
|
||||
{opening_stock: 200},
|
||||
],
|
||||
'Test Product 3': [
|
||||
{item_code: 'Test Product 3'},
|
||||
{item_group: 'Products'},
|
||||
"Test Product 3": [
|
||||
{item_code: "Test Product 3"},
|
||||
{item_group: "Products"},
|
||||
{is_stock_item: 1},
|
||||
{standard_rate: 250},
|
||||
{opening_stock: 100},
|
||||
],
|
||||
'Test Service 1': [
|
||||
{item_code: 'Test Service 1'},
|
||||
{item_group: 'Services'},
|
||||
"Test Service 1": [
|
||||
{item_code: "Test Service 1"},
|
||||
{item_group: "Services"},
|
||||
{is_stock_item: 0},
|
||||
{standard_rate: 200}
|
||||
],
|
||||
'Test Service 2': [
|
||||
{item_code: 'Test Service 2'},
|
||||
{item_group: 'Services'},
|
||||
"Test Service 2": [
|
||||
{item_code: "Test Service 2"},
|
||||
{item_group: "Services"},
|
||||
{is_stock_item: 0},
|
||||
{standard_rate: 300}
|
||||
]
|
||||
},
|
||||
"Lead": {
|
||||
"LEAD-00001": [
|
||||
{lead_name: "Test Lead 1"}
|
||||
],
|
||||
"LEAD-00002": [
|
||||
{lead_name: "Test Lead 2"}
|
||||
],
|
||||
"LEAD-00003": [
|
||||
{lead_name: "Test Lead 3"}
|
||||
]
|
||||
},
|
||||
"Address": {
|
||||
"Test1-Billing": [
|
||||
{address_title:"Test1"},
|
||||
{address_type: "Billing"},
|
||||
{address_line1: "Billing Street 1"},
|
||||
{city: "Billing City 1"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 1"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Test1-Shipping": [
|
||||
{address_title:"Test1"},
|
||||
{address_type: "Shipping"},
|
||||
{address_line1: "Shipping Street 1"},
|
||||
{city: "Shipping City 1"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 1"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Test1-Warehouse": [
|
||||
{address_title:"Test1"},
|
||||
{address_type: "Warehouse"},
|
||||
{address_line1: "Warehouse Street 1"},
|
||||
{city: "Warehouse City 1"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 1"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Test2-Billing": [
|
||||
{address_title:"Test2"},
|
||||
{address_type: "Billing"},
|
||||
{address_line1: "Billing Street 2"},
|
||||
{city: "Billing City 2"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 2"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Test2-Shipping": [
|
||||
{address_title:"Test2"},
|
||||
{address_type: "Shipping"},
|
||||
{address_line1: "Shipping Street 2"},
|
||||
{city: "Shipping City 2"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 2"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Test2-Warehouse": [
|
||||
{address_title:"Test2"},
|
||||
{address_type: "Warehouse"},
|
||||
{address_line1: "Warehouse Street 2"},
|
||||
{city: "Warehouse City 2"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 2"}
|
||||
]
|
||||
]}
|
||||
]
|
||||
},
|
||||
"Contact": {
|
||||
"Contact 1-Test Customer 1": [
|
||||
{first_name: "Contact 1"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 1"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Contact 2-Test Customer 1": [
|
||||
{first_name: "Contact 2"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 1"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Contact 1-Test Customer 2": [
|
||||
{first_name: "Contact 1"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 2"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
"Contact 2-Test Customer 2": [
|
||||
{first_name: "Contact 2"},
|
||||
{links: [
|
||||
[
|
||||
{link_doctype: "Customer"},
|
||||
{link_name: "Test Customer 2"}
|
||||
]
|
||||
]}
|
||||
],
|
||||
},
|
||||
"Price List": {
|
||||
"Test-Buying-USD": [
|
||||
{price_list_name: "Test-Buying-USD"},
|
||||
{currency: "USD"},
|
||||
{buying: "1"}
|
||||
],
|
||||
"Test-Buying-EUR": [
|
||||
{price_list_name: "Test-Buying-EUR"},
|
||||
{currency: "EUR"},
|
||||
{buying: "1"}
|
||||
],
|
||||
"Test-Selling-USD": [
|
||||
{price_list_name: "Test-Selling-USD"},
|
||||
{currency: "USD"},
|
||||
{selling: "1"}
|
||||
],
|
||||
"Test-Selling-EUR": [
|
||||
{price_list_name: "Test-Selling-EUR"},
|
||||
{currency: "EUR"},
|
||||
{selling: "1"}
|
||||
],
|
||||
},
|
||||
"Terms and Conditions": {
|
||||
"Test Term 1": [
|
||||
{title: "Test Term 1"}
|
||||
],
|
||||
"Test Term 2": [
|
||||
{title: "Test Term 2"}
|
||||
]
|
||||
},
|
||||
"Sales Taxes and Charges Template": {
|
||||
"TEST In State GST": [
|
||||
{title: "TEST In State GST"},
|
||||
{taxes:[
|
||||
[
|
||||
{charge_type:"On Net Total"},
|
||||
{account_head:"CGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
|
||||
],
|
||||
[
|
||||
{charge_type:"On Net Total"},
|
||||
{account_head:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
|
||||
]
|
||||
]}
|
||||
]
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,29 +1,120 @@
|
||||
QUnit.module('sales');
|
||||
QUnit.module("sales");
|
||||
|
||||
QUnit.test("test quotation", function(assert) {
|
||||
assert.expect(2);
|
||||
QUnit.test("test: lead", function (assert) {
|
||||
assert.expect(1);
|
||||
let done = assert.async();
|
||||
let random = frappe.utils.get_random(10);
|
||||
frappe.run_serially([
|
||||
() => frappe.tests.setup_doctype("Lead"),
|
||||
() => frappe.set_route("List", "Lead"),
|
||||
() => frappe.new_doc("Lead"),
|
||||
() => cur_frm.set_value("lead_name", random),
|
||||
() => cur_frm.save(),
|
||||
() => {
|
||||
assert.ok(cur_frm.doc.lead_name.includes(random));
|
||||
return done();
|
||||
}
|
||||
]);
|
||||
});
|
||||
|
||||
QUnit.test("test: opportunity", function (assert) {
|
||||
assert.expect(1);
|
||||
let done = assert.async();
|
||||
frappe.run_serially([
|
||||
() => frappe.tests.setup_doctype('Customer'),
|
||||
() => frappe.tests.setup_doctype('Item'),
|
||||
() => {
|
||||
return frappe.tests.make('Quotation', [
|
||||
{customer: 'Test Customer 1'},
|
||||
{items: [
|
||||
[
|
||||
{'item_code': 'Test Product 1'},
|
||||
{'qty': 5}
|
||||
return frappe.tests.make("Opportunity", [{
|
||||
enquiry_from: "Lead"
|
||||
},
|
||||
{
|
||||
lead: "LEAD-00002"
|
||||
}
|
||||
]);
|
||||
},
|
||||
() => {
|
||||
assert.ok(cur_frm.doc.lead === "LEAD-00002");
|
||||
return done();
|
||||
}
|
||||
]);
|
||||
});
|
||||
|
||||
QUnit.test("test: quotation", function (assert) {
|
||||
assert.expect(18);
|
||||
let done = assert.async();
|
||||
frappe.run_serially([
|
||||
() => frappe.tests.setup_doctype("Customer"),
|
||||
() => frappe.tests.setup_doctype("Item"),
|
||||
() => frappe.tests.setup_doctype("Address"),
|
||||
() => frappe.tests.setup_doctype("Contact"),
|
||||
() => frappe.tests.setup_doctype("Price List"),
|
||||
() => frappe.tests.setup_doctype("Terms and Conditions"),
|
||||
() => frappe.tests.setup_doctype("Sales Taxes and Charges Template"),
|
||||
() => {
|
||||
return frappe.tests.make("Quotation", [{
|
||||
customer: "Test Customer 1"
|
||||
},
|
||||
{
|
||||
items: [
|
||||
[{
|
||||
"item_code": "Test Product 1"
|
||||
},
|
||||
{
|
||||
"qty": 5
|
||||
}
|
||||
]
|
||||
]}
|
||||
]
|
||||
}
|
||||
]);
|
||||
},
|
||||
() => {
|
||||
// get_item_details
|
||||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1');
|
||||
assert.ok(cur_frm.doc.items[0].item_name == "Test Product 1", "Added Test Product 1");
|
||||
|
||||
// calculate_taxes_and_totals
|
||||
assert.ok(cur_frm.doc.grand_total==500);
|
||||
assert.ok(cur_frm.doc.grand_total === 500, "Total Amount is correct");
|
||||
},
|
||||
() => cur_frm.set_value("customer_address", "Test1-Billing"),
|
||||
() => cur_frm.set_value("shipping_address_name", "Test1-Warehouse"),
|
||||
() => cur_frm.set_value("contact_person", "Contact 1-Test Customer 1"),
|
||||
() => cur_frm.set_value("currency", "USD"),
|
||||
() => frappe.timeout(0.3),
|
||||
() => cur_frm.set_value("selling_price_list", "Test-Selling-USD"),
|
||||
() => frappe.timeout(0.5),
|
||||
() => cur_frm.doc.items[0].rate = 200,
|
||||
() => frappe.timeout(0.3),
|
||||
() => cur_frm.set_value("tc_name", "Test Term 1"),
|
||||
() => cur_frm.set_value("taxes_and_charges", "TEST In State GST"),
|
||||
() => frappe.timeout(0.3),
|
||||
() => cur_frm.save(),
|
||||
() => {
|
||||
// Check Address and Contact Info
|
||||
assert.ok(cur_frm.doc.address_display.includes("Billing Street 1"), "Address Changed");
|
||||
assert.ok(cur_frm.doc.shipping_address.includes("Warehouse Street 1"), "Address Changed");
|
||||
assert.ok(cur_frm.doc.contact_display == "Contact 1", "Contact info changed");
|
||||
|
||||
// Check Currency
|
||||
assert.ok(cur_frm.doc_currency == "USD", "Currency Changed");
|
||||
assert.ok(cur_frm.doc.selling_price_list == "Test-Selling-USD", "Price List Changed");
|
||||
assert.ok(cur_frm.doc.items[0].rate == 200, "Price Changed Manually");
|
||||
assert.ok(cur_frm.doc.total == 1000, "New Total Calculated");
|
||||
|
||||
// Check Terms and Condtions
|
||||
assert.ok(cur_frm.doc.tc_name == "Test Term 1", "Terms and Conditions Checked");
|
||||
|
||||
// Check Taxes
|
||||
assert.ok(cur_frm.doc.taxes[0].account_head.includes("CGST"));
|
||||
assert.ok(cur_frm.doc.taxes[1].account_head.includes("SGST"));
|
||||
assert.ok(cur_frm.doc.grand_total == 1180, "Tax Amount Added to Total");
|
||||
assert.ok(cur_frm.doc.taxes_and_charges == "TEST In State GST", "Tax Template Selected");
|
||||
},
|
||||
() => frappe.timeout(0.3),
|
||||
() => cur_frm.print_doc(),
|
||||
() => frappe.timeout(1),
|
||||
() => assert.ok($('.btn-print-print').is(':visible'), "Print Format Available"),
|
||||
() => assert.ok(RegExp(/QTN-\d\d\d\d\d/g).test($("#header-html small").text())),
|
||||
() => assert.ok($(".important .text-right.value").text().includes("$ 1,180.00")),
|
||||
() => assert.ok($(".section-break+ .section-break .column-break:nth-child(1) .data-field:nth-child(1) .value").text().includes("Billing Street 1"), "Print Preview Works As Expected"),
|
||||
() => frappe.timeout(0.3),
|
||||
() => cur_frm.print_doc(),
|
||||
() => done()
|
||||
]);
|
||||
});
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@ apps/erpnext/erpnext/config/selling.py +153,Default settings for selling transac
|
||||
DocType: Timesheet,% Amount Billed,% Beløb Billed
|
||||
DocType: Purchase Order,% Billed,% Billed
|
||||
,Lead Id,Bly Id
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +67,'Total','Total'
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +61,'Total','Total'
|
||||
DocType: Selling Settings,Selling Settings,Salg af indstillinger
|
||||
apps/erpnext/erpnext/accounts/report/gross_profit/gross_profit.py +73,Selling Amount,Selling Beløb
|
||||
apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.py +166,Lead must be set if Opportunity is made from Lead,"Bly skal indstilles, hvis Opportunity er lavet af Lead"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,5 @@
|
||||
DocType: Fee Structure,Components,Componentes
|
||||
DocType: Purchase Invoice Item,Item,Producto
|
||||
apps/erpnext/erpnext/hr/doctype/leave_block_list/leave_block_list.py +19,Date is repeated,La fecha está repetida
|
||||
DocType: Payment Entry,Deductions or Loss,Deducciones o Pérdidas
|
||||
DocType: Cheque Print Template,Cheque Size,Tamaño de Cheque
|
||||
apps/erpnext/erpnext/utilities/activation.py +126,Make Student Batch,Hacer lotes de Estudiante
|
||||
|
||||
|
@@ -16,7 +16,6 @@ DocType: Grading Scale Interval,Grade Code,Grado de Código
|
||||
apps/erpnext/erpnext/accounts/party.py +257,Billing currency must be equal to either default comapany's currency or party account currency,La moneda de facturación debe ser igual a la moneda por defecto de la compañía o la moneda de la cuenta de la parte
|
||||
DocType: Fee Structure,Fee Structure,Estructura de Tarifas
|
||||
apps/erpnext/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py +50,Course Schedules created:,Calendario de Cursos creado:
|
||||
DocType: Grading Scale,Grading Scale Intervals,Intervalos de Escala de Calificación
|
||||
DocType: Purchase Order,Get Items from Open Material Requests,Obtener Ítems de Solicitudes Abiertas de Materiales
|
||||
,Batch Item Expiry Status,Estatus de Expiración de Lote de Ítems
|
||||
DocType: Guardian,Guardian Interests,Intereses del Guardián
|
||||
@@ -26,13 +25,11 @@ DocType: BOM Scrap Item,Basic Amount (Company Currency),Monto Base (Divisa de Co
|
||||
DocType: Grading Scale,Grading Scale Name,Nombre de Escala de Calificación
|
||||
apps/erpnext/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +61,Guardian2 Mobile No,Número de Móvil de Guardián 2
|
||||
apps/erpnext/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +59,Guardian2 Name,Nombre de Guardián 2
|
||||
DocType: Grading Scale Interval,Grading Scale Interval,Intervalo de Escala de Calificación
|
||||
DocType: Stock Entry,Customer or Supplier Details,Detalle de cliente o proveedor
|
||||
DocType: Course Scheduling Tool,Course Scheduling Tool,Herramienta de Programación de cursos
|
||||
DocType: Shopping Cart Settings,Checkout Settings,Ajustes de Finalización de Pedido
|
||||
DocType: Guardian Interest,Guardian Interest,Interés del Guardián
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +330,Classrooms/ Laboratories etc where lectures can be scheduled.,"Aulas / laboratorios, etc., donde las lecturas se pueden programar."
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +361,Classrooms/ Laboratories etc where lectures can be scheduled.,"Aulas / laboratorios, etc., donde las lecturas se pueden programar."
|
||||
apps/erpnext/erpnext/templates/includes/cart/cart_dropdown.html +18,Checkout,Finalizando pedido
|
||||
DocType: Sales Invoice,Change Amount,Importe de Cambio
|
||||
DocType: Guardian Student,Guardian Student,Guardián del Estudiante
|
||||
DocType: BOM Operation,Base Hour Rate(Company Currency),Tarifa Base por Hora (Divisa de Compañía)
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
apps/erpnext/erpnext/setup/doctype/sales_person/sales_person.js +13,This is a root sales person and cannot be edited.,Se trata de una persona de las ventas raíz y no se puede editar .
|
||||
apps/erpnext/erpnext/config/setup.py +15,"Set Default Values like Company, Currency, Current Fiscal Year, etc.","Establecer Valores Predeterminados , como Empresa , Moneda, Año Fiscal Actual, etc"
|
||||
DocType: HR Settings,Employee Settings,Configuración del Empleado
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +209,Serial No {0} does not belong to Item {1},Número de orden {0} no pertenece al elemento {1}
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +213,Serial No {0} does not belong to Item {1},Número de orden {0} no pertenece al elemento {1}
|
||||
DocType: Naming Series,User must always select,Usuario elegirá siempre
|
||||
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +185,Employee {0} has already applied for {1} between {2} and {3},Empleado {0} ya se ha aplicado para {1} entre {2} y {3}
|
||||
DocType: Account,Cost of Goods Sold,Costo de las Ventas
|
||||
@@ -12,7 +12,7 @@ DocType: Packing Slip,From Package No.,Del Paquete N º
|
||||
DocType: Purchase Invoice Item,Purchase Order Item,Articulos de la Orden de Compra
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py +94,Raw material cannot be same as main Item,La materia prima no puede ser la misma que el artículo principal
|
||||
apps/erpnext/erpnext/accounts/report/gross_profit/gross_profit.py +72,Avg. Buying Rate,Promedio de Compra
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +295,Serial No {0} created,Número de orden {0} creado
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +299,Serial No {0} created,Número de orden {0} creado
|
||||
DocType: Item,If subcontracted to a vendor,Si es sub-contratado a un vendedor
|
||||
DocType: Production Order Operation,"in Minutes
|
||||
Updated via 'Time Log'",En minutos actualizado a través de 'Bitácora de tiempo'
|
||||
@@ -31,7 +31,7 @@ apps/erpnext/erpnext/setup/setup_wizard/industry_type.py +45,Retail & Wholesale,
|
||||
DocType: Company,Default Holiday List,Listado de vacaciones / feriados predeterminados
|
||||
apps/erpnext/erpnext/config/hr.py +229,Organization unit (department) master.,Unidad de Organización ( departamento) maestro.
|
||||
DocType: Depreciation Schedule,Journal Entry,Asientos Contables
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +368,Completed Qty can not be greater than 'Qty to Manufacture',La cantidad completada no puede ser mayor que la cantidad a producir
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +363,Completed Qty can not be greater than 'Qty to Manufacture',La cantidad completada no puede ser mayor que la cantidad a producir
|
||||
DocType: Leave Block List,Stop users from making Leave Applications on following days.,Deje que los usuarios realicen Solicitudes de Vacaciones en los siguientes días .
|
||||
DocType: Sales Invoice Item,Qty as per Stock UOM,Cantidad de acuerdo a la Unidad de Medida del Inventario
|
||||
DocType: Quality Inspection,Get Specification Details,Obtenga Especificación Detalles
|
||||
@@ -87,7 +87,7 @@ apps/erpnext/erpnext/accounts/report/general_ledger/general_ledger.py +39,"Can n
|
||||
DocType: Naming Series,Help HTML,Ayuda HTML
|
||||
DocType: Production Order Operation,Actual Operation Time,Tiempo de operación actual
|
||||
DocType: Sales Order,To Deliver and Bill,Para Entregar y Bill
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +436,Warehouse required for stock Item {0},Almacén requerido para la acción del artículo {0}
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +437,Warehouse required for stock Item {0},Almacén requerido para la acción del artículo {0}
|
||||
DocType: Territory,Territory Targets,Territorios Objetivos
|
||||
DocType: Warranty Claim,Warranty / AMC Status,Garantía / AMC Estado
|
||||
DocType: Attendance,Employee Name,Nombre del Empleado
|
||||
@@ -112,7 +112,7 @@ DocType: Email Digest,Next email will be sent on:,Siguiente correo electrónico
|
||||
apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.py +65,Case No(s) already in use. Try from Case No {0},Nº de caso ya en uso. Intente Nº de caso {0}
|
||||
apps/erpnext/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.js +27,Target On,Objetivo On
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.js +23,"To not apply Pricing Rule in a particular transaction, all applicable Pricing Rules should be disabled.","Para no aplicar la Regla de Precios en una transacción en particular, todas las Reglas de Precios aplicables deben ser desactivadas."
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +158,"Sorry, Serial Nos cannot be merged","Lo sentimos , Nos de serie no se puede fusionar"
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +162,"Sorry, Serial Nos cannot be merged","Lo sentimos , Nos de serie no se puede fusionar"
|
||||
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +766,Make ,Hacer
|
||||
DocType: Manufacturing Settings,Manufacturing Settings,Ajustes de Manufactura
|
||||
DocType: Appraisal Template,Appraisal Template Title,Titulo de la Plantilla deEvaluación
|
||||
@@ -132,7 +132,7 @@ DocType: Quotation,In Words will be visible once you save the Quotation.,En pala
|
||||
apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py +270,Installation Note {0} has already been submitted,La nota de instalación {0} ya se ha presentado
|
||||
DocType: Employee,The first Leave Approver in the list will be set as the default Leave Approver,El primer Administrador de Vacaciones in la lista sera definido como el Administrador de Vacaciones predeterminado.
|
||||
apps/erpnext/erpnext/config/selling.py +105,Manage Territory Tree.,Vista en árbol para la administración de los territorios
|
||||
apps/erpnext/erpnext/stock/utils.py +177,Serial number {0} entered more than once,Número de serie {0} entraron más de una vez
|
||||
apps/erpnext/erpnext/stock/utils.py +200,Serial number {0} entered more than once,Número de serie {0} entraron más de una vez
|
||||
apps/erpnext/erpnext/selling/doctype/sms_center/sms_center.py +68,Receiver List is empty. Please create Receiver List,"Lista de receptores está vacía. Por favor, cree Lista de receptores"
|
||||
DocType: Purchase Invoice,The unique id for tracking all recurring invoices. It is generated on submit.,El identificador único para el seguimiento de todas las facturas recurrentes. Se genera al enviar .
|
||||
DocType: Target Detail,Target Detail,Objetivo Detalle
|
||||
@@ -158,17 +158,17 @@ DocType: Purchase Invoice Item,Rate (Company Currency),Precio (Moneda Local)
|
||||
apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center.js +56,Convert to Group,Convertir al Grupo
|
||||
DocType: Hub Settings,Seller Name,Nombre del Vendedor
|
||||
apps/erpnext/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py +44,{0} payment entries can not be filtered by {1},{0} registros de pago no se pueden filtrar por {1}
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +228,Serial No {0} not in stock,Número de orden {0} no está en stock
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +232,Serial No {0} not in stock,Número de orden {0} no está en stock
|
||||
apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +94,Ref Date,Fecha Ref
|
||||
apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +34,Bank Statement balance as per General Ledger,Balanza de Estado de Cuenta Bancario según Libro Mayor
|
||||
DocType: Naming Series,Setup Series,Serie de configuración
|
||||
DocType: Production Order Operation,Actual Start Time,Hora de inicio actual
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +451,Barcode {0} already used in Item {1},El código de barras {0} ya se utiliza en el elemento {1}
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +444,Barcode {0} already used in Item {1},El código de barras {0} ya se utiliza en el elemento {1}
|
||||
apps/erpnext/erpnext/setup/setup_wizard/industry_type.py +31,Health Care,Cuidado de la Salud
|
||||
DocType: Item,Manufacturer Part Number,Número de Pieza del Fabricante
|
||||
DocType: Item Reorder,Re-Order Level,Reordenar Nivel
|
||||
DocType: Customer,Sales Team Details,Detalles del equipo de ventas
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +559,Sales Order {0} is not submitted,Órden de Venta {0} no esta presentada
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +560,Sales Order {0} is not submitted,Órden de Venta {0} no esta presentada
|
||||
apps/erpnext/erpnext/utilities/transaction_base.py +110,Row #{0}: Rate must be same as {1}: {2} ({3} / {4}) ,Fila # {0}: Tasa debe ser el mismo que {1}: {2} ({3} / {4})
|
||||
apps/erpnext/erpnext/config/selling.py +18,Confirmed orders from Customers.,Pedidos en firme de los clientes.
|
||||
DocType: Warranty Claim,Service Address,Dirección del Servicio
|
||||
@@ -192,7 +192,7 @@ apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +132,Row {0
|
||||
DocType: Employee,Leave Approvers,Supervisores de Vacaciones
|
||||
apps/erpnext/erpnext/accounts/doctype/payment_entry/payment_entry.js +149,Please specify a valid Row ID for row {0} in table {1},"Por favor, especifique un ID de fila válida para la fila {0} en la tabla {1}"
|
||||
DocType: Customer Group,Parent Customer Group,Categoría de cliente principal
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +31,Total Outstanding Amount,Total Monto Pendiente
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +25,Total Outstanding Amount,Total Monto Pendiente
|
||||
DocType: Sales Partner,Select Monthly Distribution to unevenly distribute targets across months.,Seleccione Distribución Mensual de distribuir de manera desigual a través de objetivos meses.
|
||||
apps/erpnext/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py +90,You need to enable Shopping Cart,Necesita habilitar Carito de Compras
|
||||
apps/erpnext/erpnext/controllers/sales_and_purchase_return.py +20,{0} is mandatory for Return,{0} es obligatorio para su devolución
|
||||
@@ -202,7 +202,7 @@ DocType: Sales Invoice,Shipping Address Name,Dirección de envío Nombre
|
||||
DocType: Item,Moving Average,Promedio Movil
|
||||
,Qty to Deliver,Cantidad para Ofrecer
|
||||
apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py +112,Row #{0}: Please specify Serial No for Item {1},"Fila # {0}: Por favor, especifique No de Serie de artículos {1}"
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +201,"List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later.","Enumere sus obligaciones fiscales (Ejemplo; IVA, aduanas, etc.) deben tener nombres únicos y sus tarifas por defecto. Esto creará una plantilla estándar, que podrá editar más tarde."
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +225,"List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later.","Enumere sus obligaciones fiscales (Ejemplo; IVA, aduanas, etc.) deben tener nombres únicos y sus tarifas por defecto. Esto creará una plantilla estándar, que podrá editar más tarde."
|
||||
apps/erpnext/erpnext/setup/doctype/company/company.js +52,Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.,"Por favor, asegúrese que realmente desea borrar todas las transacciones de esta compañía. Sus datos maestros permanecerán intactos. Esta acción no se puede deshacer."
|
||||
DocType: Shopping Cart Settings,Shopping Cart Settings,Compras Ajustes
|
||||
DocType: BOM,Raw Material Cost,Costo de la Materia Prima
|
||||
@@ -214,7 +214,7 @@ apps/erpnext/erpnext/controllers/stock_controller.py +331,Quality Inspection req
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +94,What does it do?,¿Qué hace?
|
||||
DocType: Task,Actual Time (in Hours),Tiempo actual (En horas)
|
||||
apps/erpnext/erpnext/selling/doctype/quotation/quotation.js +707,Make Sales Order,Hacer Orden de Venta
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +219,List a few of your customers. They could be organizations or individuals.,Enumere algunos de sus clientes. Pueden ser organizaciones o individuos.
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +244,List a few of your customers. They could be organizations or individuals.,Enumere algunos de sus clientes. Pueden ser organizaciones o individuos.
|
||||
DocType: Item Customer Detail,Ref Code,Código Referencia
|
||||
DocType: Item,Default Selling Cost Center,Centros de coste por defecto
|
||||
DocType: Leave Block List,Leave Block List Allowed,Lista de Bloqueo de Vacaciones Permitida
|
||||
@@ -246,12 +246,13 @@ DocType: Item,Website Item Groups,Grupos de Artículos del Sitio Web
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +103,Marketing Expenses,Gastos de Comercialización
|
||||
apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.py +81,"Cannot declare as lost, because Quotation has been made.","No se puede declarar como perdido , porque la cotización ha sido hecha."
|
||||
DocType: Leave Allocation,New Leaves Allocated,Nuevas Vacaciones Asignadas
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +205,user@example.com,user@example.com
|
||||
DocType: Asset Movement,Source Warehouse,fuente de depósito
|
||||
apps/erpnext/erpnext/public/js/templates/contact_list.html +34,No contacts added yet.,No se han añadido contactos todavía
|
||||
apps/erpnext/erpnext/accounts/doctype/account/account.py +159,Root Type is mandatory,Tipo Root es obligatorio
|
||||
DocType: Training Event,Scheduled,Programado
|
||||
DocType: Salary Detail,Depends on Leave Without Pay,Depende de ausencia sin pago
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +74,Total Paid Amt,Total Pagado Amt
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +68,Total Paid Amt,Total Pagado Amt
|
||||
apps/erpnext/erpnext/selling/report/inactive_customers/inactive_customers.py +16,'Days Since Last Order' must be greater than or equal to zero,'Días desde el último pedido' debe ser mayor o igual a cero
|
||||
DocType: Material Request Item,For Warehouse,Por almacén
|
||||
,Purchase Order Items To Be Received,Productos de la Orden de Compra a ser Recibidos
|
||||
@@ -261,7 +262,7 @@ apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +534,Row No
|
||||
DocType: Offer Letter Term,Offer Letter Term,Término de carta de oferta
|
||||
DocType: Item,Synced With Hub,Sincronizado con Hub
|
||||
apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center.py +30,Cost Center with existing transactions can not be converted to ledger,Centro de Costos de las transacciones existentes no se puede convertir en el libro mayor
|
||||
apps/erpnext/erpnext/public/js/controllers/transaction.js +1165,Please enter Item Code to get batch no,"Por favor, ingrese el código del producto para obtener el No. de lote"
|
||||
apps/erpnext/erpnext/public/js/controllers/transaction.js +1086,Please enter Item Code to get batch no,"Por favor, ingrese el código del producto para obtener el No. de lote"
|
||||
apps/erpnext/erpnext/selling/doctype/customer/customer.py +34,Series is mandatory,Serie es obligatorio
|
||||
,Item Shortage Report,Reportar carencia de producto
|
||||
DocType: Sales Invoice,Rate at which Price list currency is converted to customer's base currency,Grado en el que la lista de precios en moneda se convierte en la moneda base del cliente
|
||||
@@ -274,11 +275,11 @@ apps/erpnext/erpnext/stock/doctype/price_list/price_list.py +14,Price List must
|
||||
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +156,Warehouse required at Row No {0},Almacén requerido en la fila n {0}
|
||||
DocType: Purchase Invoice Item,Serial No,Números de Serie
|
||||
,Bank Reconciliation Statement,Extractos Bancarios
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +408,{0} is mandatory for Item {1},{0} es obligatorio para el producto {1}
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +409,{0} is mandatory for Item {1},{0} es obligatorio para el producto {1}
|
||||
apps/erpnext/erpnext/config/hr.py +234,"Employee designation (e.g. CEO, Director etc.).","Cargo del empleado ( por ejemplo, director general, director , etc.)"
|
||||
DocType: Item,Copy From Item Group,Copiar de Grupo de Elementos
|
||||
apps/erpnext/erpnext/stock/get_item_details.py +526,No default BOM exists for Item {0},No existe una Solicitud de Materiales por defecto para el elemento {0}
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +164,{0} ({1}) cannot be greater than planned quanitity ({2}) in Production Order {3},{0} ({1}) no puede ser mayor que cantidad planificada ({2}) en la Orden de Producción {3}
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +163,{0} ({1}) cannot be greater than planned quanitity ({2}) in Production Order {3},{0} ({1}) no puede ser mayor que cantidad planificada ({2}) en la Orden de Producción {3}
|
||||
apps/erpnext/erpnext/buying/doctype/purchase_order/purchase_order.js +847,Select Item for Transfer,Seleccionar elemento de Transferencia
|
||||
apps/erpnext/erpnext/hr/doctype/employee/employee.py +110,Date of Joining must be greater than Date of Birth,Fecha de acceso debe ser mayor que Fecha de Nacimiento
|
||||
DocType: Buying Settings,Settings for Buying Module,Ajustes para la compra de módulo
|
||||
@@ -300,8 +301,8 @@ apps/erpnext/erpnext/hr/doctype/job_applicant/job_applicant.py +25,Name or Email
|
||||
apps/erpnext/erpnext/setup/doctype/company/delete_company_transactions.py +17,Transactions can only be deleted by the creator of the Company,Las transacciones sólo pueden ser borrados por el creador de la Compañía
|
||||
DocType: Cost Center,Parent Cost Center,Centro de Costo Principal
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +26,Loans and Advances (Assets),Préstamos y anticipos (Activos)
|
||||
apps/erpnext/erpnext/hooks.py +87,Shipments,Los envíos
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +273,We buy this Item,Compramos este artículo
|
||||
apps/erpnext/erpnext/hooks.py +94,Shipments,Los envíos
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +301,We buy this Item,Compramos este artículo
|
||||
apps/erpnext/erpnext/controllers/buying_controller.py +149,Please enter 'Is Subcontracted' as Yes or No,"Por favor, introduzca si 'Es Subcontratado' o no"
|
||||
apps/erpnext/erpnext/setup/doctype/company/company.py +51,Abbreviation already used for another company,La Abreviación ya está siendo utilizada para otra compañía
|
||||
DocType: Purchase Order Item Supplied,Purchase Order Item Supplied,Orden de Compra del Artículo Suministrado
|
||||
@@ -334,7 +335,7 @@ apps/erpnext/erpnext/config/hr.py +142,Performance appraisal.,Evaluación del De
|
||||
DocType: Quality Inspection Reading,Quality Inspection Reading,Lectura de Inspección de Calidad
|
||||
DocType: Purchase Invoice Item,Net Amount (Company Currency),Importe neto (moneda de la compañía)
|
||||
DocType: Sales Order,Track this Sales Order against any Project,Seguir este de órdenes de venta en contra de cualquier proyecto
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +41,"Selling must be checked, if Applicable For is selected as {0}","Ventas debe ser seleccionado, si se selecciona Aplicable Para como {0}"
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +40,"Selling must be checked, if Applicable For is selected as {0}","Ventas debe ser seleccionado, si se selecciona Aplicable Para como {0}"
|
||||
DocType: Selling Settings,Maintain Same Rate Throughout Sales Cycle,Mantener misma tasa durante todo el ciclo de ventas
|
||||
DocType: Employee External Work History,Salary,Salario
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +145,Stock Liabilities,Inventario de Pasivos
|
||||
@@ -353,7 +354,7 @@ DocType: Serial No,Warranty Period (Days),Período de garantía ( Días)
|
||||
DocType: Selling Settings,Campaign Naming By,Nombramiento de la Campaña Por
|
||||
apps/erpnext/erpnext/hr/doctype/expense_claim/expense_claim.js +124,You are the Expense Approver for this record. Please Update the 'Status' and Save,Usted es el Supervisor de Gastos para este registro. Actualice el 'Estado' y Guarde
|
||||
DocType: Material Request,Terms and Conditions Content,Términos y Condiciones Contenido
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +218,Serial No {0} does not belong to Warehouse {1},Número de orden {0} no pertenece al Almacén {1}
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +222,Serial No {0} does not belong to Warehouse {1},Número de orden {0} no pertenece al Almacén {1}
|
||||
DocType: Shopping Cart Shipping Rule,Shopping Cart Shipping Rule,Compras Regla de envío
|
||||
apps/erpnext/erpnext/accounts/doctype/payment_request/payment_request.js +36,Make Payment Entry,Registrar pago
|
||||
DocType: Maintenance Schedule Detail,Scheduled Date,Fecha prevista
|
||||
@@ -361,7 +362,7 @@ DocType: Material Request,% Ordered,% Pedido
|
||||
apps/erpnext/erpnext/projects/doctype/task/task.py +37,'Expected Start Date' can not be greater than 'Expected End Date',La 'Fecha de inicio estimada' no puede ser mayor que la 'Fecha de finalización estimada'
|
||||
DocType: UOM Conversion Detail,UOM Conversion Detail,Detalle de Conversión de Unidad de Medida
|
||||
apps/erpnext/erpnext/accounts/report/general_ledger/general_ledger.py +50,"To filter based on Party, select Party Type first","Para filtrar en base a la fiesta, seleccione Partido Escriba primero"
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +228,Contact Name,Nombre del Contacto
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +254,Contact Name,Nombre del Contacto
|
||||
apps/erpnext/erpnext/setup/setup_wizard/setup_wizard.py +21,Setup Already Complete!!,Configuración completa !
|
||||
DocType: Quotation,Quotation Lost Reason,Cotización Pérdida Razón
|
||||
DocType: Monthly Distribution,Monthly Distribution Percentages,Los porcentajes de distribución mensuales
|
||||
@@ -401,12 +402,12 @@ apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.py +35,Delivery Not
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py +37,Serial #,Serial #
|
||||
DocType: Delivery Note,Vehicle No,Vehículo No
|
||||
DocType: Lead,Lower Income,Ingreso Bajo
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +201,Duplicate Serial No entered for Item {0},Duplicar Serie No existe para la partida {0}
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +205,Duplicate Serial No entered for Item {0},Duplicar Serie No existe para la partida {0}
|
||||
apps/erpnext/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py +47,Delivered Amount,Cantidad Entregada
|
||||
apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center_tree.js +16,New Company,Nueva Empresa
|
||||
DocType: Employee,Permanent Address Is,Dirección permanente es
|
||||
,Issued Items Against Production Order,Productos emitidos con una orden de producción
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.js +260,Max: {0},Max: {0}
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.js +349,Max: {0},Max: {0}
|
||||
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +231,{0} {1} has been modified. Please refresh.,{0} {1} ha sido modificado. Por favor actualizar.
|
||||
DocType: Item,Item Tax,Impuesto del artículo
|
||||
,Item Prices,Precios de los Artículos
|
||||
@@ -418,7 +419,7 @@ apps/erpnext/erpnext/accounts/general_ledger.py +142,Please mention Round Off Ac
|
||||
apps/erpnext/erpnext/selling/doctype/installation_note/installation_note.py +59,Serial No {0} does not belong to Delivery Note {1},Número de orden {0} no pertenece a la nota de entrega {1}
|
||||
DocType: Target Detail,Target Qty,Cantidad Objetivo
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js +265,"Weight is mentioned,\nPlease mention ""Weight UOM"" too","Se menciona Peso, \n ¡Por favor indique ""Peso Unidad de Medida"" también"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js +153,You can not change rate if BOM mentioned agianst any item,No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js +165,You can not change rate if BOM mentioned agianst any item,No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo
|
||||
DocType: Account,Accounts,Contabilidad
|
||||
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +61,Expected Delivery Date cannot be before Purchase Order Date,Fecha prevista de entrega no puede ser anterior Fecha de Orden de Compra
|
||||
DocType: Workstation,per hour,por horas
|
||||
@@ -456,13 +457,13 @@ apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +282,New
|
||||
apps/erpnext/erpnext/setup/setup_wizard/industry_type.py +24,Electronics,Electrónica
|
||||
DocType: Account,Heads (or groups) against which Accounting Entries are made and balances are maintained.,Cuentas (o grupos) contra el que las entradas contables se hacen y los saldos se mantienen.
|
||||
DocType: Journal Entry Account,If Income or Expense,Si es un ingreso o egreso
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +500,Row {0}: An Reorder entry already exists for this warehouse {1},Fila {0}: Una entrada para reordenar ya existe para este almacén {1}
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +493,Row {0}: An Reorder entry already exists for this warehouse {1},Fila {0}: Una entrada para reordenar ya existe para este almacén {1}
|
||||
DocType: Lead,Lead,Iniciativas
|
||||
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +152,There is not enough leave balance for Leave Type {0},No hay suficiente saldo para Tipo de Vacaciones {0}
|
||||
apps/erpnext/erpnext/config/hr.py +87,Block leave applications by department.,Bloquee solicitud de ausencias por departamento.
|
||||
apps/erpnext/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +58,Repeat Customers,Repita los Clientes
|
||||
DocType: Account,Depreciation,Depreciación
|
||||
apps/erpnext/erpnext/selling/doctype/quotation/quotation.py +165,Please create Customer from Lead {0},"Por favor, cree Cliente de la Oportunidad {0}"
|
||||
apps/erpnext/erpnext/selling/doctype/quotation/quotation.py +176,Please create Customer from Lead {0},"Por favor, cree Cliente de la Oportunidad {0}"
|
||||
DocType: Payment Request,Make Sales Invoice,Hacer Factura de Venta
|
||||
DocType: Purchase Invoice,Supplier Invoice No,Factura del Proveedor No
|
||||
DocType: Payment Gateway Account,Payment Account,Pago a cuenta
|
||||
@@ -492,9 +493,9 @@ apps/erpnext/erpnext/config/hr.py +104,Generate Salary Slips,Generar etiquetas s
|
||||
apps/erpnext/erpnext/config/buying.py +23,Quotations received from Suppliers.,Cotizaciones recibidas de los proveedores.
|
||||
DocType: Sales Partner,Sales Partner Target,Socio de Ventas Objetivo
|
||||
apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +47,Make Maintenance Visit,Hacer Visita de Mantenimiento
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +441,Stock cannot be updated against Delivery Note {0},Inventario no puede actualizarse contra Nota de Envio {0}
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +442,Stock cannot be updated against Delivery Note {0},Inventario no puede actualizarse contra Nota de Envio {0}
|
||||
DocType: Workstation,Rent Cost,Renta Costo
|
||||
apps/erpnext/erpnext/hooks.py +116,Issues,Problemas
|
||||
apps/erpnext/erpnext/hooks.py +124,Issues,Problemas
|
||||
DocType: BOM Replace Tool,Current BOM,Lista de materiales actual
|
||||
apps/erpnext/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +75,Row # {0}:,Fila # {0}:
|
||||
DocType: Timesheet,% Amount Billed,% Monto Facturado
|
||||
@@ -515,7 +516,7 @@ DocType: Notification Control,Send automatic emails to Contacts on Submitting tr
|
||||
apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py +78,{0} is not a valid Batch Number for Item {1},{0} no es un número de lote válido para el producto {1}
|
||||
apps/erpnext/erpnext/config/hr.py +110,Salary template master.,Plantilla Maestra para Salario .
|
||||
apps/erpnext/erpnext/setup/doctype/company/company.py +70,"Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.","No se puede cambiar la moneda por defecto de la compañía, porque existen transacciones, estas deben ser canceladas para cambiar la moneda por defecto."
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +422,Default BOM ({0}) must be active for this item or its template,La lista de materiales por defecto ({0}) debe estar activa para este producto o plantilla
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +415,Default BOM ({0}) must be active for this item or its template,La lista de materiales por defecto ({0}) debe estar activa para este producto o plantilla
|
||||
apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center.js +27,Note: This Cost Center is a Group. Cannot make accounting entries against groups.,Nota: Este centro de costos es un grupo. No se pueden crear asientos contables en los grupos.
|
||||
DocType: Email Digest,How frequently?,¿Con qué frecuencia ?
|
||||
DocType: C-Form Invoice Detail,Invoice No,Factura No
|
||||
@@ -542,7 +543,7 @@ apps/erpnext/erpnext/support/page/support_analytics/support_analytics.js +21,Sup
|
||||
DocType: Stock Entry,Subcontract,Subcontrato
|
||||
DocType: Customer,From Lead,De la iniciativa
|
||||
DocType: GL Entry,Party,Socio
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js +25,Update Cost,Actualización de Costos
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js +37,Update Cost,Actualización de Costos
|
||||
DocType: BOM,Last Purchase Rate,Tasa de Cambio de la Última Compra
|
||||
DocType: Bin,Actual Quantity,Cantidad actual
|
||||
DocType: Asset Movement,Stock Manager,Gerente
|
||||
@@ -553,7 +554,7 @@ apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.js +57,'To Case No.
|
||||
DocType: Employee,Health Details,Detalles de la Salud
|
||||
DocType: Maintenance Visit,Unscheduled,No Programada
|
||||
DocType: Purchase Receipt,Other Details,Otros Datos
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +45,"Buying must be checked, if Applicable For is selected as {0}","Compra debe comprobarse, si se selecciona Aplicable Para como {0}"
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +44,"Buying must be checked, if Applicable For is selected as {0}","Compra debe comprobarse, si se selecciona Aplicable Para como {0}"
|
||||
apps/erpnext/erpnext/accounts/report/trial_balance/trial_balance.js +49,Period Closing Entry,Entradas de cierre de período
|
||||
apps/erpnext/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py +26,Cost of Purchased Items,El costo de artículos comprados
|
||||
DocType: Company,Delete Company Transactions,Eliminar Transacciones de la empresa
|
||||
@@ -590,18 +591,18 @@ apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receiv
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +109,Office Maintenance Expenses,Gastos de Mantenimiento de Oficinas
|
||||
DocType: BOM,Manufacturing,Producción
|
||||
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +448,'Entries' cannot be empty,'Entradas' no puede estar vacío
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +209,Rate (%),Procentaje (% )
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +234,Rate (%),Procentaje (% )
|
||||
DocType: Leave Control Panel,Leave Control Panel,Salir del Panel de Control
|
||||
DocType: Monthly Distribution Percentage,Percentage Allocation,Porcentaje de asignación de
|
||||
DocType: Shipping Rule Condition,Shipping Amount,Importe del envío
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +46,Item Code is mandatory because Item is not automatically numbered,El código del artículo es obligatorio porque el producto no se enumera automáticamente
|
||||
DocType: Sales Invoice Item,Sales Order Item,Articulo de la Solicitud de Venta
|
||||
apps/erpnext/erpnext/config/stock.py +163,Incoming quality inspection.,Inspección de calidad entrante
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +257,"List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start.","Enumere algunos de los productos o servicios que usted compra o vende. asegúrese de revisar el 'Grupo' de los artículos, unidad de medida (UOM) y las demás propiedades."
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +284,"List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start.","Enumere algunos de los productos o servicios que usted compra o vende. asegúrese de revisar el 'Grupo' de los artículos, unidad de medida (UOM) y las demás propiedades."
|
||||
DocType: Sales Person,Parent Sales Person,Contacto Principal de Ventas
|
||||
DocType: Warehouse,Warehouse Contact Info,Información de Contacto del Almacén
|
||||
DocType: Supplier,Statutory info and other general information about your Supplier,Información legal y otra información general acerca de su proveedor
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +403,Unit of Measure {0} has been entered more than once in Conversion Factor Table,Unidad de Medida {0} se ha introducido más de una vez en la Tabla de Factores de Conversión
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +396,Unit of Measure {0} has been entered more than once in Conversion Factor Table,Unidad de Medida {0} se ha introducido más de una vez en la Tabla de Factores de Conversión
|
||||
apps/erpnext/erpnext/setup/doctype/currency_exchange/currency_exchange.py +23,From Currency and To Currency cannot be same,'Desde Moneda' y 'A Moneda' no puede ser la misma
|
||||
DocType: Shopping Cart Settings,Default settings for Shopping Cart,Ajustes por defecto para Compras
|
||||
apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center.py +38,Cost Center with existing transactions can not be converted to group,Centro de Costos de las transacciones existentes no se puede convertir al grupo
|
||||
@@ -634,7 +635,7 @@ DocType: Hub Settings,Sync Now,Sincronizar ahora
|
||||
DocType: Serial No,Out of AMC,Fuera de AMC
|
||||
DocType: Leave Application,Apply / Approve Leaves,Aplicar / Aprobar Vacaciones
|
||||
DocType: Offer Letter,Select Terms and Conditions,Selecciona Términos y Condiciones
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +562,Delivery Note {0} is not submitted,Nota de Entrega {0} no está presentada
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +563,Delivery Note {0} is not submitted,Nota de Entrega {0} no está presentada
|
||||
apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +137,"Row {0}: To set {1} periodicity, difference between from and to date \
|
||||
must be greater than or equal to {2}","Fila {0}: Para establecer {1} periodicidad, diferencia entre desde y hasta la fecha \
|
||||
debe ser mayor que o igual a {2}"
|
||||
@@ -687,7 +688,7 @@ DocType: Request for Quotation Item,Project Name,Nombre del proyecto
|
||||
,Serial No Warranty Expiry,Número de orden de caducidad Garantía
|
||||
DocType: Request for Quotation,Manufacturing Manager,Gerente de Manufactura
|
||||
DocType: BOM,Item UOM,Unidad de Medida del Artículo
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +73,Total Invoiced Amt,Total Monto Facturado
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +67,Total Invoiced Amt,Total Monto Facturado
|
||||
DocType: Leave Application,Total Leave Days,Total Vacaciones
|
||||
apps/erpnext/erpnext/config/selling.py +169,Tax template for selling transactions.,Plantilla de Impuestos para las transacciones de venta.
|
||||
DocType: Appraisal Goal,Score Earned,Puntuación Obtenida
|
||||
@@ -705,7 +706,7 @@ apps/erpnext/erpnext/hr/doctype/employee/employee.py +154,Employee cannot report
|
||||
DocType: Stock Entry,Delivery Note No,No. de Nota de Entrega
|
||||
DocType: Journal Entry Account,Purchase Order,Órdenes de Compra
|
||||
apps/erpnext/erpnext/hr/doctype/attendance/attendance.py +49,Employee {0} is not active or does not exist,Empleado {0} no está activo o no existe
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +541,POS Profile required to make POS Entry,Se requiere un perfil POS para crear entradas en el Punto-de-Venta
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +542,POS Profile required to make POS Entry,Se requiere un perfil POS para crear entradas en el Punto-de-Venta
|
||||
,Requested Items To Be Ordered,Solicitud de Productos Aprobados
|
||||
DocType: Salary Slip,Leave Without Pay,Licencia sin Sueldo
|
||||
apps/erpnext/erpnext/accounts/doctype/account/account.py +84,Root cannot be edited.,Root no se puede editar .
|
||||
@@ -717,7 +718,7 @@ DocType: Naming Series,Change the starting / current sequence number of an exist
|
||||
DocType: Serial No,Warehouse can only be changed via Stock Entry / Delivery Note / Purchase Receipt,Depósito sólo se puede cambiar a través de la Entrada de Almacén / Nota de Entrega / Recibo de Compra
|
||||
DocType: Quotation,Quotation To,Cotización Para
|
||||
apps/erpnext/erpnext/support/page/support_analytics/support_analytics.js +30,Select Fiscal Year,Seleccione el año fiscal
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +412,'Has Serial No' can not be 'Yes' for non-stock item,"'Tiene Número de Serie' no puede ser ""Sí"" para elementos que son de inventario"
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +405,'Has Serial No' can not be 'Yes' for non-stock item,"'Tiene Número de Serie' no puede ser ""Sí"" para elementos que son de inventario"
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +20,Cash In Hand,Efectivo Disponible
|
||||
DocType: Salary Component,Earning,Ganancia
|
||||
apps/erpnext/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py +27,Please specify currency in Company,"Por favor, especifique la moneda en la compañía"
|
||||
@@ -763,7 +764,7 @@ apps/erpnext/erpnext/config/hr.py +29,Upload attendance from a .csv file,Sube la
|
||||
apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py +212,Stock Entries already created for Production Order ,Imagenes de entradas ya creadas por Orden de Producción
|
||||
DocType: Shipping Rule,Specify conditions to calculate shipping amount,Especificar condiciones de calcular el importe de envío
|
||||
apps/erpnext/erpnext/setup/doctype/customer_group/customer_group.js +13,This is a root customer group and cannot be edited.,Este es una categoría de cliente raíz y no se puede editar.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.js +40,Submit this Production Order for further processing.,Enviar esta Orden de Producción para su posterior procesamiento .
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.js +102,Submit this Production Order for further processing.,Enviar esta Orden de Producción para su posterior procesamiento .
|
||||
DocType: Item,Customer Items,Artículos de clientes
|
||||
DocType: Selling Settings,Customer Naming By,Naming Cliente Por
|
||||
DocType: Account,Fixed Asset,Activos Fijos
|
||||
@@ -774,7 +775,7 @@ apps/erpnext/erpnext/config/manufacturing.py +57,Where manufacturing operations
|
||||
apps/erpnext/erpnext/hr/doctype/appraisal/appraisal.py +42,Appraisal {0} created for Employee {1} in the given date range,Evaluación {0} creado por Empleado {1} en el rango de fechas determinado
|
||||
DocType: Employee Leave Approver,Employee Leave Approver,Supervisor de Vacaciones del Empleado
|
||||
apps/erpnext/erpnext/setup/setup_wizard/industry_type.py +33,Investment Banking,Banca de Inversión
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +269,Unit,Unidad
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +297,Unit,Unidad
|
||||
,Stock Analytics,Análisis de existencias
|
||||
DocType: Leave Control Panel,Leave blank if considered for all departments,Dejar en blanco si se considera para todos los departamentos
|
||||
,Purchase Order Items To Be Billed,Ordenes de Compra por Facturar
|
||||
@@ -797,9 +798,9 @@ apps/erpnext/erpnext/accounts/doctype/account/account.py +101,Account with child
|
||||
,Stock Projected Qty,Cantidad de Inventario Proyectada
|
||||
DocType: Hub Settings,Seller Country,País del Vendedor
|
||||
DocType: Production Order Operation,Updated via 'Time Log',Actualizado a través de 'Hora de Registro'
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +272,We sell this Item,Vendemos este artículo
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +300,We sell this Item,Vendemos este artículo
|
||||
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +372,{0} against Bill {1} dated {2},{0} contra Factura {1} de fecha {2}
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +256,Your Products or Services,Sus productos o servicios
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +283,Your Products or Services,Sus productos o servicios
|
||||
apps/erpnext/erpnext/controllers/accounts_controller.py +650,{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.,{0} es obligatorio. Tal vez tipo de cambio no se ha creado para {1} en {2}.
|
||||
DocType: Timesheet Detail,To Time,Para Tiempo
|
||||
apps/erpnext/erpnext/public/js/templates/address_list.html +20,No address added yet.,No se ha añadido ninguna dirección todavía.
|
||||
@@ -816,7 +817,7 @@ DocType: Purchase Invoice,Terms,Términos
|
||||
apps/erpnext/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py +49,Supplier(s),Proveedor (s)
|
||||
DocType: Serial No,Serial No Details,Serial No Detalles
|
||||
DocType: Selling Settings,Allow user to edit Price List Rate in transactions,Permitir al usuario editar Precio de Lista en las transacciones
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +230,Serial Nos Required for Serialized Item {0},Serie n Necesario para artículo serializado {0}
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +234,Serial Nos Required for Serialized Item {0},Serie n Necesario para artículo serializado {0}
|
||||
DocType: Item,"Show ""In Stock"" or ""Not in Stock"" based on stock available in this warehouse.","Mostrar ""en la acción "" o "" No disponible "", basada en stock disponible en este almacén."
|
||||
DocType: Employee,Place of Issue,Lugar de emisión
|
||||
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +226,Purchase Order {0} is not submitted,La órden de compra {0} no existe
|
||||
@@ -828,7 +829,7 @@ apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +539,Stock
|
||||
apps/erpnext/erpnext/config/support.py +12,Support queries from customers.,Consultas de soporte de clientes .
|
||||
apps/erpnext/erpnext/config/selling.py +13,Quotes to Leads or Customers.,Cotizaciones a Oportunidades o Clientes
|
||||
apps/erpnext/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py +46,Consumed Amount,Cantidad Consumida
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +439,Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable,"Campo de impuesto del producto {0} debe tener un tipo de cuenta de impuestos, ingresos, cargos o gastos"
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +432,Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable,"Campo de impuesto del producto {0} debe tener un tipo de cuenta de impuestos, ingresos, cargos o gastos"
|
||||
DocType: Purchase Order Item,Supplier Part Number,Número de pieza del proveedor
|
||||
apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +18,'From Date' must be after 'To Date','Desde fecha' debe ser después de 'Hasta Fecha'
|
||||
apps/erpnext/erpnext/accounts/doctype/account/account.py +131,Account with child nodes cannot be converted to ledger,Cuenta con nodos hijos no se puede convertir a cuentas del libro mayor
|
||||
@@ -928,7 +929,7 @@ DocType: Stock Reconciliation Item,Stock Reconciliation Item,Articulo de Reconci
|
||||
DocType: Process Payroll,Process Payroll,Nómina de Procesos
|
||||
apps/erpnext/erpnext/accounts/doctype/account/account.py +54,Account {0}: Parent account {1} does not belong to company: {2},Cuenta {0}: Cuenta Padre {1} no pertenece a la compañía: {2}
|
||||
DocType: Serial No,Purchase / Manufacture Details,Detalles de Compra / Fábricas
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +342,Debit To account must be a Receivable account,La cuenta para Débito debe ser una cuenta por cobrar
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +343,Debit To account must be a Receivable account,La cuenta para Débito debe ser una cuenta por cobrar
|
||||
DocType: Warehouse,Warehouse Detail,Detalle de almacenes
|
||||
DocType: Stock Settings,Raise Material Request when stock reaches re-order level,Enviar solicitud de materiales cuando se alcance un nivel bajo el stock
|
||||
DocType: Maintenance Schedule Detail,Maintenance Schedule Detail,Detalle de Calendario de Mantenimiento
|
||||
@@ -947,7 +948,7 @@ DocType: Account,Round Off,Redondear
|
||||
apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.js +175,Set as Lost,Establecer como Perdidos
|
||||
,Sales Partners Commission,Comisiones de Ventas
|
||||
,Sales Person Target Variance Item Group-Wise,Variación por Vendedor de Meta
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py +546,BOM {0} must be submitted,La lista de materiales (LdM) {0} debe ser enviada
|
||||
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py +549,BOM {0} must be submitted,La lista de materiales (LdM) {0} debe ser enviada
|
||||
apps/erpnext/erpnext/controllers/buying_controller.py +157,Please select BOM in BOM field for Item {0},"Por favor, seleccione la Solicitud de Materiales en el campo de Solicitud de Materiales para el punto {0}"
|
||||
DocType: Purchase Receipt,Rate at which supplier's currency is converted to company's base currency,Grado a la que la moneda de proveedor se convierte en la moneda base de la compañía
|
||||
DocType: Lead,Person Name,Nombre de la persona
|
||||
@@ -958,7 +959,7 @@ apps/erpnext/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py +20
|
||||
DocType: SMS Settings,Enter url parameter for receiver nos,Introduzca el parámetro url para el receptor no
|
||||
,Cash Flow,Flujo de Caja
|
||||
DocType: Accounts Settings,Role that is allowed to submit transactions that exceed credit limits set.,Función que esta autorizada a presentar las transacciones que excedan los límites de crédito establecidos .
|
||||
apps/erpnext/erpnext/stock/utils.py +182,{0} valid serial nos for Item {1},{0} No. de serie válidos para el producto {1}
|
||||
apps/erpnext/erpnext/stock/utils.py +205,{0} valid serial nos for Item {1},{0} No. de serie válidos para el producto {1}
|
||||
DocType: Stock Settings,Default Stock UOM,Unidad de Medida Predeterminada para Inventario
|
||||
DocType: Job Opening,Description of a Job Opening,Descripción de una oferta de trabajo
|
||||
apps/erpnext/erpnext/controllers/trends.py +269,Project-wise data is not available for Quotation,El seguimiento preciso del proyecto no está disponible para la cotización--
|
||||
@@ -968,7 +969,7 @@ apps/erpnext/erpnext/accounts/doctype/pos_profile/pos_profile.py +27,Global POS
|
||||
DocType: Quotation Item,Quotation Item,Cotización del artículo
|
||||
DocType: Employee,Date of Issue,Fecha de emisión
|
||||
DocType: Sales Invoice Item,Sales Invoice Item,Articulo de la Factura de Venta
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +418,Customer {0} does not belong to project {1},Cliente {0} no pertenece a proyectar {1}
|
||||
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +419,Customer {0} does not belong to project {1},Cliente {0} no pertenece a proyectar {1}
|
||||
DocType: Delivery Note Item,Against Sales Invoice Item,Contra la Factura de Venta de Artículos
|
||||
DocType: Sales Invoice,Accounting Details,detalles de la contabilidad
|
||||
apps/erpnext/erpnext/config/accounts.py +61,Accounting journal entries.,Entradas en el diario de contabilidad.
|
||||
@@ -990,7 +991,7 @@ apps/erpnext/erpnext/accounts/doctype/payment_entry/payment_entry.py +237,Agains
|
||||
apps/erpnext/erpnext/controllers/buying_controller.py +293,Row #{0}: Rejected Qty can not be entered in Purchase Return,Fila # {0}: Rechazado Cantidad no se puede introducir en la Compra de Retorno
|
||||
apps/erpnext/erpnext/config/accounts.py +300,Enable / disable currencies.,Habilitar / Deshabilitar el tipo de monedas
|
||||
DocType: Stock Entry,Material Transfer for Manufacture,Trasferencia de Material para Manufactura
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +537,"To merge, following properties must be same for both items","Para combinar, la siguientes propiedades deben ser las mismas para ambos artículos"
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +530,"To merge, following properties must be same for both items","Para combinar, la siguientes propiedades deben ser las mismas para ambos artículos"
|
||||
apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +195,Serial No {0} is under maintenance contract upto {1},Número de orden {0} tiene un contrato de mantenimiento hasta {1}
|
||||
apps/erpnext/erpnext/selling/doctype/installation_note/installation_note.py +83,Please pull items from Delivery Note,"Por favor, extraiga los productos desde la nota de entrega--"
|
||||
apps/erpnext/erpnext/config/hr.py +75,Allocate leaves for a period.,Asignar las vacaciones para un período .
|
||||
@@ -1032,12 +1033,12 @@ apps/erpnext/erpnext/config/selling.py +86,Rules for adding shipping costs.,Regl
|
||||
DocType: Opportunity,Your sales person will get a reminder on this date to contact the customer,Su persona de ventas recibirá un aviso con esta fecha para ponerse en contacto con el cliente
|
||||
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +164,Item Code required at Row No {0},Código del producto requerido en la fila No. {0}
|
||||
DocType: SMS Log,No of Requested SMS,No. de SMS solicitados
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +269,Nos,Números
|
||||
apps/erpnext/erpnext/public/js/setup_wizard.js +297,Nos,Números
|
||||
DocType: Employee,Short biography for website and other publications.,Breve biografía de la página web y otras publicaciones.
|
||||
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +208,Leave of type {0} cannot be longer than {1},Permiso de tipo {0} no puede tener más de {1}
|
||||
,Sales Browser,Navegador de Ventas
|
||||
DocType: Employee,Contact Details,Datos del Contacto
|
||||
apps/erpnext/erpnext/stock/utils.py +189,Warehouse {0} does not belong to company {1},Almacén {0} no pertenece a la empresa {1}
|
||||
apps/erpnext/erpnext/stock/utils.py +212,Warehouse {0} does not belong to company {1},Almacén {0} no pertenece a la empresa {1}
|
||||
apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py +81,The Item {0} cannot have Batch,El artículo {0} no puede tener lotes
|
||||
DocType: Employee Leave Approver,Users who can approve a specific employee's leave applications,Los usuarios que pueden aprobar las solicitudes de licencia de un empleado específico
|
||||
apps/erpnext/erpnext/config/manufacturing.py +18,Generate Material Requests (MRP) and Production Orders.,Generar Solicitudes de Material ( MRP ) y Órdenes de Producción .
|
||||
@@ -1055,7 +1056,7 @@ apps/erpnext/erpnext/setup/doctype/naming_series/naming_series.py +155,Series Up
|
||||
DocType: Opportunity,Opportunity Date,Oportunidad Fecha
|
||||
apps/erpnext/erpnext/config/stock.py +153,Upload stock balance via csv.,Sube saldo de existencias a través csv .
|
||||
apps/erpnext/erpnext/setup/doctype/email_digest/email_digest.js +7,There was an error. One probable reason could be that you haven't saved the form. Please contact support@erpnext.com if the problem persists.,"Ha ocurrido un error . Una razón probable podría ser que usted no ha guardado el formulario. Por favor, póngase en contacto con support@erpnext.com si el problema persiste."
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +74,Max discount allowed for item: {0} is {1}%,Descuento máximo permitido para cada elemento: {0} es {1}%
|
||||
apps/erpnext/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +73,Max discount allowed for item: {0} is {1}%,Descuento máximo permitido para cada elemento: {0} es {1}%
|
||||
,POS,POS
|
||||
apps/erpnext/erpnext/hr/doctype/appraisal/appraisal.py +33,End Date can not be less than Start Date,Fecha Final no puede ser inferior a Fecha de Inicio
|
||||
DocType: Leave Control Panel,Please select Carry Forward if you also want to include previous fiscal year's balance leaves to this fiscal year,"Por favor seleccione trasladar, si usted desea incluir los saldos del año fiscal anterior a este año"
|
||||
@@ -1063,7 +1064,7 @@ DocType: Supplier,Contact HTML,HTML del Contacto
|
||||
DocType: Shipping Rule,Calculate Based On,Calcular basado en
|
||||
DocType: Production Order,Qty To Manufacture,Cantidad Para Fabricación
|
||||
DocType: BOM Item,Basic Rate (Company Currency),Precio Base (Moneda Local)
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +76,Total Outstanding Amt,Monto Total Soprepasado
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +70,Total Outstanding Amt,Monto Total Soprepasado
|
||||
apps/erpnext/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py +39,Outstanding Amt,Monto Sobrepasado
|
||||
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +199,Row {0}: Credit entry can not be linked with a {1},Fila {0}: Crédito no puede vincularse con {1}
|
||||
apps/erpnext/erpnext/setup/setup_wizard/install_fixtures.py +149,Credit Card,Tarjeta de Crédito
|
||||
@@ -1078,8 +1079,8 @@ apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +29,New Serial No cann
|
||||
apps/erpnext/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +80,Overlapping conditions found between:,Condiciones coincidentes encontradas entre :
|
||||
apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.py +47,Please specify a valid 'From Case No.',"Por favor, especifique 'Desde el caso No.' válido"
|
||||
DocType: Process Payroll,Make Bank Entry,Hacer Entrada del Banco
|
||||
apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py +786,Item or Warehouse for row {0} does not match Material Request,Artículo o Bodega para la fila {0} no coincide Solicitud de material
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +67,'Total','Total'
|
||||
apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py +793,Item or Warehouse for row {0} does not match Material Request,Artículo o Bodega para la fila {0} no coincide Solicitud de material
|
||||
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +61,'Total','Total'
|
||||
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +12,Debtors,Deudores
|
||||
DocType: Territory,Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.,Establecer presupuestos - Grupo sabio artículo en este Territorio. También puede incluir la estacionalidad mediante el establecimiento de la Distribución .
|
||||
DocType: Territory,For reference,Por referencia
|
||||
@@ -1088,8 +1089,8 @@ apps/erpnext/erpnext/projects/doctype/timesheet/timesheet.js +48,Make Salary Sli
|
||||
DocType: Sales Invoice,Rounded Total (Company Currency),Total redondeado (Moneda local)
|
||||
DocType: Item,Default BOM,Solicitud de Materiales por Defecto
|
||||
,Delivery Note Trends,Tendencia de Notas de Entrega
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +213,Serial No {0} has already been received,Número de orden {0} ya se ha recibido
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +442,{0} entered twice in Item Tax,{0} ingresado dos veces en el Impuesto del producto
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +217,Serial No {0} has already been received,Número de orden {0} ya se ha recibido
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.py +435,{0} entered twice in Item Tax,{0} ingresado dos veces en el Impuesto del producto
|
||||
apps/erpnext/erpnext/config/projects.py +13,Project master.,Proyecto maestro
|
||||
apps/erpnext/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +47,"There can only be one Shipping Rule Condition with 0 or blank value for ""To Value""","Sólo puede haber una Condición de Regla de Envió con valor 0 o valor en blanco para ""To Value"""
|
||||
DocType: Item Group,Item Group Name,Nombre del grupo de artículos
|
||||
@@ -1109,9 +1110,9 @@ DocType: Monthly Distribution,Distribution Name,Nombre del Distribución
|
||||
DocType: Journal Entry Account,Sales Order,Ordenes de Venta
|
||||
apps/erpnext/erpnext/accounts/page/pos/pos.js +73, to ,para
|
||||
DocType: Item,Weight UOM,Peso Unidad de Medida
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +175,Work-in-Progress Warehouse is required before Submit,Se requiere un Almacen de Trabajo en Proceso antes de Enviar
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py +173,Work-in-Progress Warehouse is required before Submit,Se requiere un Almacen de Trabajo en Proceso antes de Enviar
|
||||
DocType: Production Planning Tool,Get Sales Orders,Recibe Órdenes de Venta
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +194,Serial No {0} quantity {1} cannot be a fraction,Número de orden {0} {1} cantidad no puede ser una fracción
|
||||
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py +198,Serial No {0} quantity {1} cannot be a fraction,Número de orden {0} {1} cantidad no puede ser una fracción
|
||||
DocType: Employee,Applicable Holiday List,Lista de Días Feriados Aplicable
|
||||
apps/erpnext/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +131,Successfully Reconciled,Reconciliado con éxito
|
||||
DocType: Process Payroll,Select Employees,Seleccione Empleados
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user