Merge branch 'develop' into dev-work-order-bugs
This commit is contained in:
commit
f527713b89
@ -3,6 +3,7 @@
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe, json
|
||||
from frappe import _
|
||||
from frappe.utils import add_to_date, date_diff, getdate, nowdate, get_last_day, formatdate
|
||||
from erpnext.accounts.report.general_ledger.general_ledger import execute
|
||||
from frappe.core.page.dashboard.dashboard import cache_source, get_from_date_from_timespan
|
||||
@ -24,6 +25,9 @@ def get(chart_name = None, chart = None, no_cache = None, from_date = None, to_d
|
||||
account = filters.get("account")
|
||||
company = filters.get("company")
|
||||
|
||||
if not account and chart:
|
||||
frappe.throw(_("Account is not set for the dashboard chart {0}").format(chart))
|
||||
|
||||
if not to_date:
|
||||
to_date = nowdate()
|
||||
if not from_date:
|
||||
|
@ -117,7 +117,7 @@ class Account(NestedSet):
|
||||
|
||||
if not parent_acc_name_map: return
|
||||
|
||||
self.create_account_for_child_company(parent_acc_name_map, descendants)
|
||||
self.create_account_for_child_company(parent_acc_name_map, descendants, parent_acc_name)
|
||||
|
||||
def validate_group_or_ledger(self):
|
||||
if self.get("__islocal"):
|
||||
@ -159,7 +159,7 @@ class Account(NestedSet):
|
||||
if frappe.db.get_value("GL Entry", {"account": self.name}):
|
||||
frappe.throw(_("Currency can not be changed after making entries using some other currency"))
|
||||
|
||||
def create_account_for_child_company(self, parent_acc_name_map, descendants):
|
||||
def create_account_for_child_company(self, parent_acc_name_map, descendants, parent_acc_name):
|
||||
for company in descendants:
|
||||
if not parent_acc_name_map.get(company):
|
||||
frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
|
||||
|
@ -160,7 +160,7 @@ def _make_test_records(verbose):
|
||||
["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"]
|
||||
]
|
||||
|
||||
for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"]]:
|
||||
for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"], ["_Test Company with perpetual inventory", "TCP1"]]:
|
||||
test_objects = make_test_objects("Account", [{
|
||||
"doctype": "Account",
|
||||
"account_name": account_name,
|
||||
|
@ -2,6 +2,15 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Coupon Code', {
|
||||
setup: function(frm) {
|
||||
frm.set_query("pricing_rule", function() {
|
||||
return {
|
||||
filters: [
|
||||
["Pricing Rule","coupon_code_based", "=", "1"]
|
||||
]
|
||||
};
|
||||
});
|
||||
},
|
||||
coupon_name:function(frm){
|
||||
if (frm.doc.__islocal===1) {
|
||||
frm.trigger("make_coupon_code");
|
||||
|
@ -24,6 +24,7 @@
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"description": "e.g. \"Summer Holiday 2019 Offer 20\"",
|
||||
"fieldname": "coupon_name",
|
||||
"fieldtype": "Data",
|
||||
"label": "Coupon Name",
|
||||
@ -50,7 +51,7 @@
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"description": "To be used to get discount",
|
||||
"description": "unique e.g. SAVE20 To be used to get discount",
|
||||
"fieldname": "coupon_code",
|
||||
"fieldtype": "Data",
|
||||
"label": "Coupon Code",
|
||||
@ -62,12 +63,13 @@
|
||||
"fieldname": "pricing_rule",
|
||||
"fieldtype": "Link",
|
||||
"label": "Pricing Rule",
|
||||
"options": "Pricing Rule"
|
||||
"options": "Pricing Rule",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "uses",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Uses"
|
||||
"label": "Validity and Usage"
|
||||
},
|
||||
{
|
||||
"fieldname": "valid_from",
|
||||
@ -113,7 +115,7 @@
|
||||
"read_only": 1
|
||||
}
|
||||
],
|
||||
"modified": "2019-10-15 14:12:22.686986",
|
||||
"modified": "2019-10-19 14:48:14.602481",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Coupon Code",
|
||||
|
@ -8,10 +8,12 @@ import unittest
|
||||
from frappe.utils import today, cint, flt, getdate
|
||||
from erpnext.accounts.doctype.loyalty_program.loyalty_program import get_loyalty_program_details_with_points
|
||||
from erpnext.accounts.party import get_dashboard_info
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
|
||||
class TestLoyaltyProgram(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(self):
|
||||
set_perpetual_inventory(0)
|
||||
# create relevant item, customer, loyalty program, etc
|
||||
create_records()
|
||||
|
||||
|
@ -10,7 +10,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent
|
||||
from frappe.utils import cint, flt, today, nowdate, add_days
|
||||
import frappe.defaults
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \
|
||||
test_records as pr_test_records
|
||||
test_records as pr_test_records, make_purchase_receipt, get_taxes
|
||||
from erpnext.controllers.accounts_controller import get_payment_terms
|
||||
from erpnext.exceptions import InvalidCurrency
|
||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_transaction
|
||||
@ -57,16 +57,11 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account))
|
||||
|
||||
def test_gl_entries_with_perpetual_inventory(self):
|
||||
pi = frappe.copy_doc(test_records[1])
|
||||
set_perpetual_inventory(1, pi.company)
|
||||
pi = make_purchase_invoice(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1", get_taxes_and_charges=True, qty=10)
|
||||
self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pi.company)), 1)
|
||||
pi.insert()
|
||||
pi.submit()
|
||||
|
||||
self.check_gle_for_pi(pi.name)
|
||||
|
||||
set_perpetual_inventory(0, pi.company)
|
||||
|
||||
def test_terms_added_after_save(self):
|
||||
pi = frappe.copy_doc(test_records[1])
|
||||
pi.insert()
|
||||
@ -196,21 +191,21 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertEqual(pi.on_hold, 0)
|
||||
|
||||
def test_gl_entries_with_perpetual_inventory_against_pr(self):
|
||||
pr = frappe.copy_doc(pr_test_records[0])
|
||||
set_perpetual_inventory(1, pr.company)
|
||||
self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1)
|
||||
pr.submit()
|
||||
|
||||
pi = frappe.copy_doc(test_records[1])
|
||||
for d in pi.get("items"):
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", get_taxes_and_charges=True,)
|
||||
|
||||
self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1)
|
||||
|
||||
pi = make_purchase_invoice(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1", get_taxes_and_charges=True, qty=10,do_not_save= "True")
|
||||
|
||||
for d in pi.items:
|
||||
d.purchase_receipt = pr.name
|
||||
|
||||
pi.insert()
|
||||
pi.submit()
|
||||
|
||||
self.check_gle_for_pi(pi.name)
|
||||
|
||||
set_perpetual_inventory(0, pr.company)
|
||||
|
||||
def check_gle_for_pi(self, pi):
|
||||
gl_entries = frappe.db.sql("""select account, debit, credit
|
||||
from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
|
||||
@ -218,10 +213,10 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
expected_values = dict((d[0], d) for d in [
|
||||
["_Test Payable - _TC", 0, 720],
|
||||
["Stock Received But Not Billed - _TC", 500.0, 0],
|
||||
["_Test Account Shipping Charges - _TC", 100.0, 0],
|
||||
["_Test Account VAT - _TC", 120.0, 0],
|
||||
["Creditors - TCP1", 0, 720],
|
||||
["Stock Received But Not Billed - TCP1", 500.0, 0],
|
||||
["_Test Account Shipping Charges - TCP1", 100.0, 0],
|
||||
["_Test Account VAT - TCP1", 120.0, 0],
|
||||
])
|
||||
|
||||
for i, gle in enumerate(gl_entries):
|
||||
@ -524,10 +519,9 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertFalse(gle)
|
||||
|
||||
def test_purchase_invoice_update_stock_gl_entry_with_perpetual_inventory(self):
|
||||
set_perpetual_inventory()
|
||||
|
||||
pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
|
||||
posting_time=frappe.utils.nowtime())
|
||||
posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
|
||||
|
||||
gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
|
||||
debit_in_account_currency, credit_in_account_currency
|
||||
@ -548,9 +542,9 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertEqual(expected_gl_entries[gle.account][2], gle.credit)
|
||||
|
||||
def test_purchase_invoice_for_is_paid_and_update_stock_gl_entry_with_perpetual_inventory(self):
|
||||
set_perpetual_inventory()
|
||||
|
||||
pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
|
||||
posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - _TC", is_paid=1)
|
||||
posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", is_paid=1, company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
|
||||
|
||||
gl_entries = frappe.db.sql("""select account, account_currency, sum(debit) as debit,
|
||||
sum(credit) as credit, debit_in_account_currency, credit_in_account_currency
|
||||
@ -563,7 +557,7 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
expected_gl_entries = dict((d[0], d) for d in [
|
||||
[pi.credit_to, 250.0, 250.0],
|
||||
[stock_in_hand_account, 250.0, 0.0],
|
||||
["Cash - _TC", 0.0, 250.0]
|
||||
["Cash - TCP1", 0.0, 250.0]
|
||||
])
|
||||
|
||||
for i, gle in enumerate(gl_entries):
|
||||
@ -630,6 +624,7 @@ class TestPurchaseInvoice(unittest.TestCase):
|
||||
self.assertEqual(pi.get("items")[0].rm_supp_cost, flt(rm_supp_cost, 2))
|
||||
|
||||
def test_rejected_serial_no(self):
|
||||
set_perpetual_inventory(0)
|
||||
pi = make_purchase_invoice(item_code="_Test Serialized Item With Series", received_qty=2, qty=1,
|
||||
rejected_qty=1, rate=500, update_stock=1,
|
||||
rejected_warehouse = "_Test Rejected Warehouse - _TC")
|
||||
@ -881,7 +876,7 @@ def make_purchase_invoice(**args):
|
||||
pi.is_return = args.is_return
|
||||
pi.return_against = args.return_against
|
||||
pi.is_subcontracted = args.is_subcontracted or "No"
|
||||
pi.supplier_warehouse = "_Test Warehouse 1 - _TC"
|
||||
pi.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC"
|
||||
|
||||
pi.append("items", {
|
||||
"item_code": args.item or args.item_code or "_Test Item",
|
||||
@ -890,14 +885,21 @@ def make_purchase_invoice(**args):
|
||||
"received_qty": args.received_qty or 0,
|
||||
"rejected_qty": args.rejected_qty or 0,
|
||||
"rate": args.rate or 50,
|
||||
'expense_account': args.expense_account or '_Test Account Cost for Goods Sold - _TC',
|
||||
"conversion_factor": 1.0,
|
||||
"serial_no": args.serial_no,
|
||||
"stock_uom": "_Test UOM",
|
||||
"cost_center": "_Test Cost Center - _TC",
|
||||
"cost_center": args.cost_center or "_Test Cost Center - _TC",
|
||||
"project": args.project,
|
||||
"rejected_warehouse": args.rejected_warehouse or "",
|
||||
"rejected_serial_no": args.rejected_serial_no or ""
|
||||
})
|
||||
|
||||
if args.get_taxes_and_charges:
|
||||
taxes = get_taxes()
|
||||
for tax in taxes:
|
||||
pi.append("taxes", tax)
|
||||
|
||||
if not args.do_not_save:
|
||||
pi.insert()
|
||||
if not args.do_not_submit:
|
||||
|
@ -402,14 +402,21 @@ def make_invoice(doc_list={}, email_queue_list={}, customers_list={}):
|
||||
for docs in doc_list:
|
||||
for name, doc in iteritems(docs):
|
||||
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
|
||||
validate_records(doc)
|
||||
si_doc = frappe.new_doc('Sales Invoice')
|
||||
si_doc.offline_pos_name = name
|
||||
si_doc.update(doc)
|
||||
si_doc.set_posting_time = 1
|
||||
si_doc.customer = get_customer_id(doc)
|
||||
si_doc.due_date = doc.get('posting_date')
|
||||
name_list = submit_invoice(si_doc, name, doc, name_list)
|
||||
if isinstance(doc, dict):
|
||||
validate_records(doc)
|
||||
si_doc = frappe.new_doc('Sales Invoice')
|
||||
si_doc.offline_pos_name = name
|
||||
si_doc.update(doc)
|
||||
si_doc.set_posting_time = 1
|
||||
si_doc.customer = get_customer_id(doc)
|
||||
si_doc.due_date = doc.get('posting_date')
|
||||
name_list = submit_invoice(si_doc, name, doc, name_list)
|
||||
else:
|
||||
doc.due_date = doc.get('posting_date')
|
||||
doc.customer = get_customer_id(doc)
|
||||
doc.set_posting_time = 1
|
||||
doc.offline_pos_name = name
|
||||
name_list = submit_invoice(doc, name, doc, name_list)
|
||||
else:
|
||||
name_list.append(name)
|
||||
|
||||
|
@ -686,7 +686,6 @@ class SalesInvoice(SellingController):
|
||||
|
||||
def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False):
|
||||
auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company)
|
||||
|
||||
if not gl_entries:
|
||||
gl_entries = self.get_gl_entries()
|
||||
|
||||
|
@ -68,8 +68,6 @@
|
||||
"selling_price_list": "_Test Price List",
|
||||
"territory": "_Test Territory"
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"conversion_rate": 1.0,
|
||||
@ -276,7 +274,6 @@
|
||||
"uom": "_Test UOM 1",
|
||||
"conversion_factor": 1,
|
||||
"stock_uom": "_Test UOM 1"
|
||||
|
||||
},
|
||||
{
|
||||
"cost_center": "_Test Cost Center - _TC",
|
||||
|
@ -20,6 +20,9 @@ from erpnext.stock.doctype.item.test_item import create_item
|
||||
from six import iteritems
|
||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||
from erpnext.regional.india.utils import get_ewb_data
|
||||
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
|
||||
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
|
||||
|
||||
class TestSalesInvoice(unittest.TestCase):
|
||||
def make(self):
|
||||
@ -550,7 +553,6 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
si.get("taxes")[6].tax_amount = 2
|
||||
|
||||
si.insert()
|
||||
print(si.name)
|
||||
|
||||
expected_values = [
|
||||
{
|
||||
@ -679,56 +681,67 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertFalse(gle)
|
||||
|
||||
def test_pos_gl_entry_with_perpetual_inventory(self):
|
||||
set_perpetual_inventory()
|
||||
make_pos_profile()
|
||||
|
||||
self._insert_purchase_receipt()
|
||||
pos = copy.deepcopy(test_records[1])
|
||||
pos["is_pos"] = 1
|
||||
pos["update_stock"] = 1
|
||||
pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
|
||||
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300}]
|
||||
pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
|
||||
|
||||
pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
|
||||
|
||||
pos.is_pos = 1
|
||||
pos.update_stock = 1
|
||||
|
||||
pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
|
||||
pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 50})
|
||||
|
||||
taxes = get_taxes_and_charges()
|
||||
pos.taxes = []
|
||||
for tax in taxes:
|
||||
pos.append("taxes", tax)
|
||||
|
||||
si = frappe.copy_doc(pos)
|
||||
si.insert()
|
||||
si.submit()
|
||||
self.assertEqual(si.paid_amount, 100.0)
|
||||
|
||||
self.assertEqual(si.paid_amount, 600.0)
|
||||
|
||||
self.pos_gl_entry(si, pos, 300)
|
||||
self.pos_gl_entry(si, pos, 50)
|
||||
|
||||
def test_pos_change_amount(self):
|
||||
set_perpetual_inventory()
|
||||
make_pos_profile()
|
||||
|
||||
self._insert_purchase_receipt()
|
||||
pos = copy.deepcopy(test_records[1])
|
||||
pos["is_pos"] = 1
|
||||
pos["update_stock"] = 1
|
||||
pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
|
||||
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 340}]
|
||||
pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
|
||||
|
||||
si = frappe.copy_doc(pos)
|
||||
si.change_amount = 5.0
|
||||
si.insert()
|
||||
si.submit()
|
||||
pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
|
||||
|
||||
self.assertEqual(si.grand_total, 630.0)
|
||||
self.assertEqual(si.write_off_amount, -5)
|
||||
pos.is_pos = 1
|
||||
pos.update_stock = 1
|
||||
|
||||
pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
|
||||
pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 60})
|
||||
|
||||
pos.change_amount = 5.0
|
||||
pos.insert()
|
||||
pos.submit()
|
||||
|
||||
self.assertEqual(pos.grand_total, 100.0)
|
||||
self.assertEqual(pos.write_off_amount, -5)
|
||||
|
||||
def test_make_pos_invoice(self):
|
||||
from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
|
||||
|
||||
set_perpetual_inventory()
|
||||
|
||||
make_pos_profile()
|
||||
self._insert_purchase_receipt()
|
||||
pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
|
||||
pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
|
||||
|
||||
pos = copy.deepcopy(test_records[1])
|
||||
pos["is_pos"] = 1
|
||||
pos["update_stock"] = 1
|
||||
pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
|
||||
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}]
|
||||
pos.is_pos = 1
|
||||
pos.update_stock = 1
|
||||
|
||||
pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
|
||||
pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 50})
|
||||
|
||||
taxes = get_taxes_and_charges()
|
||||
pos.taxes = []
|
||||
for tax in taxes:
|
||||
pos.append("taxes", tax)
|
||||
|
||||
invoice_data = [{'09052016142': pos}]
|
||||
si = make_invoice(invoice_data).get('invoice')
|
||||
@ -736,16 +749,15 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
|
||||
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1})
|
||||
si = frappe.get_doc('Sales Invoice', sales_invoice[0].name)
|
||||
self.assertEqual(si.grand_total, 630.0)
|
||||
|
||||
self.pos_gl_entry(si, pos, 330)
|
||||
self.assertEqual(si.grand_total, 100)
|
||||
|
||||
self.pos_gl_entry(si, pos, 50)
|
||||
|
||||
def test_make_pos_invoice_in_draft(self):
|
||||
from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
|
||||
from erpnext.stock.doctype.item.test_item import make_item
|
||||
|
||||
set_perpetual_inventory()
|
||||
|
||||
allow_negative_stock = frappe.db.get_single_value('Stock Settings', 'allow_negative_stock')
|
||||
if allow_negative_stock:
|
||||
frappe.db.set_value('Stock Settings', None, 'allow_negative_stock', 0)
|
||||
@ -789,7 +801,7 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
si.name, as_dict=1)[0]
|
||||
self.assertTrue(sle)
|
||||
self.assertEqual([sle.item_code, sle.warehouse, sle.actual_qty],
|
||||
["_Test Item", "_Test Warehouse - _TC", -1.0])
|
||||
['_Test FG Item', 'Stores - TCP1', -1.0])
|
||||
|
||||
# check gl entries
|
||||
gl_entries = frappe.db.sql("""select account, debit, credit
|
||||
@ -797,19 +809,19 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
order by account asc, debit asc, credit asc""", si.name, as_dict=1)
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
stock_in_hand = get_inventory_account('_Test Company')
|
||||
|
||||
stock_in_hand = get_inventory_account('_Test Company with perpetual inventory')
|
||||
expected_gl_entries = sorted([
|
||||
[si.debit_to, 630.0, 0.0],
|
||||
[pos["items"][0]["income_account"], 0.0, 500.0],
|
||||
[pos["taxes"][0]["account_head"], 0.0, 80.0],
|
||||
[pos["taxes"][1]["account_head"], 0.0, 50.0],
|
||||
[si.debit_to, 100.0, 0.0],
|
||||
[pos.items[0].income_account, 0.0, 89.09],
|
||||
['Round Off - TCP1', 0.0, 0.01],
|
||||
[pos.taxes[0].account_head, 0.0, 10.69],
|
||||
[pos.taxes[1].account_head, 0.0, 0.21],
|
||||
[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
|
||||
[pos["items"][0]["expense_account"], abs(sle.stock_value_difference), 0.0],
|
||||
[si.debit_to, 0.0, 300.0],
|
||||
[pos.items[0].expense_account, abs(sle.stock_value_difference), 0.0],
|
||||
[si.debit_to, 0.0, 50.0],
|
||||
[si.debit_to, 0.0, cash_amount],
|
||||
["_Test Bank - _TC", 300.0, 0.0],
|
||||
["Cash - _TC", cash_amount, 0.0]
|
||||
["_Test Bank - TCP1", 50, 0.0],
|
||||
["Cash - TCP1", cash_amount, 0.0]
|
||||
])
|
||||
|
||||
for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)):
|
||||
@ -823,9 +835,9 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
|
||||
self.assertFalse(gle)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
frappe.db.sql("delete from `tabPOS Profile`")
|
||||
si.delete()
|
||||
|
||||
def test_pos_si_without_payment(self):
|
||||
set_perpetual_inventory()
|
||||
@ -1008,7 +1020,6 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
"""
|
||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
|
||||
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
||||
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
|
||||
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
||||
|
||||
se = make_serialized_item()
|
||||
@ -1023,14 +1034,17 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertEqual(si.get("items")[0].serial_no, dn.get("items")[0].serial_no)
|
||||
|
||||
def test_return_sales_invoice(self):
|
||||
set_perpetual_inventory()
|
||||
make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100)
|
||||
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100)
|
||||
|
||||
actual_qty_0 = get_qty_after_transaction()
|
||||
actual_qty_0 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
|
||||
|
||||
si = create_sales_invoice(qty=5, rate=500, update_stock=1)
|
||||
si = create_sales_invoice(qty = 5, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1")
|
||||
|
||||
|
||||
actual_qty_1 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
actual_qty_1 = get_qty_after_transaction()
|
||||
self.assertEqual(actual_qty_0 - 5, actual_qty_1)
|
||||
|
||||
# outgoing_rate
|
||||
@ -1038,10 +1052,9 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
"voucher_no": si.name}, "stock_value_difference") / 5
|
||||
|
||||
# return entry
|
||||
si1 = create_sales_invoice(is_return=1, return_against=si.name, qty=-2, rate=500, update_stock=1)
|
||||
|
||||
actual_qty_2 = get_qty_after_transaction()
|
||||
si1 = create_sales_invoice(is_return=1, return_against=si.name, qty=-2, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1")
|
||||
|
||||
actual_qty_2 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
|
||||
self.assertEqual(actual_qty_1 + 2, actual_qty_2)
|
||||
|
||||
incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
|
||||
@ -1049,7 +1062,7 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
["incoming_rate", "stock_value_difference"])
|
||||
|
||||
self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
|
||||
stock_in_hand_account = get_inventory_account('_Test Company', si1.items[0].warehouse)
|
||||
stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory', si1.items[0].warehouse)
|
||||
|
||||
# Check gl entry
|
||||
gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice",
|
||||
@ -1058,7 +1071,7 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertEqual(gle_warehouse_amount, stock_value_difference)
|
||||
|
||||
party_credited = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice",
|
||||
"voucher_no": si1.name, "account": "Debtors - _TC", "party": "_Test Customer"}, "credit")
|
||||
"voucher_no": si1.name, "account": "Debtors - TCP1", "party": "_Test Customer"}, "credit")
|
||||
|
||||
self.assertEqual(party_credited, 1000)
|
||||
|
||||
@ -1066,7 +1079,6 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertFalse(si1.outstanding_amount)
|
||||
self.assertEqual(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"), 1500)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_discount_on_net_total(self):
|
||||
si = frappe.copy_doc(test_records[2])
|
||||
@ -1524,6 +1536,8 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
self.assertEqual(si.total_taxes_and_charges, 577.05)
|
||||
self.assertEqual(si.grand_total, 1827.05)
|
||||
|
||||
|
||||
|
||||
def test_create_invoice_without_terms(self):
|
||||
si = create_sales_invoice(do_not_save=1)
|
||||
self.assertFalse(si.get('payment_schedule'))
|
||||
@ -1930,4 +1944,29 @@ def get_outstanding_amount(against_voucher_type, against_voucher, account, party
|
||||
if against_voucher_type == 'Purchase Invoice':
|
||||
bal = bal * -1
|
||||
|
||||
return bal
|
||||
return bal
|
||||
|
||||
def get_taxes_and_charges():
|
||||
return [{
|
||||
"account_head": "_Test Account Excise Duty - TCP1",
|
||||
"charge_type": "On Net Total",
|
||||
"cost_center": "Main - TCP1",
|
||||
"description": "Excise Duty",
|
||||
"doctype": "Sales Taxes and Charges",
|
||||
"idx": 1,
|
||||
"included_in_print_rate": 1,
|
||||
"parentfield": "taxes",
|
||||
"rate": 12
|
||||
},
|
||||
{
|
||||
"account_head": "_Test Account Education Cess - TCP1",
|
||||
"charge_type": "On Previous Row Amount",
|
||||
"cost_center": "Main - TCP1",
|
||||
"description": "Education Cess",
|
||||
"doctype": "Sales Taxes and Charges",
|
||||
"idx": 2,
|
||||
"included_in_print_rate": 1,
|
||||
"parentfield": "taxes",
|
||||
"rate": 2,
|
||||
"row_id": 1
|
||||
}]
|
@ -14,13 +14,13 @@ class TestShippingRule(unittest.TestCase):
|
||||
shipping_rule.name = test_records[0].get('name')
|
||||
shipping_rule.get("conditions")[0].from_value = 101
|
||||
self.assertRaises(FromGreaterThanToError, shipping_rule.insert)
|
||||
|
||||
|
||||
def test_many_zero_to_values(self):
|
||||
shipping_rule = frappe.copy_doc(test_records[0])
|
||||
shipping_rule.name = test_records[0].get('name')
|
||||
shipping_rule.get("conditions")[0].to_value = 0
|
||||
self.assertRaises(ManyBlankToValuesError, shipping_rule.insert)
|
||||
|
||||
|
||||
def test_overlapping_conditions(self):
|
||||
for range_a, range_b in [
|
||||
((50, 150), (0, 100)),
|
||||
@ -38,6 +38,10 @@ class TestShippingRule(unittest.TestCase):
|
||||
self.assertRaises(OverlappingConditionError, shipping_rule.insert)
|
||||
|
||||
def create_shipping_rule(shipping_rule_type, shipping_rule_name):
|
||||
|
||||
if frappe.db.exists("Shipping Rule", shipping_rule_name):
|
||||
return frappe.get_doc("Shipping Rule", shipping_rule_name)
|
||||
|
||||
sr = frappe.new_doc("Shipping Rule")
|
||||
sr.account = "_Test Account Shipping Charges - _TC"
|
||||
sr.calculate_based_on = "Net Total"
|
||||
@ -70,4 +74,4 @@ def create_shipping_rule(shipping_rule_type, shipping_rule_name):
|
||||
})
|
||||
sr.insert(ignore_permissions=True)
|
||||
sr.submit()
|
||||
return sr
|
||||
return sr
|
||||
|
@ -3,8 +3,9 @@
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe, erpnext
|
||||
from frappe.utils import flt, cstr, cint
|
||||
from frappe.utils import flt, cstr, cint, comma_and
|
||||
from frappe import _
|
||||
from erpnext.accounts.utils import get_stock_and_account_balance
|
||||
from frappe.model.meta import get_field_precision
|
||||
from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget
|
||||
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
|
||||
@ -12,6 +13,7 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import g
|
||||
|
||||
class ClosedAccountingPeriod(frappe.ValidationError): pass
|
||||
class StockAccountInvalidTransaction(frappe.ValidationError): pass
|
||||
class StockValueAndAccountBalanceOutOfSync(frappe.ValidationError): pass
|
||||
|
||||
def make_gl_entries(gl_map, cancel=False, adv_adj=False, merge_entries=True, update_outstanding='Yes', from_repost=False):
|
||||
if gl_map:
|
||||
@ -115,11 +117,9 @@ def check_if_in_list(gle, gl_map, dimensions=None):
|
||||
|
||||
def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False):
|
||||
if not from_repost:
|
||||
validate_account_for_perpetual_inventory(gl_map)
|
||||
validate_cwip_accounts(gl_map)
|
||||
|
||||
round_off_debit_credit(gl_map)
|
||||
|
||||
for entry in gl_map:
|
||||
make_entry(entry, adv_adj, update_outstanding, from_repost)
|
||||
|
||||
@ -127,6 +127,10 @@ def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False):
|
||||
if not from_repost:
|
||||
validate_expense_against_budget(entry)
|
||||
|
||||
if not from_repost:
|
||||
validate_account_for_perpetual_inventory(gl_map)
|
||||
|
||||
|
||||
def make_entry(args, adv_adj, update_outstanding, from_repost=False):
|
||||
args.update({"doctype": "GL Entry"})
|
||||
gle = frappe.get_doc(args)
|
||||
@ -137,15 +141,31 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False):
|
||||
gle.submit()
|
||||
|
||||
def validate_account_for_perpetual_inventory(gl_map):
|
||||
if cint(erpnext.is_perpetual_inventory_enabled(gl_map[0].company)) \
|
||||
and gl_map[0].voucher_type=="Journal Entry":
|
||||
aii_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount
|
||||
where account_type = 'Stock' and is_group=0""")]
|
||||
if cint(erpnext.is_perpetual_inventory_enabled(gl_map[0].company)):
|
||||
account_list = [gl_entries.account for gl_entries in gl_map]
|
||||
|
||||
for entry in gl_map:
|
||||
if entry.account in aii_accounts:
|
||||
aii_accounts = [d.name for d in frappe.get_all("Account",
|
||||
filters={'account_type': 'Stock', 'is_group': 0, 'company': gl_map[0].company})]
|
||||
|
||||
for account in account_list:
|
||||
if account not in aii_accounts:
|
||||
continue
|
||||
|
||||
account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(account,
|
||||
gl_map[0].posting_date, gl_map[0].company)
|
||||
|
||||
if gl_map[0].voucher_type=="Journal Entry":
|
||||
# In case of Journal Entry, there are no corresponding SL entries,
|
||||
# hence deducting currency amount
|
||||
account_bal -= flt(gl_map[0].debit) - flt(gl_map[0].credit)
|
||||
if account_bal == stock_bal:
|
||||
frappe.throw(_("Account: {0} can only be updated via Stock Transactions")
|
||||
.format(entry.account), StockAccountInvalidTransaction)
|
||||
.format(account), StockAccountInvalidTransaction)
|
||||
|
||||
elif account_bal != stock_bal:
|
||||
frappe.throw(_("Account Balance ({0}) and Stock Value ({1}) is out of sync for account {2} and linked warehouse ({3}). Please create adjustment Journal Entry for amount {4}.")
|
||||
.format(account_bal, stock_bal, account, comma_and(warehouse_list), stock_bal - account_bal),
|
||||
StockValueAndAccountBalanceOutOfSync)
|
||||
|
||||
def validate_cwip_accounts(gl_map):
|
||||
if not cint(frappe.db.get_value("Asset Settings", None, "disable_cwip_accounting")) \
|
||||
|
@ -13,6 +13,10 @@ from six import iteritems
|
||||
# imported to enable erpnext.accounts.utils.get_account_currency
|
||||
from erpnext.accounts.doctype.account.account import get_account_currency
|
||||
|
||||
from erpnext.stock.utils import get_stock_value_on
|
||||
from erpnext.stock import get_warehouse_account_map
|
||||
|
||||
|
||||
class FiscalYearError(frappe.ValidationError): pass
|
||||
|
||||
@frappe.whitelist()
|
||||
@ -560,23 +564,23 @@ def fix_total_debit_credit():
|
||||
(dr_or_cr, dr_or_cr, '%s', '%s', '%s', dr_or_cr),
|
||||
(d.diff, d.voucher_type, d.voucher_no))
|
||||
|
||||
def get_stock_and_account_difference(account_list=None, posting_date=None, company=None):
|
||||
from erpnext.stock.utils import get_stock_value_on
|
||||
from erpnext.stock import get_warehouse_account_map
|
||||
|
||||
def get_stock_and_account_balance(account=None, posting_date=None, company=None):
|
||||
if not posting_date: posting_date = nowdate()
|
||||
|
||||
difference = {}
|
||||
warehouse_account = get_warehouse_account_map(company)
|
||||
|
||||
for warehouse, account_data in iteritems(warehouse_account):
|
||||
if account_data.get('account') in account_list:
|
||||
account_balance = get_balance_on(account_data.get('account'), posting_date, in_account_currency=False)
|
||||
stock_value = get_stock_value_on(warehouse, posting_date)
|
||||
if abs(flt(stock_value) - flt(account_balance)) > 0.005:
|
||||
difference.setdefault(account_data.get('account'), flt(stock_value) - flt(account_balance))
|
||||
account_balance = get_balance_on(account, posting_date, in_account_currency=False)
|
||||
|
||||
return difference
|
||||
related_warehouses = [wh for wh, wh_details in warehouse_account.items()
|
||||
if wh_details.account == account and not wh_details.is_group]
|
||||
|
||||
total_stock_value = 0.0
|
||||
for warehouse in related_warehouses:
|
||||
value = get_stock_value_on(warehouse, posting_date)
|
||||
total_stock_value += value
|
||||
|
||||
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
|
||||
return flt(account_balance, precision), flt(total_stock_value, precision), related_warehouses
|
||||
|
||||
def get_currency_precision():
|
||||
precision = cint(frappe.db.get_default("currency_precision"))
|
||||
|
@ -1172,6 +1172,7 @@ def set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docna
|
||||
def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, child_docname="items"):
|
||||
data = json.loads(trans_items)
|
||||
|
||||
sales_doctypes = ['Sales Order', 'Sales Invoice', 'Delivery Note', 'Quotation']
|
||||
parent = frappe.get_doc(parent_doctype, parent_doctype_name)
|
||||
|
||||
for d in data:
|
||||
@ -1204,18 +1205,22 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
|
||||
# if rate is greater than price_list_rate, set margin
|
||||
# or set discount
|
||||
child_item.discount_percentage = 0
|
||||
child_item.margin_type = "Amount"
|
||||
child_item.margin_rate_or_amount = flt(child_item.rate - child_item.price_list_rate,
|
||||
child_item.precision("margin_rate_or_amount"))
|
||||
child_item.rate_with_margin = child_item.rate
|
||||
|
||||
if parent_doctype in sales_doctypes:
|
||||
child_item.margin_type = "Amount"
|
||||
child_item.margin_rate_or_amount = flt(child_item.rate - child_item.price_list_rate,
|
||||
child_item.precision("margin_rate_or_amount"))
|
||||
child_item.rate_with_margin = child_item.rate
|
||||
else:
|
||||
child_item.discount_percentage = flt((1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0,
|
||||
child_item.precision("discount_percentage"))
|
||||
child_item.discount_amount = flt(
|
||||
child_item.price_list_rate) - flt(child_item.rate)
|
||||
child_item.margin_type = ""
|
||||
child_item.margin_rate_or_amount = 0
|
||||
child_item.rate_with_margin = 0
|
||||
|
||||
if parent_doctype in sales_doctypes:
|
||||
child_item.margin_type = ""
|
||||
child_item.margin_rate_or_amount = 0
|
||||
child_item.rate_with_margin = 0
|
||||
|
||||
child_item.flags.ignore_validate_update_after_submit = True
|
||||
if new_child_flag:
|
||||
|
@ -152,6 +152,20 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
||||
conditions = []
|
||||
|
||||
#Get searchfields from meta and use in Item Link field query
|
||||
meta = frappe.get_meta("Item", cached=True)
|
||||
searchfields = meta.get_search_fields()
|
||||
|
||||
if "description" in searchfields:
|
||||
searchfields.remove("description")
|
||||
|
||||
columns = [field for field in searchfields if not field in ["name", "item_group", "description"]]
|
||||
columns = ", ".join(columns)
|
||||
|
||||
searchfields = searchfields + [field for field in[searchfield or "name", "item_code", "item_group", "item_name"]
|
||||
if not field in searchfields]
|
||||
searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
|
||||
|
||||
description_cond = ''
|
||||
if frappe.db.count('Item', cache=True) < 50000:
|
||||
# scan description only if items are less than 50000
|
||||
@ -162,17 +176,14 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
||||
concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name,
|
||||
tabItem.item_group,
|
||||
if(length(tabItem.description) > 40, \
|
||||
concat(substr(tabItem.description, 1, 40), "..."), description) as decription
|
||||
concat(substr(tabItem.description, 1, 40), "..."), description) as description,
|
||||
{columns}
|
||||
from tabItem
|
||||
where tabItem.docstatus < 2
|
||||
and tabItem.has_variants=0
|
||||
and tabItem.disabled=0
|
||||
and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00')
|
||||
and (tabItem.`{key}` LIKE %(txt)s
|
||||
or tabItem.item_code LIKE %(txt)s
|
||||
or tabItem.item_group LIKE %(txt)s
|
||||
or tabItem.item_name LIKE %(txt)s
|
||||
or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s)
|
||||
and ({scond} or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s)
|
||||
{description_cond})
|
||||
{fcond} {mcond}
|
||||
order by
|
||||
@ -182,6 +193,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
||||
name, item_name
|
||||
limit %(start)s, %(page_len)s """.format(
|
||||
key=searchfield,
|
||||
columns=columns,
|
||||
scond=searchfields,
|
||||
fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
|
||||
mcond=get_match_cond(doctype).replace('%', '%%'),
|
||||
description_cond = description_cond),
|
||||
|
@ -207,41 +207,6 @@ class StockController(AccountsController):
|
||||
reference_doctype=self.doctype,
|
||||
reference_name=self.name)).insert().name
|
||||
|
||||
def make_adjustment_entry(self, expected_gle, voucher_obj):
|
||||
from erpnext.accounts.utils import get_stock_and_account_difference
|
||||
account_list = [d.account for d in expected_gle]
|
||||
acc_diff = get_stock_and_account_difference(account_list,
|
||||
expected_gle[0].posting_date, self.company)
|
||||
|
||||
cost_center = self.get_company_default("cost_center")
|
||||
stock_adjustment_account = self.get_company_default("stock_adjustment_account")
|
||||
|
||||
gl_entries = []
|
||||
for account, diff in acc_diff.items():
|
||||
if diff:
|
||||
gl_entries.append([
|
||||
# stock in hand account
|
||||
voucher_obj.get_gl_dict({
|
||||
"account": account,
|
||||
"against": stock_adjustment_account,
|
||||
"debit": diff,
|
||||
"remarks": "Adjustment Accounting Entry for Stock",
|
||||
}),
|
||||
|
||||
# account against stock in hand
|
||||
voucher_obj.get_gl_dict({
|
||||
"account": stock_adjustment_account,
|
||||
"against": account,
|
||||
"credit": diff,
|
||||
"cost_center": cost_center or None,
|
||||
"remarks": "Adjustment Accounting Entry for Stock",
|
||||
}),
|
||||
])
|
||||
|
||||
if gl_entries:
|
||||
from erpnext.accounts.general_ledger import make_gl_entries
|
||||
make_gl_entries(gl_entries)
|
||||
|
||||
def check_expense_account(self, item):
|
||||
if not item.get("expense_account"):
|
||||
frappe.throw(_("Expense or Difference account is mandatory for Item {0} as it impacts overall stock value").format(item.item_code))
|
||||
|
@ -27,3 +27,16 @@ frappe.ui.form.on('Student', {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
frappe.ui.form.on('Student Guardian', {
|
||||
guardians_add: function(frm){
|
||||
frm.fields_dict['guardians'].grid.get_field('guardian').get_query = function(doc){
|
||||
var guardian_list = [];
|
||||
if(!doc.__islocal) guardian_list.push(doc.guardian);
|
||||
$.each(doc.guardians, function(idx, val){
|
||||
if (val.guardian) guardian_list.push(val.guardian);
|
||||
});
|
||||
return { filters: [['Guardian', 'name', 'not in', guardian_list]] };
|
||||
};
|
||||
}
|
||||
});
|
||||
|
@ -39,7 +39,7 @@ def get_message(exception):
|
||||
if hasattr(exception, 'message'):
|
||||
message = exception.message
|
||||
elif hasattr(exception, '__str__'):
|
||||
message = e.__str__()
|
||||
message = exception.__str__()
|
||||
else:
|
||||
message = "Something went wrong while syncing"
|
||||
return message
|
||||
|
@ -43,7 +43,7 @@ class ShopifySettings(Document):
|
||||
d.raise_for_status()
|
||||
self.update_webhook_table(method, d.json())
|
||||
except Exception as e:
|
||||
make_shopify_log(status="Warning", message=e, exception=False)
|
||||
make_shopify_log(status="Warning", exception=e, rollback=True)
|
||||
|
||||
def unregister_webhooks(self):
|
||||
session = get_request_session()
|
||||
|
@ -283,7 +283,6 @@ scheduler_events = {
|
||||
],
|
||||
"daily": [
|
||||
"erpnext.stock.reorder_item.reorder_item",
|
||||
"erpnext.setup.doctype.email_digest.email_digest.send",
|
||||
"erpnext.support.doctype.issue.issue.auto_close_tickets",
|
||||
"erpnext.crm.doctype.opportunity.opportunity.auto_close_opportunity",
|
||||
"erpnext.controllers.accounts_controller.update_invoice_status",
|
||||
@ -306,6 +305,7 @@ scheduler_events = {
|
||||
"erpnext.crm.doctype.email_campaign.email_campaign.set_email_campaign_status"
|
||||
],
|
||||
"daily_long": [
|
||||
"erpnext.setup.doctype.email_digest.email_digest.send",
|
||||
"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms",
|
||||
"erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry.process_expired_allocation",
|
||||
"erpnext.hr.utils.generate_leave_encashment"
|
||||
|
@ -2,11 +2,11 @@ frappe.listview_settings['Expense Claim'] = {
|
||||
add_fields: ["total_claimed_amount", "docstatus"],
|
||||
get_indicator: function(doc) {
|
||||
if(doc.status == "Paid") {
|
||||
return [__("Paid"), "green", "status,=,'Paid'"];
|
||||
return [__("Paid"), "green", "status,=,Paid"];
|
||||
}else if(doc.status == "Unpaid") {
|
||||
return [__("Unpaid"), "orange"];
|
||||
return [__("Unpaid"), "orange", "status,=,Unpaid"];
|
||||
} else if(doc.status == "Rejected") {
|
||||
return [__("Rejected"), "grey"];
|
||||
return [__("Rejected"), "grey", "status,=,Rejected"];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -125,7 +125,7 @@ class LeaveApplication(Document):
|
||||
status = "Half Day" if date == self.half_day_date else "On Leave"
|
||||
|
||||
attendance_name = frappe.db.exists('Attendance', dict(employee = self.employee,
|
||||
attenance_date = date, docstatus = ('!=', 2)))
|
||||
attendance_date = date, docstatus = ('!=', 2)))
|
||||
|
||||
if attendance_name:
|
||||
# update existing attendance, change absent to on leave
|
||||
@ -503,14 +503,17 @@ def get_leave_allocation_records(employee, date, leave_type=None):
|
||||
|
||||
def get_pending_leaves_for_period(employee, leave_type, from_date, to_date):
|
||||
''' Returns leaves that are pending approval '''
|
||||
return frappe.db.get_value("Leave Application",
|
||||
leaves = frappe.get_all("Leave Application",
|
||||
filters={
|
||||
"employee": employee,
|
||||
"leave_type": leave_type,
|
||||
"from_date": ("<=", from_date),
|
||||
"to_date": (">=", to_date),
|
||||
"status": "Open"
|
||||
}, fieldname=['SUM(total_leave_days)']) or flt(0)
|
||||
},
|
||||
or_filters={
|
||||
"from_date": ["between", (from_date, to_date)],
|
||||
"to_date": ["between", (from_date, to_date)]
|
||||
}, fields=['SUM(total_leave_days) as leaves'])[0]
|
||||
return leaves['leaves'] if leaves['leaves'] else 0.0
|
||||
|
||||
def get_remaining_leaves(allocation, leaves_taken, date, expiry):
|
||||
''' Returns minimum leaves remaining after comparing with remaining days for allocation expiry '''
|
||||
|
@ -5,6 +5,12 @@ from frappe import _
|
||||
|
||||
def get_data():
|
||||
return {
|
||||
'fieldname': 'leave_application',
|
||||
'transactions': [
|
||||
{
|
||||
'items': ['Attendance']
|
||||
}
|
||||
],
|
||||
'reports': [
|
||||
{
|
||||
'label': _('Reports'),
|
||||
|
@ -72,7 +72,7 @@ class TestLeaveApplication(unittest.TestCase):
|
||||
application.to_date = "2013-01-05"
|
||||
return application
|
||||
|
||||
def test_attendance_creation(self):
|
||||
def test_overwrite_attendance(self):
|
||||
'''check attendance is automatically created on leave approval'''
|
||||
make_allocation_record()
|
||||
application = self.get_application(_test_records[0])
|
||||
@ -82,7 +82,8 @@ class TestLeaveApplication(unittest.TestCase):
|
||||
application.insert()
|
||||
application.submit()
|
||||
|
||||
attendance = frappe.get_all('Attendance', ['name', 'status', 'attendance_date'], dict(leave_application = application.name))
|
||||
attendance = frappe.get_all('Attendance', ['name', 'status', 'attendance_date'],
|
||||
dict(attendance_date=('between', ['2018-01-01', '2018-01-03']), docstatus=("!=", 2)))
|
||||
|
||||
# attendance created for all 3 days
|
||||
self.assertEqual(len(attendance), 3)
|
||||
@ -95,20 +96,6 @@ class TestLeaveApplication(unittest.TestCase):
|
||||
for d in ('2018-01-01', '2018-01-02', '2018-01-03'):
|
||||
self.assertTrue(getdate(d) in dates)
|
||||
|
||||
def test_overwrite_attendance(self):
|
||||
# employee marked as absent
|
||||
doc = frappe.new_doc("Attendance")
|
||||
doc.employee = '_T-Employee-00001'
|
||||
doc.attendance_date = '2018-01-01'
|
||||
doc.company = '_Test Company'
|
||||
doc.status = 'Absent'
|
||||
doc.flags.ignore_validate = True
|
||||
doc.insert(ignore_permissions=True)
|
||||
doc.submit()
|
||||
|
||||
# now check if the status has been updated
|
||||
self.test_attendance_creation()
|
||||
|
||||
def test_block_list(self):
|
||||
self._clear_roles()
|
||||
|
||||
|
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
||||
import frappe, erpnext
|
||||
import datetime, math
|
||||
|
||||
from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words, getdate
|
||||
from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words
|
||||
from frappe.model.naming import make_autoname
|
||||
|
||||
from frappe import msgprint, _
|
||||
|
@ -75,7 +75,7 @@ def get_data(filters):
|
||||
|
||||
leave_approvers = department_approver_map.get(employee.department_name, []).append(employee.leave_approver)
|
||||
|
||||
if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) \
|
||||
if (leave_approvers and len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) \
|
||||
or ("HR Manager" in frappe.get_roles(user)):
|
||||
row = frappe._dict({
|
||||
'employee': employee.name,
|
||||
@ -111,10 +111,10 @@ def get_conditions(filters):
|
||||
def get_department_leave_approver_map(department=None):
|
||||
conditions=''
|
||||
if department:
|
||||
conditions='and department_name = %(department)s or parent_department = %(department)s'%{'department': department}
|
||||
conditions="and (department_name = '%(department)s' or parent_department = '%(department)s')"%{'department': department}
|
||||
|
||||
# get current department and all its child
|
||||
department_list = frappe.db.sql_list(''' SELECT name FROM `tabDepartment` WHERE disabled=0 {0}'''.format(conditions)) #nosec
|
||||
department_list = frappe.db.sql_list(""" SELECT name FROM `tabDepartment` WHERE disabled=0 {0}""".format(conditions)) #nosec
|
||||
|
||||
# retrieve approvers list from current department and from its subsequent child departments
|
||||
approver_list = frappe.get_all('Department Approver', filters={
|
||||
|
@ -20,6 +20,12 @@ frappe.ui.form.on('Maintenance Schedule', {
|
||||
frm.set_value({transaction_date: frappe.datetime.get_today()});
|
||||
}
|
||||
},
|
||||
refresh: function(frm) {
|
||||
setTimeout(() => {
|
||||
frm.toggle_display('generate_schedule', !(frm.is_new()));
|
||||
frm.toggle_display('schedule', !(frm.is_new()));
|
||||
},10);
|
||||
},
|
||||
customer: function(frm) {
|
||||
erpnext.utils.get_party_details(frm)
|
||||
},
|
||||
|
@ -150,7 +150,7 @@ class MaintenanceSchedule(TransactionBase):
|
||||
elif not d.no_of_visits:
|
||||
throw(_("Please mention no of visits required"))
|
||||
elif not d.sales_person:
|
||||
throw(_("Please select Incharge Person's name"))
|
||||
throw(_("Please select a Sales Person for item: {0}".format(d.item_name)))
|
||||
|
||||
if getdate(d.start_date) >= getdate(d.end_date):
|
||||
throw(_("Start date should be less than end date for Item {0}").format(d.item_code))
|
||||
|
@ -39,9 +39,11 @@ class BOM(WebsiteGenerator):
|
||||
names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)]
|
||||
|
||||
# split by (-) if cancelled
|
||||
names = [cint(name.split('-')[-1]) for name in names]
|
||||
|
||||
idx = max(names) + 1
|
||||
if names:
|
||||
names = [cint(name.split('-')[-1]) for name in names]
|
||||
idx = max(names) + 1
|
||||
else:
|
||||
idx = 1
|
||||
else:
|
||||
idx = 1
|
||||
|
||||
@ -290,7 +292,8 @@ class BOM(WebsiteGenerator):
|
||||
return valuation_rate
|
||||
|
||||
def manage_default_bom(self):
|
||||
""" Uncheck others if current one is selected as default,
|
||||
""" Uncheck others if current one is selected as default or
|
||||
check the current one as default if it the only bom for the selected item,
|
||||
update default bom in item master
|
||||
"""
|
||||
if self.is_default and self.is_active:
|
||||
@ -299,6 +302,9 @@ class BOM(WebsiteGenerator):
|
||||
item = frappe.get_doc("Item", self.item)
|
||||
if item.default_bom != self.name:
|
||||
frappe.db.set_value('Item', self.item, 'default_bom', self.name)
|
||||
elif not frappe.db.exists(dict(doctype='BOM', docstatus=1, item=self.item, is_default=1)) \
|
||||
and self.is_active:
|
||||
frappe.db.set(self, "is_default", 1)
|
||||
else:
|
||||
frappe.db.set(self, "is_default", 0)
|
||||
item = frappe.get_doc("Item", self.item)
|
||||
|
@ -103,7 +103,7 @@ frappe.ui.form.on('Production Plan', {
|
||||
${__('Reserved Qty for Production: Raw materials quantity to make manufacturing items.')}
|
||||
</li>
|
||||
<li>
|
||||
${__('Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.')}
|
||||
${__('Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.')}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -622,7 +622,7 @@ def get_items_for_material_requests(doc, ignore_existing_ordered_qty=None):
|
||||
for data in po_items:
|
||||
planned_qty = data.get('required_qty') or data.get('planned_qty')
|
||||
ignore_existing_ordered_qty = data.get('ignore_existing_ordered_qty') or ignore_existing_ordered_qty
|
||||
warehouse = data.get("warehouse") or warehouse
|
||||
warehouse = warehouse or data.get("warehouse")
|
||||
|
||||
item_details = {}
|
||||
if data.get("bom") or data.get("bom_no"):
|
||||
|
@ -11,9 +11,11 @@ from erpnext.manufacturing.doctype.production_plan.production_plan import get_sa
|
||||
from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import create_stock_reconciliation
|
||||
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
|
||||
from erpnext.manufacturing.doctype.production_plan.production_plan import get_items_for_material_requests
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
|
||||
class TestProductionPlan(unittest.TestCase):
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
for item in ['Test Production Item 1', 'Subassembly Item 1',
|
||||
'Raw Material Item 1', 'Raw Material Item 2']:
|
||||
create_item(item, valuation_rate=100)
|
||||
|
@ -17,11 +17,11 @@ from erpnext.manufacturing.doctype.production_plan.test_production_plan import m
|
||||
|
||||
class TestWorkOrder(unittest.TestCase):
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
self.warehouse = '_Test Warehouse 2 - _TC'
|
||||
self.item = '_Test Item'
|
||||
|
||||
def check_planned_qty(self):
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
planned0 = frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
|
||||
"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty") or 0
|
||||
|
@ -342,7 +342,7 @@ frappe.ui.form.on("Work Order", {
|
||||
},
|
||||
|
||||
project: function(frm) {
|
||||
if(!erpnext.in_production_item_onchange) {
|
||||
if(!erpnext.in_production_item_onchange && !frm.doc.bom_no) {
|
||||
frm.trigger("production_item");
|
||||
}
|
||||
},
|
||||
|
@ -11,6 +11,9 @@ frappe.ui.form.on("Project", {
|
||||
// add a new row and set the project
|
||||
let time_log = frappe.model.get_new_doc('Timesheet Detail');
|
||||
time_log.project = frm.doc.name;
|
||||
time_log.parent = new_doc.name;
|
||||
time_log.parentfield = 'time_logs';
|
||||
time_log.parenttype = 'Timesheet';
|
||||
new_doc.time_logs = [time_log];
|
||||
|
||||
frappe.ui.form.make_quick_entry(doctype, null, null, new_doc);
|
||||
|
@ -353,17 +353,35 @@ def get_events(start, end, filters=None):
|
||||
def get_timesheets_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
|
||||
user = frappe.session.user
|
||||
# find customer name from contact.
|
||||
customer = frappe.db.sql('''SELECT dl.link_name FROM `tabContact` AS c inner join \
|
||||
`tabDynamic Link` AS dl ON c.first_name=dl.link_name WHERE c.email_id=%s''',user)
|
||||
customer = ''
|
||||
timesheets = []
|
||||
|
||||
contact = frappe.db.exists('Contact', {'user': user})
|
||||
if contact:
|
||||
# find customer
|
||||
contact = frappe.get_doc('Contact', contact)
|
||||
customer = contact.get_link_for('Customer')
|
||||
|
||||
if customer:
|
||||
# find list of Sales Invoice for made for customer.
|
||||
sales_invoice = frappe.db.sql('''SELECT name FROM `tabSales Invoice` WHERE customer = %s''',customer)
|
||||
sales_invoices = [d.name for d in frappe.get_all('Sales Invoice', filters={'customer': customer})] or [None]
|
||||
projects = [d.name for d in frappe.get_all('Project', filters={'customer': customer})]
|
||||
# Return timesheet related data to web portal.
|
||||
return frappe. db.sql('''SELECT ts.name, tsd.activity_type, ts.status, ts.total_billable_hours, \
|
||||
tsd.sales_invoice, tsd.project FROM `tabTimesheet` AS ts inner join `tabTimesheet Detail` \
|
||||
AS tsd ON tsd.parent = ts.name where tsd.sales_invoice IN %s order by\
|
||||
end_date asc limit {0} , {1}'''.format(limit_start, limit_page_length), [sales_invoice], as_dict = True)
|
||||
timesheets = frappe.db.sql('''
|
||||
SELECT
|
||||
ts.name, tsd.activity_type, ts.status, ts.total_billable_hours,
|
||||
COALESCE(ts.sales_invoice, tsd.sales_invoice) AS sales_invoice, tsd.project
|
||||
FROM `tabTimesheet` ts, `tabTimesheet Detail` tsd
|
||||
WHERE tsd.parent = ts.name AND
|
||||
(
|
||||
ts.sales_invoice IN %(sales_invoices)s OR
|
||||
tsd.sales_invoice IN %(sales_invoices)s OR
|
||||
tsd.project IN %(projects)s
|
||||
)
|
||||
ORDER BY `end_date` ASC
|
||||
LIMIT {0}, {1}
|
||||
'''.format(limit_start, limit_page_length), dict(sales_invoices=sales_invoices, projects=projects), as_dict=True) #nosec
|
||||
|
||||
return timesheets
|
||||
|
||||
def get_list_context(context=None):
|
||||
return {
|
||||
|
@ -150,7 +150,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
||||
|
||||
// delivery note
|
||||
if(flt(doc.per_delivered, 6) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && allow_delivery) {
|
||||
this.frm.add_custom_button(__('Delivery'), () => this.make_delivery_note_based_on_delivery_date(), __('Create'));
|
||||
this.frm.add_custom_button(__('Delivery Note'), () => this.make_delivery_note_based_on_delivery_date(), __('Create'));
|
||||
this.frm.add_custom_button(__('Work Order'), () => this.make_work_order(), __('Create'));
|
||||
}
|
||||
|
||||
|
@ -31,8 +31,8 @@
|
||||
"contact_phone",
|
||||
"contact_mobile",
|
||||
"contact_email",
|
||||
"company_address_display",
|
||||
"company_address",
|
||||
"company_address_display",
|
||||
"col_break46",
|
||||
"shipping_address_name",
|
||||
"shipping_address",
|
||||
@ -342,12 +342,13 @@
|
||||
{
|
||||
"fieldname": "company_address_display",
|
||||
"fieldtype": "Small Text",
|
||||
"label": "Company Address",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "company_address",
|
||||
"fieldtype": "Link",
|
||||
"label": "Company Address",
|
||||
"label": "Company Address Name",
|
||||
"options": "Address"
|
||||
},
|
||||
{
|
||||
@ -1193,7 +1194,7 @@
|
||||
"icon": "fa fa-file-text",
|
||||
"idx": 105,
|
||||
"is_submittable": 1,
|
||||
"modified": "2019-10-22 14:26:42.767189",
|
||||
"modified": "2019-10-23 14:26:42.767189",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Selling",
|
||||
"name": "Sales Order",
|
||||
|
@ -33,6 +33,10 @@ class Company(NestedSet):
|
||||
return exists
|
||||
|
||||
def validate(self):
|
||||
self.update_default_account = False
|
||||
if self.is_new():
|
||||
self.update_default_account = True
|
||||
|
||||
self.validate_abbr()
|
||||
self.validate_default_accounts()
|
||||
self.validate_currency()
|
||||
@ -203,8 +207,8 @@ class Company(NestedSet):
|
||||
"default_expense_account": "Cost of Goods Sold"
|
||||
})
|
||||
|
||||
for default_account in default_accounts:
|
||||
if self.is_new() or frappe.flags.in_test or frappe.flags.in_demo:
|
||||
if self.update_default_account:
|
||||
for default_account in default_accounts:
|
||||
self._set_default_account(default_account, default_accounts.get(default_account))
|
||||
|
||||
if not self.default_income_account:
|
||||
|
@ -22,7 +22,7 @@ class TestCompany(unittest.TestCase):
|
||||
company.create_chart_of_accounts_based_on = "Existing Company"
|
||||
company.existing_company = "_Test Company"
|
||||
company.save()
|
||||
|
||||
|
||||
expected_results = {
|
||||
"Debtors - CFEC": {
|
||||
"account_type": "Receivable",
|
||||
@ -37,7 +37,7 @@ class TestCompany(unittest.TestCase):
|
||||
"parent_account": "Cash In Hand - CFEC"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for account, acc_property in expected_results.items():
|
||||
acc = frappe.get_doc("Account", account)
|
||||
for prop, val in acc_property.items():
|
||||
@ -50,14 +50,14 @@ class TestCompany(unittest.TestCase):
|
||||
countries = ["India", "Brazil", "United Arab Emirates", "Canada", "Germany", "France",
|
||||
"Guatemala", "Indonesia", "Italy", "Mexico", "Nicaragua", "Netherlands", "Singapore",
|
||||
"Brazil", "Argentina", "Hungary", "Taiwan"]
|
||||
|
||||
|
||||
for country in countries:
|
||||
templates = get_charts_for_country(country)
|
||||
if len(templates) != 1 and "Standard" in templates:
|
||||
templates.remove("Standard")
|
||||
|
||||
|
||||
self.assertTrue(templates)
|
||||
|
||||
|
||||
for template in templates:
|
||||
try:
|
||||
company = frappe.new_doc("Company")
|
||||
@ -67,11 +67,11 @@ class TestCompany(unittest.TestCase):
|
||||
company.create_chart_of_accounts_based_on = "Standard Template"
|
||||
company.chart_of_accounts = template
|
||||
company.save()
|
||||
|
||||
account_types = ["Cost of Goods Sold", "Depreciation",
|
||||
"Expenses Included In Valuation", "Fixed Asset", "Payable", "Receivable",
|
||||
|
||||
account_types = ["Cost of Goods Sold", "Depreciation",
|
||||
"Expenses Included In Valuation", "Fixed Asset", "Payable", "Receivable",
|
||||
"Stock Adjustment", "Stock Received But Not Billed", "Bank", "Cash", "Stock"]
|
||||
|
||||
|
||||
for account_type in account_types:
|
||||
filters = {
|
||||
"company": template,
|
||||
|
@ -62,5 +62,16 @@
|
||||
"domain": "Manufacturing",
|
||||
"chart_of_accounts": "Standard",
|
||||
"default_holiday_list": "_Test Holiday List"
|
||||
},
|
||||
{
|
||||
"abbr": "TCP1",
|
||||
"company_name": "_Test Company with perpetual inventory",
|
||||
"country": "India",
|
||||
"default_currency": "INR",
|
||||
"doctype": "Company",
|
||||
"domain": "Manufacturing",
|
||||
"chart_of_accounts": "Standard",
|
||||
"enable_perpetual_inventory": 1,
|
||||
"default_holiday_list": "_Test Holiday List"
|
||||
}
|
||||
]
|
||||
|
@ -21,7 +21,7 @@ def get_warehouse_account_map(company=None):
|
||||
filters['company'] = company
|
||||
|
||||
for d in frappe.get_all('Warehouse',
|
||||
fields = ["name", "account", "parent_warehouse", "company"],
|
||||
fields = ["name", "account", "parent_warehouse", "company", "is_group"],
|
||||
filters = filters,
|
||||
order_by="lft, rgt"):
|
||||
if not d.account:
|
||||
|
@ -8,10 +8,13 @@ import unittest
|
||||
|
||||
from erpnext.stock.doctype.batch.batch import get_batch_qty, UnableToSelectBatchError, get_batch_no
|
||||
from frappe.utils import cint
|
||||
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
|
||||
class TestBatch(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_item_has_batch_enabled(self):
|
||||
self.assertRaises(ValidationError, frappe.get_doc({
|
||||
"doctype": "Batch",
|
||||
|
@ -6,9 +6,9 @@ frappe.listview_settings['Delivery Note'] = {
|
||||
return [__("Return"), "darkgrey", "is_return,=,Yes"];
|
||||
} else if (doc.status === "Closed") {
|
||||
return [__("Closed"), "green", "status,=,Closed"];
|
||||
} else if (doc.grand_total !== 0 && flt(doc.per_billed, 2) < 100) {
|
||||
} else if (flt(doc.per_billed, 2) < 100) {
|
||||
return [__("To Bill"), "orange", "per_billed,<,100"];
|
||||
} else if (doc.grand_total === 0 || flt(doc.per_billed, 2) == 100) {
|
||||
} else if (flt(doc.per_billed, 2) == 100) {
|
||||
return [__("Completed"), "green", "per_billed,=,100"];
|
||||
}
|
||||
},
|
||||
|
@ -20,18 +20,11 @@ from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation \
|
||||
import create_stock_reconciliation, set_valuation_method
|
||||
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order, create_dn_against_so
|
||||
from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
|
||||
from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse
|
||||
|
||||
class TestDeliveryNote(unittest.TestCase):
|
||||
def tearDown(self):
|
||||
target_warehouse = "_Test Warehouse 1 - _TC"
|
||||
company = "_Test Company"
|
||||
if not frappe.db.exists("Account", target_warehouse):
|
||||
parent_account = frappe.db.get_value('Account',
|
||||
{'company': company, 'is_group':1, 'account_type': 'Stock'},'name')
|
||||
|
||||
account = create_account(account_name="_Test Warehouse 1", \
|
||||
account_type="Stock", parent_account= parent_account, company=company)
|
||||
frappe.db.set_value('Warehouse', target_warehouse, 'account', account)
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_over_billing_against_dn(self):
|
||||
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
|
||||
@ -68,17 +61,16 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
self.assertFalse(get_gl_entries("Delivery Note", dn.name))
|
||||
|
||||
def test_delivery_note_gl_entry(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
set_valuation_method("_Test Item", "FIFO")
|
||||
|
||||
make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
|
||||
make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
|
||||
|
||||
stock_in_hand_account = get_inventory_account('_Test Company')
|
||||
stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
|
||||
prev_bal = get_balance_on(stock_in_hand_account)
|
||||
|
||||
dn = create_delivery_note()
|
||||
dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1")
|
||||
|
||||
gl_entries = get_gl_entries("Delivery Note", dn.name)
|
||||
self.assertTrue(gl_entries)
|
||||
@ -88,7 +80,7 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
expected_values = {
|
||||
stock_in_hand_account: [0.0, stock_value_difference],
|
||||
"Cost of Goods Sold - _TC": [stock_value_difference, 0.0]
|
||||
"Cost of Goods Sold - TCP1": [stock_value_difference, 0.0]
|
||||
}
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
|
||||
@ -98,7 +90,7 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
self.assertEqual(bal, prev_bal - stock_value_difference)
|
||||
|
||||
# back dated incoming entry
|
||||
make_stock_entry(posting_date=add_days(nowdate(), -2), target="_Test Warehouse - _TC",
|
||||
make_stock_entry(posting_date=add_days(nowdate(), -2), target="Stores - TCP1",
|
||||
qty=5, basic_rate=100)
|
||||
|
||||
gl_entries = get_gl_entries("Delivery Note", dn.name)
|
||||
@ -109,27 +101,25 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
expected_values = {
|
||||
stock_in_hand_account: [0.0, stock_value_difference],
|
||||
"Cost of Goods Sold - _TC": [stock_value_difference, 0.0]
|
||||
"Cost of Goods Sold - TCP1": [stock_value_difference, 0.0]
|
||||
}
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
|
||||
|
||||
dn.cancel()
|
||||
self.assertFalse(get_gl_entries("Delivery Note", dn.name))
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_delivery_note_gl_entry_packing_item(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=100)
|
||||
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=10, basic_rate=100)
|
||||
make_stock_entry(item_code="_Test Item Home Desktop 100",
|
||||
target="_Test Warehouse - _TC", qty=10, basic_rate=100)
|
||||
target="Stores - TCP1", qty=10, basic_rate=100)
|
||||
|
||||
stock_in_hand_account = get_inventory_account('_Test Company')
|
||||
stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
|
||||
prev_bal = get_balance_on(stock_in_hand_account)
|
||||
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item")
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item", company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1")
|
||||
|
||||
stock_value_diff_rm1 = abs(frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Delivery Note", "voucher_no": dn.name, "item_code": "_Test Item"},
|
||||
@ -146,7 +136,7 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
expected_values = {
|
||||
stock_in_hand_account: [0.0, stock_value_diff],
|
||||
"Cost of Goods Sold - _TC": [stock_value_diff, 0.0]
|
||||
"Cost of Goods Sold - TCP1": [stock_value_diff, 0.0]
|
||||
}
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
|
||||
@ -158,8 +148,6 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
dn.cancel()
|
||||
self.assertFalse(get_gl_entries("Delivery Note", dn.name))
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_serialized(self):
|
||||
se = make_serialized_item()
|
||||
serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
|
||||
@ -218,16 +206,16 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
self.assertEqual(cstr(serial_no.get(field)), value)
|
||||
|
||||
def test_sales_return_for_non_bundled_items(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100)
|
||||
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100)
|
||||
|
||||
actual_qty_0 = get_qty_after_transaction()
|
||||
actual_qty_0 = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
|
||||
dn = create_delivery_note(qty=5, rate=500)
|
||||
dn = create_delivery_note(qty=5, rate=500, warehouse="Stores - TCP1", company=company,
|
||||
expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
actual_qty_1 = get_qty_after_transaction()
|
||||
actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty_0 - 5, actual_qty_1)
|
||||
|
||||
# outgoing_rate
|
||||
@ -235,9 +223,10 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
"voucher_no": dn.name}, "stock_value_difference") / 5
|
||||
|
||||
# return entry
|
||||
dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500)
|
||||
dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500,
|
||||
company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
actual_qty_2 = get_qty_after_transaction()
|
||||
actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
|
||||
self.assertEqual(actual_qty_1 + 2, actual_qty_2)
|
||||
|
||||
@ -246,27 +235,29 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
["incoming_rate", "stock_value_difference"])
|
||||
|
||||
self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
|
||||
stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
|
||||
stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse)
|
||||
|
||||
gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
|
||||
"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
|
||||
|
||||
self.assertEqual(gle_warehouse_amount, stock_value_difference)
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_return_single_item_from_bundled_items(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100)
|
||||
create_stock_reconciliation(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC",
|
||||
qty=50, rate=100)
|
||||
create_stock_reconciliation(item_code="_Test Item",
|
||||
warehouse="Stores - TCP1", qty=50, rate=100,
|
||||
company=company, expense_account = "Stock Adjustment - TCP1")
|
||||
create_stock_reconciliation(item_code="_Test Item Home Desktop 100",
|
||||
warehouse="Stores - TCP1", qty=50, rate=100,
|
||||
company=company, expense_account = "Stock Adjustment - TCP1")
|
||||
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item", qty=5, rate=500)
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item", qty=5, rate=500,
|
||||
company=company, warehouse="Stores - TCP1",
|
||||
expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
# Qty after delivery
|
||||
actual_qty_1 = get_qty_after_transaction()
|
||||
actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty_1, 25)
|
||||
|
||||
# outgoing_rate
|
||||
@ -274,10 +265,12 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
"voucher_no": dn.name, "item_code": "_Test Item"}, "stock_value_difference") / 25
|
||||
|
||||
# return 'test item' from packed items
|
||||
dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-10, rate=500)
|
||||
dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-10, rate=500,
|
||||
company=company, warehouse="Stores - TCP1",
|
||||
expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
# qty after return
|
||||
actual_qty_2 = get_qty_after_transaction()
|
||||
actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty_2, 35)
|
||||
|
||||
# Check incoming rate for return entry
|
||||
@ -286,7 +279,7 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
["incoming_rate", "stock_value_difference"])
|
||||
|
||||
self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
|
||||
stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
|
||||
stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse)
|
||||
|
||||
# Check gl entry for warehouse
|
||||
gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
|
||||
@ -294,33 +287,33 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
self.assertEqual(gle_warehouse_amount, stock_value_difference)
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_return_entire_bundled_items(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
create_stock_reconciliation(item_code="_Test Item",
|
||||
target="_Test Warehouse - _TC", qty=50, rate=100)
|
||||
warehouse="Stores - TCP1", qty=50, rate=100,
|
||||
company=company, expense_account = "Stock Adjustment - TCP1")
|
||||
create_stock_reconciliation(item_code="_Test Item Home Desktop 100",
|
||||
target="_Test Warehouse - _TC", qty=50, rate=100)
|
||||
warehouse="Stores - TCP1", qty=50, rate=100,
|
||||
company=company, expense_account = "Stock Adjustment - TCP1")
|
||||
|
||||
actual_qty = get_qty_after_transaction()
|
||||
actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty, 50)
|
||||
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item",
|
||||
qty=5, rate=500)
|
||||
qty=5, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
# qty after return
|
||||
actual_qty = get_qty_after_transaction()
|
||||
actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty, 25)
|
||||
|
||||
# return bundled item
|
||||
dn1 = create_delivery_note(item_code='_Test Product Bundle Item', is_return=1,
|
||||
return_against=dn.name, qty=-2, rate=500)
|
||||
return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
||||
|
||||
# qty after return
|
||||
actual_qty = get_qty_after_transaction()
|
||||
actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty, 35)
|
||||
|
||||
# Check incoming rate for return entry
|
||||
@ -337,8 +330,6 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
self.assertEqual(gle_warehouse_amount, 1400)
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_return_for_serialized_items(self):
|
||||
se = make_serialized_item()
|
||||
serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
|
||||
@ -375,56 +366,44 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
})
|
||||
|
||||
def test_delivery_of_bundled_items_to_target_warehouse(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
set_valuation_method("_Test Item", "FIFO")
|
||||
set_valuation_method("_Test Item Home Desktop 100", "FIFO")
|
||||
|
||||
for warehouse in ("_Test Warehouse - _TC", "_Test Warehouse 1 - _TC"):
|
||||
create_stock_reconciliation(item_code="_Test Item", target=warehouse,
|
||||
qty=100, rate=100)
|
||||
create_stock_reconciliation(item_code="_Test Item Home Desktop 100",
|
||||
target=warehouse, qty=100, rate=100)
|
||||
target_warehouse=get_warehouse(company=company, abbr="TCP1",
|
||||
warehouse_name="_Test Customer Warehouse").name
|
||||
|
||||
for warehouse in ("Stores - TCP1", target_warehouse):
|
||||
create_stock_reconciliation(item_code="_Test Item", warehouse=warehouse, company = company,
|
||||
expense_account = "Stock Adjustment - TCP1", qty=500, rate=100)
|
||||
create_stock_reconciliation(item_code="_Test Item Home Desktop 100", company = company,
|
||||
expense_account = "Stock Adjustment - TCP1", warehouse=warehouse, qty=500, rate=100)
|
||||
|
||||
opening_qty_test_warehouse_1 = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC")
|
||||
dn = create_delivery_note(item_code="_Test Product Bundle Item",
|
||||
qty=5, rate=500, target_warehouse="_Test Warehouse 1 - _TC", do_not_submit=True)
|
||||
company='_Test Company with perpetual inventory', cost_center = 'Main - TCP1',
|
||||
expense_account = "Cost of Goods Sold - TCP1", do_not_submit=True, qty=5, rate=500,
|
||||
warehouse="Stores - TCP1", target_warehouse=target_warehouse)
|
||||
|
||||
dn.submit()
|
||||
|
||||
# qty after delivery
|
||||
actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse - _TC")
|
||||
self.assertEqual(actual_qty, 75)
|
||||
actual_qty_at_source = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||
self.assertEqual(actual_qty_at_source, 475)
|
||||
|
||||
actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC")
|
||||
self.assertEqual(actual_qty, opening_qty_test_warehouse_1 + 25)
|
||||
actual_qty_at_target = get_qty_after_transaction(warehouse=target_warehouse)
|
||||
self.assertEqual(actual_qty_at_target, 525)
|
||||
|
||||
# stock value diff for source warehouse
|
||||
# for "_Test Item"
|
||||
# stock value diff for source warehouse for "_Test Item"
|
||||
stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Delivery Note", "voucher_no": dn.name,
|
||||
"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
|
||||
"item_code": "_Test Item", "warehouse": "Stores - TCP1"},
|
||||
"stock_value_difference")
|
||||
|
||||
# stock value diff for target warehouse
|
||||
stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Delivery Note", "voucher_no": dn.name,
|
||||
"item_code": "_Test Item", "warehouse": "_Test Warehouse 1 - _TC"},
|
||||
"stock_value_difference")
|
||||
|
||||
self.assertEqual(abs(stock_value_difference), stock_value_difference1)
|
||||
|
||||
# for "_Test Item Home Desktop 100"
|
||||
stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Delivery Note", "voucher_no": dn.name,
|
||||
"item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse - _TC"},
|
||||
"stock_value_difference")
|
||||
|
||||
# stock value diff for target warehouse
|
||||
stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Delivery Note", "voucher_no": dn.name,
|
||||
"item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse 1 - _TC"},
|
||||
"item_code": "_Test Item", "warehouse": target_warehouse},
|
||||
"stock_value_difference")
|
||||
|
||||
self.assertEqual(abs(stock_value_difference), stock_value_difference1)
|
||||
@ -435,21 +414,20 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
|
||||
stock_value_difference = abs(frappe.db.sql("""select sum(stock_value_difference)
|
||||
from `tabStock Ledger Entry` where voucher_type='Delivery Note' and voucher_no=%s
|
||||
and warehouse='_Test Warehouse - _TC'""", dn.name)[0][0])
|
||||
and warehouse='Stores - TCP1'""", dn.name)[0][0])
|
||||
|
||||
expected_values = {
|
||||
"Stock In Hand - _TC": [0.0, stock_value_difference],
|
||||
"_Test Warehouse 1 - _TC": [stock_value_difference, 0.0]
|
||||
"Stock In Hand - TCP1": [0.0, stock_value_difference],
|
||||
target_warehouse: [stock_value_difference, 0.0]
|
||||
}
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_closed_delivery_note(self):
|
||||
from erpnext.stock.doctype.delivery_note.delivery_note import update_delivery_note_status
|
||||
|
||||
dn = create_delivery_note(do_not_submit=True)
|
||||
dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1", do_not_submit=True)
|
||||
|
||||
dn.submit()
|
||||
|
||||
update_delivery_note_status(dn.name, "Closed")
|
||||
@ -574,24 +552,23 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
|
||||
accounts_settings.allow_cost_center_in_entry_of_bs_account = 1
|
||||
accounts_settings.save()
|
||||
cost_center = "_Test Cost Center for BS Account - _TC"
|
||||
create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
|
||||
cost_center = "_Test Cost Center for BS Account - TCP1"
|
||||
create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company with perpetual inventory")
|
||||
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
set_valuation_method("_Test Item", "FIFO")
|
||||
|
||||
make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
|
||||
make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
|
||||
|
||||
stock_in_hand_account = get_inventory_account('_Test Company')
|
||||
dn = create_delivery_note(cost_center=cost_center)
|
||||
stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
|
||||
dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', expense_account = "Cost of Goods Sold - TCP1", cost_center=cost_center)
|
||||
|
||||
gl_entries = get_gl_entries("Delivery Note", dn.name)
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
expected_values = {
|
||||
"Cost of Goods Sold - _TC": {
|
||||
"Cost of Goods Sold - TCP1": {
|
||||
"cost_center": cost_center
|
||||
},
|
||||
stock_in_hand_account: {
|
||||
@ -600,8 +577,6 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
}
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
accounts_settings.allow_cost_center_in_entry_of_bs_account = 0
|
||||
accounts_settings.save()
|
||||
|
||||
@ -609,23 +584,22 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
|
||||
accounts_settings.allow_cost_center_in_entry_of_bs_account = 0
|
||||
accounts_settings.save()
|
||||
cost_center = "_Test Cost Center - _TC"
|
||||
cost_center = "Main - TCP1"
|
||||
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
set_valuation_method("_Test Item", "FIFO")
|
||||
|
||||
make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
|
||||
make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
|
||||
|
||||
stock_in_hand_account = get_inventory_account('_Test Company')
|
||||
dn = create_delivery_note()
|
||||
stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
|
||||
dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1")
|
||||
|
||||
gl_entries = get_gl_entries("Delivery Note", dn.name)
|
||||
|
||||
self.assertTrue(gl_entries)
|
||||
expected_values = {
|
||||
"Cost of Goods Sold - _TC": {
|
||||
"Cost of Goods Sold - TCP1": {
|
||||
"cost_center": cost_center
|
||||
},
|
||||
stock_in_hand_account: {
|
||||
@ -635,8 +609,6 @@ class TestDeliveryNote(unittest.TestCase):
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
|
||||
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
def test_make_sales_invoice_from_dn_for_returned_qty(self):
|
||||
from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
|
||||
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
|
||||
@ -702,7 +674,7 @@ def create_delivery_note(**args):
|
||||
"rate": args.rate or 100,
|
||||
"conversion_factor": 1.0,
|
||||
"allow_zero_valuation_rate": args.allow_zero_valuation_rate or 1,
|
||||
"expense_account": "Cost of Goods Sold - _TC",
|
||||
"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
|
||||
"cost_center": args.cost_center or "_Test Cost Center - _TC",
|
||||
"serial_no": args.serial_no,
|
||||
"target_warehouse": args.target_warehouse
|
||||
|
@ -12,9 +12,11 @@ from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import
|
||||
from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt, make_rm_stock_entry
|
||||
import unittest
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
|
||||
class TestItemAlternative(unittest.TestCase):
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
make_items()
|
||||
|
||||
def test_alternative_item_for_subcontract_rm(self):
|
||||
|
@ -14,15 +14,15 @@ from erpnext.accounts.doctype.account.test_account import get_inventory_account
|
||||
class TestLandedCostVoucher(unittest.TestCase):
|
||||
def test_landed_cost_voucher(self):
|
||||
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
||||
set_perpetual_inventory(1)
|
||||
pr = frappe.copy_doc(pr_test_records[0])
|
||||
pr.submit()
|
||||
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True, get_taxes_and_charges = True)
|
||||
|
||||
|
||||
last_sle = frappe.db.get_value("Stock Ledger Entry", {
|
||||
"voucher_type": pr.doctype,
|
||||
"voucher_no": pr.name,
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC"
|
||||
"warehouse": "Stores - TCP1"
|
||||
},
|
||||
fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
|
||||
|
||||
@ -35,7 +35,7 @@ class TestLandedCostVoucher(unittest.TestCase):
|
||||
"voucher_type": pr.doctype,
|
||||
"voucher_no": pr.name,
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC"
|
||||
"warehouse": "Stores - TCP1"
|
||||
},
|
||||
fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
|
||||
|
||||
@ -48,55 +48,56 @@ class TestLandedCostVoucher(unittest.TestCase):
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
|
||||
fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse)
|
||||
fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse)
|
||||
|
||||
if stock_in_hand_account == fixed_asset_account:
|
||||
expected_values = {
|
||||
stock_in_hand_account: [800.0, 0.0],
|
||||
"Stock Received But Not Billed - _TC": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - _TC": [0.0, 300.0]
|
||||
"Stock Received But Not Billed - TCP1": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - TCP1": [0.0, 300.0]
|
||||
}
|
||||
|
||||
|
||||
else:
|
||||
expected_values = {
|
||||
stock_in_hand_account: [400.0, 0.0],
|
||||
fixed_asset_account: [400.0, 0.0],
|
||||
"Stock Received But Not Billed - _TC": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - _TC": [0.0, 300.0]
|
||||
"Stock Received But Not Billed - TCP1": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - TCP1": [0.0, 300.0]
|
||||
}
|
||||
|
||||
for gle in gl_entries:
|
||||
self.assertEqual(expected_values[gle.account][0], gle.debit)
|
||||
self.assertEqual(expected_values[gle.account][1], gle.credit)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
|
||||
def test_landed_cost_voucher_against_purchase_invoice(self):
|
||||
set_perpetual_inventory(1)
|
||||
|
||||
|
||||
pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
|
||||
posting_time=frappe.utils.nowtime())
|
||||
posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1",
|
||||
company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1",
|
||||
warehouse= "Stores - TCP1", cost_center = "Main - TCP1",
|
||||
expense_account ="_Test Account Cost for Goods Sold - TCP1")
|
||||
|
||||
last_sle = frappe.db.get_value("Stock Ledger Entry", {
|
||||
"voucher_type": pi.doctype,
|
||||
"voucher_no": pi.name,
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC"
|
||||
"warehouse": "Stores - TCP1"
|
||||
},
|
||||
fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
|
||||
|
||||
submit_landed_cost_voucher("Purchase Invoice", pi.name)
|
||||
|
||||
pi_lc_value = frappe.db.get_value("Purchase Invoice Item", {"parent": pi.name},
|
||||
|
||||
pi_lc_value = frappe.db.get_value("Purchase Invoice Item", {"parent": pi.name},
|
||||
"landed_cost_voucher_amount")
|
||||
|
||||
|
||||
self.assertEqual(pi_lc_value, 50.0)
|
||||
|
||||
last_sle_after_landed_cost = frappe.db.get_value("Stock Ledger Entry", {
|
||||
"voucher_type": pi.doctype,
|
||||
"voucher_no": pi.name,
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC"
|
||||
"warehouse": "Stores - TCP1"
|
||||
},
|
||||
fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
|
||||
|
||||
@ -111,21 +112,21 @@ class TestLandedCostVoucher(unittest.TestCase):
|
||||
|
||||
expected_values = {
|
||||
stock_in_hand_account: [300.0, 0.0],
|
||||
"Creditors - _TC": [0.0, 250.0],
|
||||
"Expenses Included In Valuation - _TC": [0.0, 50.0]
|
||||
"Creditors - TCP1": [0.0, 250.0],
|
||||
"Expenses Included In Valuation - TCP1": [0.0, 50.0]
|
||||
}
|
||||
|
||||
for gle in gl_entries:
|
||||
self.assertEqual(expected_values[gle.account][0], gle.debit)
|
||||
self.assertEqual(expected_values[gle.account][1], gle.credit)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_landed_cost_voucher_for_serialized_item(self):
|
||||
set_perpetual_inventory(1)
|
||||
frappe.db.sql("delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')")
|
||||
|
||||
pr = frappe.copy_doc(pr_test_records[0])
|
||||
def test_landed_cost_voucher_for_serialized_item(self):
|
||||
frappe.db.sql("delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')")
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1",
|
||||
supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True,
|
||||
get_taxes_and_charges = True, do_not_submit = True)
|
||||
|
||||
pr.items[0].item_code = "_Test Serialized Item"
|
||||
pr.items[0].serial_no = "SN001\nSN002\nSN003\nSN004\nSN005"
|
||||
pr.submit()
|
||||
@ -138,39 +139,36 @@ class TestLandedCostVoucher(unittest.TestCase):
|
||||
["warehouse", "purchase_rate"], as_dict=1)
|
||||
|
||||
self.assertEqual(serial_no.purchase_rate - serial_no_rate, 5.0)
|
||||
self.assertEqual(serial_no.warehouse, "_Test Warehouse - _TC")
|
||||
self.assertEqual(serial_no.warehouse, "Stores - TCP1")
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_landed_cost_voucher_for_odd_numbers (self):
|
||||
set_perpetual_inventory(1)
|
||||
|
||||
pr = make_purchase_receipt(do_not_save=True)
|
||||
pr.items[0].cost_center = "_Test Company - _TC"
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", do_not_save=True)
|
||||
pr.items[0].cost_center = "Main - TCP1"
|
||||
for x in range(2):
|
||||
pr.append("items", {
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
"cost_center": "_Test Company - _TC",
|
||||
"warehouse": "Stores - TCP1",
|
||||
"cost_center": "Main - TCP1",
|
||||
"qty": 5,
|
||||
"rate": 50
|
||||
})
|
||||
pr.submit()
|
||||
|
||||
lcv = submit_landed_cost_voucher("Purchase Receipt", pr.name, 123.22)
|
||||
|
||||
|
||||
self.assertEqual(lcv.items[0].applicable_charges, 41.07)
|
||||
self.assertEqual(lcv.items[2].applicable_charges, 41.08)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
self.assertEqual(lcv.items[2].applicable_charges, 41.08)
|
||||
|
||||
|
||||
def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges=50):
|
||||
ref_doc = frappe.get_doc(receipt_document_type, receipt_document)
|
||||
|
||||
|
||||
lcv = frappe.new_doc("Landed Cost Voucher")
|
||||
lcv.company = "_Test Company"
|
||||
lcv.distribute_charges_based_on = 'Amount'
|
||||
|
||||
|
||||
lcv.set("purchase_receipts", [{
|
||||
"receipt_document_type": receipt_document_type,
|
||||
"receipt_document": receipt_document,
|
||||
@ -178,7 +176,7 @@ def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges=
|
||||
"posting_date": ref_doc.posting_date,
|
||||
"grand_total": ref_doc.base_grand_total
|
||||
}])
|
||||
|
||||
|
||||
lcv.set("taxes", [{
|
||||
"description": "Insurance Charges",
|
||||
"account": "_Test Account Insurance Charges - _TC",
|
||||
@ -186,13 +184,13 @@ def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges=
|
||||
}])
|
||||
|
||||
lcv.insert()
|
||||
|
||||
|
||||
distribute_landed_cost_on_items(lcv)
|
||||
|
||||
|
||||
lcv.submit()
|
||||
|
||||
return lcv
|
||||
|
||||
|
||||
def distribute_landed_cost_on_items(lcv):
|
||||
based_on = lcv.distribute_charges_based_on.lower()
|
||||
total = sum([flt(d.get(based_on)) for d in lcv.get("items")])
|
||||
|
@ -14,6 +14,7 @@ from erpnext.stock.doctype.item.test_item import make_item
|
||||
from six import iteritems
|
||||
class TestPurchaseReceipt(unittest.TestCase):
|
||||
def setUp(self):
|
||||
set_perpetual_inventory(0)
|
||||
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
||||
|
||||
def test_make_purchase_invoice(self):
|
||||
@ -32,7 +33,6 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
|
||||
def test_purchase_receipt_no_gl_entry(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(0, company)
|
||||
|
||||
existing_bin_stock_value = frappe.db.get_value("Bin", {"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC"}, "stock_value")
|
||||
@ -52,33 +52,29 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
|
||||
|
||||
def test_purchase_receipt_gl_entry(self):
|
||||
pr = frappe.copy_doc(test_records[0])
|
||||
set_perpetual_inventory(1, pr.company)
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True, get_taxes_and_charges = True)
|
||||
self.assertEqual(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1)
|
||||
pr.insert()
|
||||
pr.submit()
|
||||
|
||||
gl_entries = get_gl_entries("Purchase Receipt", pr.name)
|
||||
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
|
||||
fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse)
|
||||
stock_in_hand_account = get_inventory_account(pr.company, pr.items[0].warehouse)
|
||||
fixed_asset_account = get_inventory_account(pr.company, pr.items[1].warehouse)
|
||||
|
||||
if stock_in_hand_account == fixed_asset_account:
|
||||
expected_values = {
|
||||
stock_in_hand_account: [750.0, 0.0],
|
||||
"Stock Received But Not Billed - _TC": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - _TC": [0.0, 250.0]
|
||||
"Stock Received But Not Billed - TCP1": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - TCP1": [0.0, 250.0]
|
||||
}
|
||||
else:
|
||||
expected_values = {
|
||||
stock_in_hand_account: [375.0, 0.0],
|
||||
fixed_asset_account: [375.0, 0.0],
|
||||
"Stock Received But Not Billed - _TC": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - _TC": [0.0, 250.0]
|
||||
"Stock Received But Not Billed - TCP1": [0.0, 500.0],
|
||||
"Expenses Included In Valuation - TCP1": [0.0, 250.0]
|
||||
}
|
||||
|
||||
for gle in gl_entries:
|
||||
self.assertEqual(expected_values[gle.account][0], gle.debit)
|
||||
self.assertEqual(expected_values[gle.account][1], gle.credit)
|
||||
@ -86,8 +82,6 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
pr.cancel()
|
||||
self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
|
||||
|
||||
set_perpetual_inventory(0, pr.company)
|
||||
|
||||
def test_subcontracting(self):
|
||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
|
||||
|
||||
@ -132,11 +126,10 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
pr.get("items")[0].rejected_warehouse)
|
||||
|
||||
def test_purchase_return(self):
|
||||
set_perpetual_inventory()
|
||||
|
||||
pr = make_purchase_receipt()
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1")
|
||||
|
||||
return_pr = make_purchase_receipt(is_return=1, return_against=pr.name, qty=-2)
|
||||
return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", is_return=1, return_against=pr.name, qty=-2)
|
||||
|
||||
# check sle
|
||||
outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
|
||||
@ -153,28 +146,28 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
|
||||
expected_values = {
|
||||
stock_in_hand_account: [0.0, 100.0],
|
||||
"Stock Received But Not Billed - _TC": [100.0, 0.0],
|
||||
"Stock Received But Not Billed - TCP1": [100.0, 0.0],
|
||||
}
|
||||
|
||||
for gle in gl_entries:
|
||||
self.assertEqual(expected_values[gle.account][0], gle.debit)
|
||||
self.assertEqual(expected_values[gle.account][1], gle.credit)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_purchase_return_for_rejected_qty(self):
|
||||
set_perpetual_inventory()
|
||||
from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse
|
||||
|
||||
pr = make_purchase_receipt(received_qty=4, qty=2)
|
||||
rejected_warehouse=get_warehouse(company = "_Test Company with perpetual inventory", abbr = " - TCP1", warehouse_name = "_Test Rejected Warehouse").name
|
||||
print(rejected_warehouse)
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", received_qty=4, qty=2, rejected_warehouse=rejected_warehouse)
|
||||
|
||||
return_pr = make_purchase_receipt(is_return=1, return_against=pr.name, received_qty = -4, qty=-2)
|
||||
return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", is_return=1, return_against=pr.name, received_qty = -4, qty=-2, rejected_warehouse=rejected_warehouse)
|
||||
|
||||
actual_qty = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
|
||||
"voucher_no": return_pr.name, 'warehouse': return_pr.items[0].rejected_warehouse}, "actual_qty")
|
||||
|
||||
self.assertEqual(actual_qty, -2)
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
|
||||
def test_purchase_return_for_serialized_items(self):
|
||||
def _check_serial_no_values(serial_no, field_values):
|
||||
@ -337,7 +330,6 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
pr.cancel()
|
||||
serial_nos = frappe.get_all('Serial No', {'asset': asset}, 'name') or []
|
||||
self.assertEquals(len(serial_nos), 0)
|
||||
#frappe.db.sql("delete from `tabLocation")
|
||||
frappe.db.sql("delete from `tabAsset`")
|
||||
|
||||
def test_purchase_receipt_for_enable_allow_cost_center_in_entry_of_bs_account(self):
|
||||
@ -345,8 +337,8 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
|
||||
accounts_settings.allow_cost_center_in_entry_of_bs_account = 1
|
||||
accounts_settings.save()
|
||||
cost_center = "_Test Cost Center for BS Account - _TC"
|
||||
create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
|
||||
cost_center = "_Test Cost Center for BS Account - TCP1"
|
||||
create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company with perpetual inventory")
|
||||
|
||||
if not frappe.db.exists('Location', 'Test Location'):
|
||||
frappe.get_doc({
|
||||
@ -354,8 +346,7 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
'location_name': 'Test Location'
|
||||
}).insert()
|
||||
|
||||
set_perpetual_inventory(1, "_Test Company")
|
||||
pr = make_purchase_receipt(cost_center=cost_center)
|
||||
pr = make_purchase_receipt(cost_center=cost_center, company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1")
|
||||
|
||||
stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
|
||||
gl_entries = get_gl_entries("Purchase Receipt", pr.name)
|
||||
@ -363,7 +354,7 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
expected_values = {
|
||||
"Stock Received But Not Billed - _TC": {
|
||||
"Stock Received But Not Billed - TCP1": {
|
||||
"cost_center": cost_center
|
||||
},
|
||||
stock_in_hand_account: {
|
||||
@ -373,7 +364,6 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
|
||||
|
||||
set_perpetual_inventory(0, pr.company)
|
||||
accounts_settings.allow_cost_center_in_entry_of_bs_account = 0
|
||||
accounts_settings.save()
|
||||
|
||||
@ -387,9 +377,7 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
'doctype': 'Location',
|
||||
'location_name': 'Test Location'
|
||||
}).insert()
|
||||
|
||||
set_perpetual_inventory(1, "_Test Company")
|
||||
pr = make_purchase_receipt()
|
||||
pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1")
|
||||
|
||||
stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
|
||||
gl_entries = get_gl_entries("Purchase Receipt", pr.name)
|
||||
@ -397,7 +385,7 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
self.assertTrue(gl_entries)
|
||||
|
||||
expected_values = {
|
||||
"Stock Received But Not Billed - _TC": {
|
||||
"Stock Received But Not Billed - TCP1": {
|
||||
"cost_center": None
|
||||
},
|
||||
stock_in_hand_account: {
|
||||
@ -407,8 +395,6 @@ class TestPurchaseReceipt(unittest.TestCase):
|
||||
for i, gle in enumerate(gl_entries):
|
||||
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
|
||||
|
||||
set_perpetual_inventory(0, pr.company)
|
||||
|
||||
def test_make_purchase_invoice_from_pr_for_returned_qty(self):
|
||||
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order, create_pr_against_po
|
||||
|
||||
@ -452,6 +438,78 @@ def get_gl_entries(voucher_type, voucher_no):
|
||||
from `tabGL Entry` where voucher_type=%s and voucher_no=%s
|
||||
order by account desc""", (voucher_type, voucher_no), as_dict=1)
|
||||
|
||||
def get_taxes(**args):
|
||||
|
||||
args = frappe._dict(args)
|
||||
|
||||
return [{'account_head': '_Test Account Shipping Charges - TCP1',
|
||||
'add_deduct_tax': 'Add',
|
||||
'category': 'Valuation and Total',
|
||||
'charge_type': 'Actual',
|
||||
'cost_center': args.cost_center or 'Main - TCP1',
|
||||
'description': 'Shipping Charges',
|
||||
'doctype': 'Purchase Taxes and Charges',
|
||||
'parentfield': 'taxes',
|
||||
'rate': 100.0,
|
||||
'tax_amount': 100.0},
|
||||
{'account_head': '_Test Account VAT - TCP1',
|
||||
'add_deduct_tax': 'Add',
|
||||
'category': 'Total',
|
||||
'charge_type': 'Actual',
|
||||
'cost_center': args.cost_center or 'Main - TCP1',
|
||||
'description': 'VAT',
|
||||
'doctype': 'Purchase Taxes and Charges',
|
||||
'parentfield': 'taxes',
|
||||
'rate': 120.0,
|
||||
'tax_amount': 120.0},
|
||||
{'account_head': '_Test Account Customs Duty - TCP1',
|
||||
'add_deduct_tax': 'Add',
|
||||
'category': 'Valuation',
|
||||
'charge_type': 'Actual',
|
||||
'cost_center': args.cost_center or 'Main - TCP1',
|
||||
'description': 'Customs Duty',
|
||||
'doctype': 'Purchase Taxes and Charges',
|
||||
'parentfield': 'taxes',
|
||||
'rate': 150.0,
|
||||
'tax_amount': 150.0}]
|
||||
|
||||
def get_items(**args):
|
||||
args = frappe._dict(args)
|
||||
return [{
|
||||
"base_amount": 250.0,
|
||||
"conversion_factor": 1.0,
|
||||
"description": "_Test Item",
|
||||
"doctype": "Purchase Receipt Item",
|
||||
"item_code": "_Test Item",
|
||||
"item_name": "_Test Item",
|
||||
"parentfield": "items",
|
||||
"qty": 5.0,
|
||||
"rate": 50.0,
|
||||
"received_qty": 5.0,
|
||||
"rejected_qty": 0.0,
|
||||
"stock_uom": "_Test UOM",
|
||||
"uom": "_Test UOM",
|
||||
"warehouse": args.warehouse or "_Test Warehouse - _TC",
|
||||
"cost_center": args.cost_center or "Main - _TC"
|
||||
},
|
||||
{
|
||||
"base_amount": 250.0,
|
||||
"conversion_factor": 1.0,
|
||||
"description": "_Test Item Home Desktop 100",
|
||||
"doctype": "Purchase Receipt Item",
|
||||
"item_code": "_Test Item Home Desktop 100",
|
||||
"item_name": "_Test Item Home Desktop 100",
|
||||
"parentfield": "items",
|
||||
"qty": 5.0,
|
||||
"rate": 50.0,
|
||||
"received_qty": 5.0,
|
||||
"rejected_qty": 0.0,
|
||||
"stock_uom": "_Test UOM",
|
||||
"uom": "_Test UOM",
|
||||
"warehouse": args.warehouse or "_Test Warehouse 1 - _TC",
|
||||
"cost_center": args.cost_center or "Main - _TC"
|
||||
}]
|
||||
|
||||
def make_purchase_receipt(**args):
|
||||
if not frappe.db.exists('Location', 'Test Location'):
|
||||
frappe.get_doc({
|
||||
@ -468,7 +526,7 @@ def make_purchase_receipt(**args):
|
||||
pr.company = args.company or "_Test Company"
|
||||
pr.supplier = args.supplier or "_Test Supplier"
|
||||
pr.is_subcontracted = args.is_subcontracted or "No"
|
||||
pr.supplier_warehouse = "_Test Warehouse 1 - _TC"
|
||||
pr.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC"
|
||||
pr.currency = args.currency or "INR"
|
||||
pr.is_return = args.is_return
|
||||
pr.return_against = args.return_against
|
||||
@ -492,6 +550,16 @@ def make_purchase_receipt(**args):
|
||||
"asset_location": args.location or "Test Location"
|
||||
})
|
||||
|
||||
if args.get_multiple_items:
|
||||
pr.items = []
|
||||
for item in get_items(warehouse= args.warehouse, cost_center = args.cost_center or frappe.get_cached_value('Company', pr.company, 'cost_center')):
|
||||
pr.append("items", item)
|
||||
|
||||
|
||||
if args.get_taxes_and_charges:
|
||||
for tax in get_taxes():
|
||||
pr.append("taxes", tax)
|
||||
|
||||
if not args.do_not_save:
|
||||
pr.insert()
|
||||
if not args.do_not_submit:
|
||||
|
@ -83,39 +83,5 @@
|
||||
}
|
||||
],
|
||||
"supplier": "_Test Supplier"
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"buying_price_list": "_Test Price List",
|
||||
"company": "_Test Company",
|
||||
"conversion_rate": 1.0,
|
||||
"currency": "INR",
|
||||
"doctype": "Purchase Receipt",
|
||||
"base_grand_total": 5000.0,
|
||||
"is_subcontracted": "Yes",
|
||||
"base_net_total": 5000.0,
|
||||
"posting_date": "2013-02-12",
|
||||
"items": [
|
||||
{
|
||||
"base_amount": 5000.0,
|
||||
"conversion_factor": 1.0,
|
||||
"description": "_Test FG Item",
|
||||
"doctype": "Purchase Receipt Item",
|
||||
"item_code": "_Test FG Item",
|
||||
"item_name": "_Test FG Item",
|
||||
"parentfield": "items",
|
||||
"qty": 10.0,
|
||||
"rate": 500.0,
|
||||
"received_qty": 10.0,
|
||||
"rejected_qty": 0.0,
|
||||
"stock_uom": "_Test UOM",
|
||||
"uom": "_Test UOM",
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
"cost_center": "Main - _TC"
|
||||
}
|
||||
],
|
||||
"supplier": "_Test Supplier",
|
||||
"supplier_warehouse": "_Test Warehouse - _TC"
|
||||
}
|
||||
]
|
14
erpnext/stock/doctype/serial_no/serial_no_list.js
Normal file
14
erpnext/stock/doctype/serial_no/serial_no_list.js
Normal file
@ -0,0 +1,14 @@
|
||||
frappe.listview_settings['Serial No'] = {
|
||||
add_fields: ["is_cancelled", "item_code", "warehouse", "warranty_expiry_date", "delivery_document_type"],
|
||||
get_indicator: (doc) => {
|
||||
if (doc.is_cancelled) {
|
||||
return [__("Cancelled"), "red", "is_cancelled,=,Yes"];
|
||||
} else if (doc.delivery_document_type) {
|
||||
return [__("Delivered"), "green", "delivery_document_type,is,set|is_cancelled,=,No"];
|
||||
} else if (doc.warranty_expiry_date && frappe.datetime.get_diff(doc.warranty_expiry_date, frappe.datetime.nowdate()) <= 0) {
|
||||
return [__("Expired"), "red", "warranty_expiry_date,not in,|warranty_expiry_date,<=,Today|delivery_document_type,is,not set|is_cancelled,=,No"];
|
||||
} else {
|
||||
return [__("Active"), "green", "delivery_document_type,is,not set|is_cancelled,=,No"];
|
||||
}
|
||||
}
|
||||
};
|
@ -12,6 +12,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_pu
|
||||
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
||||
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
||||
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
|
||||
test_dependencies = ["Item"]
|
||||
test_records = frappe.get_test_records('Serial No')
|
||||
@ -37,6 +38,8 @@ class TestSerialNo(unittest.TestCase):
|
||||
self.assertTrue(SerialNoCannotCannotChangeError, sr.save)
|
||||
|
||||
def test_inter_company_transfer(self):
|
||||
set_perpetual_inventory(0, "_Test Company 1")
|
||||
set_perpetual_inventory(0)
|
||||
se = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
|
||||
serial_nos = get_serial_nos(se.get("items")[0].serial_no)
|
||||
|
||||
|
@ -16,7 +16,6 @@ from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
|
||||
from erpnext.accounts.doctype.account.test_account import get_inventory_account
|
||||
from erpnext.stock.doctype.stock_entry.stock_entry import move_sample_to_retention_warehouse, make_stock_in_entry
|
||||
from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import OpeningEntryAccountError
|
||||
|
||||
from six import iteritems
|
||||
|
||||
def get_sle(**args):
|
||||
@ -132,20 +131,19 @@ class TestStockEntry(unittest.TestCase):
|
||||
self.assertTrue(item_code in items)
|
||||
|
||||
def test_material_receipt_gl_entry(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC",
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC")
|
||||
mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
|
||||
|
||||
stock_in_hand_account = get_inventory_account(mr.company, mr.get("items")[0].t_warehouse)
|
||||
self.check_stock_ledger_entries("Stock Entry", mr.name,
|
||||
[["_Test Item", "_Test Warehouse - _TC", 50.0]])
|
||||
[["_Test Item", "Stores - TCP1", 50.0]])
|
||||
|
||||
self.check_gl_entries("Stock Entry", mr.name,
|
||||
sorted([
|
||||
[stock_in_hand_account, 5000.0, 0.0],
|
||||
["Stock Adjustment - _TC", 0.0, 5000.0]
|
||||
["Stock Adjustment - TCP1", 0.0, 5000.0]
|
||||
])
|
||||
)
|
||||
|
||||
@ -158,29 +156,26 @@ class TestStockEntry(unittest.TestCase):
|
||||
where voucher_type='Stock Entry' and voucher_no=%s""", mr.name))
|
||||
|
||||
def test_material_issue_gl_entry(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
|
||||
|
||||
make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC",
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC")
|
||||
|
||||
mi = make_stock_entry(item_code="_Test Item", source="_Test Warehouse - _TC",
|
||||
qty=40, expense_account="Stock Adjustment - _TC")
|
||||
mi = make_stock_entry(item_code="_Test Item", source="Stores - TCP1", company=company,
|
||||
qty=40, expense_account="Stock Adjustment - TCP1")
|
||||
|
||||
self.check_stock_ledger_entries("Stock Entry", mi.name,
|
||||
[["_Test Item", "_Test Warehouse - _TC", -40.0]])
|
||||
[["_Test Item", "Stores - TCP1", -40.0]])
|
||||
|
||||
stock_in_hand_account = get_inventory_account(mi.company, "_Test Warehouse - _TC")
|
||||
stock_in_hand_account = get_inventory_account(mi.company, "Stores - TCP1")
|
||||
stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
|
||||
"voucher_no": mi.name}, "stock_value_difference"))
|
||||
|
||||
self.check_gl_entries("Stock Entry", mi.name,
|
||||
sorted([
|
||||
[stock_in_hand_account, 0.0, stock_value_diff],
|
||||
["Stock Adjustment - _TC", stock_value_diff, 0.0]
|
||||
["Stock Adjustment - TCP1", stock_value_diff, 0.0]
|
||||
])
|
||||
)
|
||||
|
||||
mi.cancel()
|
||||
|
||||
self.assertFalse(frappe.db.sql("""select name from `tabStock Ledger Entry`
|
||||
@ -190,16 +185,15 @@ class TestStockEntry(unittest.TestCase):
|
||||
where voucher_type='Stock Entry' and voucher_no=%s""", mi.name))
|
||||
|
||||
def test_material_transfer_gl_entry(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
create_stock_reconciliation(qty=100, rate=100)
|
||||
|
||||
mtn = make_stock_entry(item_code="_Test Item", source="_Test Warehouse - _TC",
|
||||
target="_Test Warehouse 1 - _TC", qty=45)
|
||||
mtn = make_stock_entry(item_code="_Test Item", source="Stores - TCP1",
|
||||
target="Finished Goods - TCP1", qty=45)
|
||||
|
||||
self.check_stock_ledger_entries("Stock Entry", mtn.name,
|
||||
[["_Test Item", "_Test Warehouse - _TC", -45.0], ["_Test Item", "_Test Warehouse 1 - _TC", 45.0]])
|
||||
[["_Test Item", "Stores - TCP1", -45.0], ["_Test Item", "Finished Goods - TCP1", 45.0]])
|
||||
|
||||
stock_in_hand_account = get_inventory_account(mtn.company, mtn.get("items")[0].s_warehouse)
|
||||
|
||||
@ -212,7 +206,7 @@ class TestStockEntry(unittest.TestCase):
|
||||
|
||||
else:
|
||||
stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
|
||||
"voucher_no": mtn.name, "warehouse": "_Test Warehouse - _TC"}, "stock_value_difference"))
|
||||
"voucher_no": mtn.name, "warehouse": "Stores - TCP1"}, "stock_value_difference"))
|
||||
|
||||
self.check_gl_entries("Stock Entry", mtn.name,
|
||||
sorted([
|
||||
@ -255,14 +249,21 @@ class TestStockEntry(unittest.TestCase):
|
||||
set_perpetual_inventory(0, repack.company)
|
||||
|
||||
def test_repack_with_additional_costs(self):
|
||||
company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
|
||||
set_perpetual_inventory(1, company)
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
|
||||
make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100)
|
||||
repack = frappe.copy_doc(test_records[3])
|
||||
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
|
||||
|
||||
|
||||
repack = make_stock_entry(company = company, purpose="Repack", do_not_save=True)
|
||||
repack.posting_date = nowdate()
|
||||
repack.posting_time = nowtime()
|
||||
|
||||
items = get_multiple_items()
|
||||
repack.items = []
|
||||
for item in items:
|
||||
repack.append("items", item)
|
||||
|
||||
repack.set("additional_costs", [
|
||||
{
|
||||
"description": "Actual Oerating Cost",
|
||||
@ -292,13 +293,12 @@ class TestStockEntry(unittest.TestCase):
|
||||
self.check_gl_entries("Stock Entry", repack.name,
|
||||
sorted([
|
||||
[stock_in_hand_account, 1200, 0.0],
|
||||
["Expenses Included In Valuation - _TC", 0.0, 1200.0]
|
||||
["Expenses Included In Valuation - TCP1", 0.0, 1200.0]
|
||||
])
|
||||
)
|
||||
set_perpetual_inventory(0, repack.company)
|
||||
|
||||
def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle):
|
||||
expected_sle.sort(key=lambda x: x[0])
|
||||
expected_sle.sort(key=lambda x: x[1])
|
||||
|
||||
# check stock ledger entries
|
||||
sle = frappe.db.sql("""select item_code, warehouse, actual_qty
|
||||
@ -306,7 +306,7 @@ class TestStockEntry(unittest.TestCase):
|
||||
and voucher_no = %s order by item_code, warehouse, actual_qty""",
|
||||
(voucher_type, voucher_no), as_list=1)
|
||||
self.assertTrue(sle)
|
||||
sle.sort(key=lambda x: x[0])
|
||||
sle.sort(key=lambda x: x[1])
|
||||
|
||||
for i, sle in enumerate(sle):
|
||||
self.assertEqual(expected_sle[i][0], sle[0])
|
||||
@ -773,14 +773,12 @@ class TestStockEntry(unittest.TestCase):
|
||||
self.assertEqual(doc.per_transferred, 100)
|
||||
|
||||
def test_gle_for_opening_stock_entry(self):
|
||||
set_perpetual_inventory(1)
|
||||
|
||||
mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC",
|
||||
qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC", is_opening="Yes", do_not_save=True)
|
||||
mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company="_Test Company with perpetual inventory",qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1", is_opening="Yes", do_not_save=True)
|
||||
|
||||
self.assertRaises(OpeningEntryAccountError, mr.save)
|
||||
|
||||
mr.items[0].expense_account = "Temporary Opening - _TC"
|
||||
mr.items[0].expense_account = "Temporary Opening - TCP1"
|
||||
|
||||
mr.save()
|
||||
mr.submit()
|
||||
|
||||
@ -805,14 +803,42 @@ def make_serialized_item(item_code=None, serial_no=None, target_warehouse=None):
|
||||
|
||||
def get_qty_after_transaction(**args):
|
||||
args = frappe._dict(args)
|
||||
|
||||
last_sle = get_previous_sle({
|
||||
"item_code": args.item_code or "_Test Item",
|
||||
"warehouse": args.warehouse or "_Test Warehouse - _TC",
|
||||
"posting_date": args.posting_date or nowdate(),
|
||||
"posting_time": args.posting_time or nowtime()
|
||||
})
|
||||
|
||||
return flt(last_sle.get("qty_after_transaction"))
|
||||
|
||||
def get_multiple_items():
|
||||
return [
|
||||
{
|
||||
"conversion_factor": 1.0,
|
||||
"cost_center": "Main - TCP1",
|
||||
"doctype": "Stock Entry Detail",
|
||||
"expense_account": "Stock Adjustment - TCP1",
|
||||
"basic_rate": 100,
|
||||
"item_code": "_Test Item",
|
||||
"qty": 50.0,
|
||||
"s_warehouse": "Stores - TCP1",
|
||||
"stock_uom": "_Test UOM",
|
||||
"transfer_qty": 50.0,
|
||||
"uom": "_Test UOM"
|
||||
},
|
||||
{
|
||||
"conversion_factor": 1.0,
|
||||
"cost_center": "Main - TCP1",
|
||||
"doctype": "Stock Entry Detail",
|
||||
"expense_account": "Stock Adjustment - TCP1",
|
||||
"basic_rate": 5000,
|
||||
"item_code": "_Test Item Home Desktop 100",
|
||||
"qty": 1,
|
||||
"stock_uom": "_Test UOM",
|
||||
"t_warehouse": "Stores - TCP1",
|
||||
"transfer_qty": 1,
|
||||
"uom": "_Test UOM"
|
||||
}
|
||||
]
|
||||
|
||||
test_records = frappe.get_test_records('Stock Entry')
|
||||
|
@ -7,7 +7,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe, unittest
|
||||
from frappe.utils import flt, nowdate, nowtime
|
||||
from erpnext.accounts.utils import get_stock_and_account_difference
|
||||
from erpnext.accounts.utils import get_stock_and_account_balance
|
||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||
from erpnext.stock.stock_ledger import get_previous_sle, update_entries_after
|
||||
from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import EmptyStockReconciliationItemsError, get_items
|
||||
@ -21,7 +21,6 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
def setUpClass(self):
|
||||
create_batch_or_serial_no_items()
|
||||
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
|
||||
insert_existing_sle()
|
||||
|
||||
def test_reco_for_fifo(self):
|
||||
self._test_reco_sle_gle("FIFO")
|
||||
@ -30,7 +29,8 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
self._test_reco_sle_gle("Moving Average")
|
||||
|
||||
def _test_reco_sle_gle(self, valuation_method):
|
||||
set_perpetual_inventory()
|
||||
insert_existing_sle(warehouse='Stores - TCP1')
|
||||
company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
|
||||
# [[qty, valuation_rate, posting_date,
|
||||
# posting_time, expected_stock_value, bin_qty, bin_valuation]]
|
||||
input_data = [
|
||||
@ -46,14 +46,15 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
|
||||
last_sle = get_previous_sle({
|
||||
"item_code": "_Test Item",
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
"warehouse": "Stores - TCP1",
|
||||
"posting_date": d[2],
|
||||
"posting_time": d[3]
|
||||
})
|
||||
|
||||
# submit stock reconciliation
|
||||
stock_reco = create_stock_reconciliation(qty=d[0], rate=d[1],
|
||||
posting_date=d[2], posting_time=d[3])
|
||||
posting_date=d[2], posting_time=d[3], warehouse="Stores - TCP1",
|
||||
company=company, expense_account = "Stock Adjustment - TCP1")
|
||||
|
||||
# check stock value
|
||||
sle = frappe.db.sql("""select * from `tabStock Ledger Entry`
|
||||
@ -73,17 +74,18 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
# no gl entries
|
||||
self.assertTrue(frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
|
||||
self.assertFalse(get_stock_and_account_difference(["_Test Account Stock In Hand - _TC"]))
|
||||
|
||||
stock_reco.cancel()
|
||||
acc_bal, stock_bal, wh_list = get_stock_and_account_balance("Stock In Hand - TCP1",
|
||||
stock_reco.posting_date, stock_reco.company)
|
||||
self.assertEqual(acc_bal, stock_bal)
|
||||
|
||||
self.assertFalse(frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
|
||||
stock_reco.cancel()
|
||||
|
||||
self.assertFalse(frappe.db.get_value("GL Entry",
|
||||
{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
|
||||
self.assertFalse(frappe.db.get_value("Stock Ledger Entry",
|
||||
{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
|
||||
|
||||
set_perpetual_inventory(0)
|
||||
self.assertFalse(frappe.db.get_value("GL Entry",
|
||||
{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
|
||||
|
||||
def test_get_items(self):
|
||||
create_warehouse("_Test Warehouse Group 1", {"is_group": 1})
|
||||
@ -203,17 +205,17 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
stock_doc.cancel()
|
||||
|
||||
|
||||
def insert_existing_sle():
|
||||
def insert_existing_sle(warehouse):
|
||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
|
||||
|
||||
make_stock_entry(posting_date="2012-12-15", posting_time="02:00", item_code="_Test Item",
|
||||
target="_Test Warehouse - _TC", qty=10, basic_rate=700)
|
||||
target=warehouse, qty=10, basic_rate=700)
|
||||
|
||||
make_stock_entry(posting_date="2012-12-25", posting_time="03:00", item_code="_Test Item",
|
||||
source="_Test Warehouse - _TC", qty=15)
|
||||
source=warehouse, qty=15)
|
||||
|
||||
make_stock_entry(posting_date="2013-01-05", posting_time="07:00", item_code="_Test Item",
|
||||
target="_Test Warehouse - _TC", qty=15, basic_rate=1200)
|
||||
target=warehouse, qty=15, basic_rate=1200)
|
||||
|
||||
def create_batch_or_serial_no_items():
|
||||
create_warehouse("_Test Warehouse for Stock Reco1",
|
||||
@ -244,7 +246,10 @@ def create_stock_reconciliation(**args):
|
||||
sr.company = args.company or "_Test Company"
|
||||
sr.expense_account = args.expense_account or \
|
||||
("Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC")
|
||||
sr.cost_center = args.cost_center or "_Test Cost Center - _TC"
|
||||
sr.cost_center = args.cost_center \
|
||||
or frappe.get_cached_value("Company", sr.company, "cost_center") \
|
||||
or "_Test Cost Center - _TC"
|
||||
|
||||
sr.append("items", {
|
||||
"item_code": args.item_code or "_Test Item",
|
||||
"warehouse": args.warehouse or "_Test Warehouse - _TC",
|
||||
|
@ -1,42 +1,36 @@
|
||||
[
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"create_account_under": "Stock Assets - _TC",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Warehouse",
|
||||
"is_group": 0
|
||||
},
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"create_account_under": "Stock Assets - _TC",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Scrap Warehouse",
|
||||
"is_group": 0
|
||||
},
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"create_account_under": "Fixed Assets - _TC",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Warehouse 1",
|
||||
"is_group": 0
|
||||
},
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"create_account_under": "Fixed Assets - _TC",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Warehouse 2",
|
||||
"is_group": 0
|
||||
},
|
||||
{
|
||||
"company": "_Test Company",
|
||||
"create_account_under": "Stock Assets - _TC",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Rejected Warehouse",
|
||||
"is_group": 0
|
||||
},
|
||||
{
|
||||
"company": "_Test Company 1",
|
||||
"create_account_under": "Stock Assets - _TC1",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": "_Test Warehouse 2",
|
||||
"is_group": 0
|
||||
|
@ -101,8 +101,7 @@ def create_warehouse(warehouse_name, properties=None, company=None):
|
||||
w.warehouse_name = warehouse_name
|
||||
w.parent_warehouse = "_Test Warehouse Group - _TC"
|
||||
w.company = company
|
||||
make_account_for_warehouse(warehouse_name, w)
|
||||
w.account = warehouse_id
|
||||
w.account = get_warehouse_account(warehouse_name, company)
|
||||
if properties:
|
||||
w.update(properties)
|
||||
w.save()
|
||||
@ -110,9 +109,40 @@ def create_warehouse(warehouse_name, properties=None, company=None):
|
||||
else:
|
||||
return warehouse_id
|
||||
|
||||
def make_account_for_warehouse(warehouse_name, warehouse_obj):
|
||||
if not frappe.db.exists("Account", warehouse_name + " - _TC"):
|
||||
parent_account = frappe.db.get_value('Account',
|
||||
{'company': warehouse_obj.company, 'is_group':1, 'account_type': 'Stock'},'name')
|
||||
account = create_account(account_name=warehouse_name, \
|
||||
account_type="Stock", parent_account= parent_account, company=warehouse_obj.company)
|
||||
def get_warehouse(**args):
|
||||
args = frappe._dict(args)
|
||||
if(frappe.db.exists("Warehouse", args.warehouse_name + " - " + args.abbr)):
|
||||
return frappe.get_doc("Warehouse", args.warehouse_name + " - " + args.abbr)
|
||||
else:
|
||||
w = frappe.get_doc({
|
||||
"company": args.company or "_Test Company",
|
||||
"doctype": "Warehouse",
|
||||
"warehouse_name": args.warehouse_name,
|
||||
"is_group": 0,
|
||||
"account": get_warehouse_account(args.warehouse_name, args.company, args.abbr)
|
||||
})
|
||||
w.insert()
|
||||
return w
|
||||
|
||||
def get_warehouse_account(warehouse_name, company, company_abbr=None):
|
||||
if not company_abbr:
|
||||
company_abbr = frappe.get_cached_value("Company", company, 'abbr')
|
||||
|
||||
if not frappe.db.exists("Account", warehouse_name + " - " + company_abbr):
|
||||
return create_account(
|
||||
account_name=warehouse_name,
|
||||
parent_account=get_group_stock_account(company, company_abbr),
|
||||
account_type='Stock',
|
||||
company=company)
|
||||
else:
|
||||
return warehouse_name + " - " + company_abbr
|
||||
|
||||
|
||||
def get_group_stock_account(company, company_abbr=None):
|
||||
group_stock_account = frappe.db.get_value("Account",
|
||||
filters={'account_type': 'Stock', 'is_group': 1, 'company': company}, fieldname='name')
|
||||
if not group_stock_account:
|
||||
if not company_abbr:
|
||||
company_abbr = frappe.get_cached_value("Company", company, 'abbr')
|
||||
group_stock_account = "Current Assets - " + company_abbr
|
||||
return group_stock_account
|
@ -89,7 +89,7 @@ def get_item_price_qty_data(filters):
|
||||
{conditions}"""
|
||||
.format(conditions=conditions), filters, as_dict=1)
|
||||
|
||||
price_list_names = list(set([frappe.db.escape(item.price_list_name) for item in item_results]))
|
||||
price_list_names = list(set([item.price_list_name for item in item_results]))
|
||||
|
||||
buying_price_map = get_price_map(price_list_names, buying=1)
|
||||
selling_price_map = get_price_map(price_list_names, selling=1)
|
||||
@ -129,17 +129,15 @@ def get_price_map(price_list_names, buying=0, selling=0):
|
||||
|
||||
rate_key = "Buying Rate" if buying else "Selling Rate"
|
||||
price_list_key = "Buying Price List" if buying else "Selling Price List"
|
||||
price_list_condition = " and buying=1" if buying else " and selling=1"
|
||||
|
||||
pricing_details = frappe.db.sql("""
|
||||
select
|
||||
name,price_list,price_list_rate
|
||||
from
|
||||
`tabItem Price`
|
||||
where
|
||||
name in ({price_list_names}) {price_list_condition}
|
||||
""".format(price_list_names=', '.join(['%s']*len(price_list_names)),
|
||||
price_list_condition=price_list_condition), price_list_names, as_dict=1)
|
||||
filters = {"name": ("in", price_list_names)}
|
||||
if buying:
|
||||
filters["buying"] = 1
|
||||
else:
|
||||
filters["selling"] = 1
|
||||
|
||||
pricing_details = frappe.get_all("Item Price",
|
||||
fields = ["name", "price_list", "price_list_rate"], filters=filters)
|
||||
|
||||
for d in pricing_details:
|
||||
name = d["name"]
|
||||
|
@ -1,13 +1,14 @@
|
||||
<div class="web-list-item">
|
||||
<a href="/timesheets?name={{ doc.name | urlencode }}" class="no-decoration">
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<span class="indicator {{ "red" if doc.status=="Cancelled" else "green" if doc.status=="Billed" else "blue" if doc.status=="Submitted" else "darkgrey" }}">{{ doc.name }}</span>
|
||||
</div>
|
||||
<div class="col-xs-3"> Billable Hours: {{ doc.total_billable_hours}} </div>
|
||||
<div class="col-xs-2"> {{ _(doc.sales_invoice) }} </div>
|
||||
<div class="col-xs-2"> {{ _(doc.project) }} </div>
|
||||
<div class="col-xs-2"> {{ _(doc.activity_type) }} </div>
|
||||
<div class="web-list-item transaction-list-item">
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<span class='indicator {{ "red" if doc.status=="Cancelled" else "green" if doc.status=="Billed" else "blue" if doc.status=="Submitted" else "darkgrey" }} small'>
|
||||
{{ doc.name }}
|
||||
</span>
|
||||
</div>
|
||||
</a>
|
||||
<div class="col-xs-2 small"> {{ doc.total_billable_hours }} </div>
|
||||
<div class="col-xs-2 small"> {{ doc.project or '' }} </div>
|
||||
<div class="col-xs-2 small"> {{ doc.sales_invoice or '' }} </div>
|
||||
<div class="col-xs-2 small"> {{ _(doc.activity_type) }} </div>
|
||||
</div>
|
||||
<!-- <a href="/timesheets?name={{ doc.name | urlencode }}" class="transaction-item-link">Link</a> -->
|
||||
</div>
|
||||
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Betaaldatum
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Voorbehou Aantal: Hoeveelheid te koop bestel, maar nie afgelewer nie."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Herstel, as die gekose adres geredigeer word na die stoor"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Voorbehou Aantal vir Onderkontrakte: Hoeveelheid grondstowwe om onderverpakte items te maak.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Voorbehou Aantal vir Onderkontrakte: Hoeveelheid grondstowwe om onderverpakte items te maak.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Variant {0} bestaan reeds met dieselfde eienskappe
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing Details
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Oopmaak'
|
||||
|
Can't render this file because it is too large.
|
@ -1560,7 +1560,7 @@ DocType: Sales Invoice,Payment Due Date,ክፍያ መጠናቀቅ ያለበት
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",የተያዙ ጫፎች ብዛት ለሽያጭ የታዘዘ ፣ ግን አልደረሰም ፡፡
|
||||
DocType: Drug Prescription,Interval UOM,የጊዜ ክፍተት UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",የተመረጠው አድራሻ ከተቀመጠ በኋላ ማስተካከያ ከተደረገበት አይምረጡ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,የተያዙ ዕቃዎች ለንዑስ-ኮንትራክተር-ንዑስ-ንዑስ ንጥል ነገሮችን ለመስራት ጥሬ ዕቃዎች ብዛት።
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,የተያዙ ዕቃዎች ለንዑስ-ኮንትራክተር-ንዑስ-ንዑስ ንጥል ነገሮችን ለመስራት ጥሬ ዕቃዎች ብዛት።
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ንጥል ተለዋጭ {0} ቀድሞውኑ ተመሳሳይ ባሕርያት ጋር አለ
|
||||
DocType: Item,Hub Publishing Details,ሃቢ የህትመት ዝርዝሮች
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','በመክፈት ላይ'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,تاريخ استحقاق السداد
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",الكمية المحجوزة : الكمية المطلوبة لل بيع، ولكن لم يتم تسليمها .
|
||||
DocType: Drug Prescription,Interval UOM,الفاصل الزمني أوم
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",إعادة تحديد، إذا تم تحرير عنوان المختار بعد حفظ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,الكمية المحجوزة للعقد من الباطن: كمية المواد الخام لصنع سلع من الباطن.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,الكمية المحجوزة للعقد من الباطن: كمية المواد الخام لصنع سلع من الباطن.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,متغير الصنف {0} موجود بالفعل مع نفس الخصائص
|
||||
DocType: Item,Hub Publishing Details,هاب تفاصيل النشر
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','افتتاحي'
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Дължимото плащане Дат
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Количество, запазено: Количество, поръчано за продажба, но не е доставено."
|
||||
DocType: Drug Prescription,Interval UOM,Интервал (мерна единица)
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Преименувайте отново, ако избраният адрес се редактира след запазване"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Количество, запазено за подизпълнение: Количество суровини за изработване на извадени продукти."
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Количество, запазено за подизпълнение: Количество суровини за изработване на извадени продукти."
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Позиция Variant {0} вече съществува с едни и същи атрибути
|
||||
DocType: Item,Hub Publishing Details,Подробна информация за издателя
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Начален баланс"""
|
||||
|
Can't render this file because it is too large.
|
@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,পরিশোধযোগ্য তা
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","সংরক্ষিত পরিমাণ: পরিমাণ বিক্রয়ের জন্য অর্ডার করা হয়েছে, তবে বিতরণ করা হয়নি।"
|
||||
DocType: Drug Prescription,Interval UOM,অন্তর্বর্তী UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",সংরক্ষণ করার পরে যদি নির্বাচিত ঠিকানাটি সম্পাদনা করা হয় তবে নির্বাচন বাতিল করুন
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,সাবকন্ট্রাক্টের জন্য সংরক্ষিত পরিমাণ: উপকোট্রাক্ট আইটেমগুলি তৈরি করতে কাঁচামাল পরিমাণ।
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,সাবকন্ট্রাক্টের জন্য সংরক্ষিত পরিমাণ: উপকোট্রাক্ট আইটেমগুলি তৈরি করতে কাঁচামাল পরিমাণ।
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,আইটেম ভেরিয়েন্ট {0} ইতিমধ্যে একই বৈশিষ্ট্যাবলী সঙ্গে বিদ্যমান
|
||||
DocType: Item,Hub Publishing Details,হাব প্রকাশনা বিবরণ
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',' শুরু'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Plaćanje Due Date
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervirano Količina : Količina naručiti za prodaju , ali nije dostavljena ."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Ponovo odaberite, ako je izabrana adresa uređena nakon čuvanja"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Količina rezervisanog za podugovor: Količina sirovina za izradu predmeta koji se oduzimaju.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Količina rezervisanog za podugovor: Količina sirovina za izradu predmeta koji se oduzimaju.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Stavka Variant {0} već postoji s istim atributima
|
||||
DocType: Item,Hub Publishing Details,Detalji izdavanja stanice
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Otvaranje'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Data de pagament
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservats Quantitat: Quantitat va ordenar a la venda, però no entregat."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Torneu a seleccionar, si l'adreça escollida s'edita després de desar-la"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Quantitat reservada per al subcontracte: quantitat de matèries primeres per fabricar articles subcontractats.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Quantitat reservada per al subcontracte: quantitat de matèries primeres per fabricar articles subcontractats.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Article Variant {0} ja existeix amb els mateixos atributs
|
||||
DocType: Item,Hub Publishing Details,Detalls de publicació del Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Obertura'
|
||||
|
Can't render this file because it is too large.
|
@ -1580,7 +1580,7 @@ DocType: Sales Invoice,Payment Due Date,Splatno dne
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Množství: Množství objednal k prodeji, ale není doručena."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Znovu vyberte, pokud je zvolená adresa po uložení upravena"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Vyhrazeno Množství pro subdodávky: Množství surovin pro výrobu subdodávek.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Vyhrazeno Množství pro subdodávky: Množství surovin pro výrobu subdodávek.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Bod Variant {0} již existuje se stejnými vlastnostmi
|
||||
DocType: Item,Hub Publishing Details,Podrobnosti o publikování Hubu
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Otevírací"""
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Sidste betalingsdato
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserveret antal: Mængde bestilt til salg, men ikke leveret."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Vælg igen, hvis den valgte adresse redigeres efter gem"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reserveret antal til underentreprise: Råvaremængde til fremstilling af underleverede genstande.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reserveret antal til underentreprise: Råvaremængde til fremstilling af underleverede genstande.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Variant {0} findes allerede med samme attributter
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing Detaljer
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Åbner'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Zahlungsstichtag
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservierte Menge: Für den Verkauf bestellte Menge, aber noch nicht geliefert."
|
||||
DocType: Drug Prescription,Interval UOM,Intervall UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Wählen Sie erneut, wenn die gewählte Adresse nach dem Speichern bearbeitet wird"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reservierte Menge für Lohnbearbeiter: Rohstoffmenge für Lohnbearbeiter.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reservierte Menge für Lohnbearbeiter: Rohstoffmenge für Lohnbearbeiter.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artikelvariante {0} mit denselben Attributen existiert bereits
|
||||
DocType: Item,Hub Publishing Details,Hub-Veröffentlichungsdetails
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Eröffnung"""
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Ημερομηνία λήξης προθ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Δεσμευμένη ποσότητα : ποσότητα που παραγγέλθηκε για πώληση αλλά δεν παραδόθηκε.
|
||||
DocType: Drug Prescription,Interval UOM,Διαστήματα UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Επαναφέρετε την επιλογή, εάν η επιλεγμένη διεύθυνση επεξεργαστεί μετά την αποθήκευση"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Προβλεπόμενη ποσότητα για υπεργολαβία: Ποσότητα πρώτων υλών για την πραγματοποίηση υποκλάδων.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Προβλεπόμενη ποσότητα για υπεργολαβία: Ποσότητα πρώτων υλών για την πραγματοποίηση υποκλάδων.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Θέση Παραλλαγή {0} υπάρχει ήδη με ίδια χαρακτηριστικά
|
||||
DocType: Item,Hub Publishing Details,Στοιχεία δημοσίευσης Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',«Άνοιγμα»
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Fecha de pago
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Cantidad Reservada: Cantidad a pedir a la venta , pero no entregado."
|
||||
DocType: Drug Prescription,Interval UOM,Intervalo UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Vuelva a seleccionar, si la dirección elegida se edita después de guardar"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Cantidad reservada para subcontrato: Cantidad de materias primas para hacer artículos subcotractados.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Cantidad reservada para subcontrato: Cantidad de materias primas para hacer artículos subcotractados.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artículo Variant {0} ya existe con los mismos atributos
|
||||
DocType: Item,Hub Publishing Details,Detalle de Publicación del Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Apertura'
|
||||
|
Can't render this file because it is too large.
|
@ -1558,7 +1558,7 @@ DocType: Sales Invoice,Payment Due Date,Maksetähtpäevast
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserveeritud kogus: Müügiks tellitud kogus, kuid tarnimata."
|
||||
DocType: Drug Prescription,Interval UOM,Intervall UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Kui valite valitud aadressi pärast salvestamist, vali uuesti"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Allhankelepingu jaoks reserveeritud kogus: Tooraine kogus alamhangete jaoks.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Allhankelepingu jaoks reserveeritud kogus: Tooraine kogus alamhangete jaoks.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Punkt Variant {0} on juba olemas sama atribuute
|
||||
DocType: Item,Hub Publishing Details,Hubi avaldamise üksikasjad
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Avamine"
|
||||
|
Can't render this file because it is too large.
|
@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,پرداخت با توجه تاریخ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Qty رزرو شده: مقدار سفارش برای فروش سفارش داده می شود ، اما تحویل داده نمی شود.
|
||||
DocType: Drug Prescription,Interval UOM,فاصله UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",در صورتی که آدرس انتخاب شده پس از ذخیره ویرایش، مجددا انتخاب کنید
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty رزرو شده برای قراردادهای فرعی: مقدار مواد اولیه برای ساخت وسایل فرعی.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty رزرو شده برای قراردادهای فرعی: مقدار مواد اولیه برای ساخت وسایل فرعی.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,مورد متغیر {0} در حال حاضر با ویژگی های همان وجود دارد
|
||||
DocType: Item,Hub Publishing Details,جزئیات انتشار هاب
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','افتتاح'
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Maksun eräpäivä
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Varattu määrä: Myytävänä oleva määrä, mutta ei toimitettu."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Vahvista valinta uudelleen, jos valittua osoitetta muokataan tallennuksen jälkeen"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Varattu määrä alihankintasopimuksille: Raaka-aineiden määrä alihankittujen tuotteiden valmistamiseksi.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Varattu määrä alihankintasopimuksille: Raaka-aineiden määrä alihankittujen tuotteiden valmistamiseksi.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Tuote Variant {0} on jo olemassa samoja ominaisuuksia
|
||||
DocType: Item,Hub Publishing Details,Hub-julkaisutiedot
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Avattu'
|
||||
|
Can't render this file because it is too large.
|
@ -1583,7 +1583,7 @@ DocType: Sales Invoice,Payment Due Date,Date d'Échéance de Paiement
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Réservés Quantité: Quantité de commande pour la vente , mais pas livré ."
|
||||
DocType: Drug Prescription,Interval UOM,UDM d'Intervalle
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Re-sélectionner, si l'adresse choisie est éditée après l'enregistrement"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qté réservée aux sous-traitants: quantité de matières premières permettant de fabriquer des articles sous-traités.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qté réservée aux sous-traitants: quantité de matières premières permettant de fabriquer des articles sous-traités.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,La Variante de l'Article {0} existe déjà avec les mêmes caractéristiques
|
||||
DocType: Item,Hub Publishing Details,Détails Publiés sur le Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Ouverture'
|
||||
|
Can't render this file because it is too large.
|
@ -1543,7 +1543,7 @@ DocType: Sales Invoice,Payment Due Date,ચુકવણી કારણે ત
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","રિઝર્વેટેડ ક્વોટી: વેચવા માટેનો જથ્થો આપ્યો, પરંતુ પહોંચાડ્યો નહીં."
|
||||
DocType: Drug Prescription,Interval UOM,અંતરાલ UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","રીસલેક્ટ કરો, જો સાચવેલા સરનામાંને સેવ કર્યા પછી સંપાદિત કરવામાં આવે છે"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,સબકોન્ટ્રેક્ટ માટે અનામત પ્રમાણ: સબકોટ્રેક્ટ વસ્તુઓ બનાવવા માટે કાચા માલનો જથ્થો.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,સબકોન્ટ્રેક્ટ માટે અનામત પ્રમાણ: સબકોટ્રેક્ટ વસ્તુઓ બનાવવા માટે કાચા માલનો જથ્થો.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,વસ્તુ વેરિએન્ટ {0} પહેલાથી જ લક્ષણો સાથે હાજર
|
||||
DocType: Item,Hub Publishing Details,હબ પબ્લિશિંગ વિગતો
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','શરૂઆત'
|
||||
|
Can't render this file because it is too large.
|
@ -1578,7 +1578,7 @@ DocType: Sales Invoice,Payment Due Date,भुगतान की नियत
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","सुरक्षित मात्रा: मात्रा बिक्री के लिए आदेश दिया है , लेकिन नहीं पहुंचा."
|
||||
DocType: Drug Prescription,Interval UOM,अंतराल UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","अचयनित करें, अगर सहेजे जाने के बाद चुना हुआ पता संपादित किया गया है"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,सब-कॉन्ट्रैक्ट के लिए आरक्षित मात्रा: कच्चे माल की मात्रा उप-निर्मित आइटम बनाने के लिए।
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,सब-कॉन्ट्रैक्ट के लिए आरक्षित मात्रा: कच्चे माल की मात्रा उप-निर्मित आइटम बनाने के लिए।
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,मद संस्करण {0} पहले से ही एक ही गुण के साथ मौजूद है
|
||||
DocType: Item,Hub Publishing Details,हब प्रकाशन विवरण
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','उद्घाटन'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Plaćanje Due Date
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervirano Količina : Količina naručiti za prodaju , ali nije dostavljena ."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",Ponovno odaberite ako je odabrana adresa uređena nakon spremanja
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Količina rezerviranog za podugovor: Količina sirovina za izradu poduhvata.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Količina rezerviranog za podugovor: Količina sirovina za izradu poduhvata.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Stavka Varijanta {0} već postoji s istim atributima
|
||||
DocType: Item,Hub Publishing Details,Pojedinosti objavljivanja središta
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Otvaranje '
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Fizetési határidő
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Mennyiség: Rendelhető mennyiség eladó, de nem teljesített."
|
||||
DocType: Drug Prescription,Interval UOM,Intervallum mértékegysége
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Újra válassza ki, ha a kiválasztott cím szerkesztésre került a mentés után"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Fenntartott mennyiség az alvállalkozók számára: Nyersanyag-mennyiség az alhúzásokhoz.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Fenntartott mennyiség az alvállalkozók számára: Nyersanyag-mennyiség az alhúzásokhoz.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Tétel variáció {0} már létezik azonos Jellemzővel
|
||||
DocType: Item,Hub Publishing Details,Hub közzétételének részletei
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Nyitás"""
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Tanggal Jatuh Tempo Pembayaran
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Qty: Jumlah memerintahkan untuk dijual, tapi tidak disampaikan."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Pilih ulang, jika alamat yang dipilih diedit setelah simpan"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Jumlah Pesanan untuk Sub-kontrak: Kuantitas bahan baku untuk membuat barang-barang yang disubsidi.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Jumlah Pesanan untuk Sub-kontrak: Kuantitas bahan baku untuk membuat barang-barang yang disubsidi.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Varian {0} sudah ada dengan atribut yang sama
|
||||
DocType: Item,Hub Publishing Details,Rincian Hub Publishing
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Awal'
|
||||
|
Can't render this file because it is too large.
|
@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Greiðsla Due Date
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Frátekið magn: Magn pantað til sölu, en ekki afhent."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Veldu aftur, ef valið heimilisfang er breytt eftir að vista"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Frátekið magn fyrir undirverktaka: Magn hráefna til að búa til undirverktaka hluti.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Frátekið magn fyrir undirverktaka: Magn hráefna til að búa til undirverktaka hluti.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Liður Variant {0} er þegar til staðar með sömu eiginleika
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing Upplýsingar
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Opening'
|
||||
|
Can't render this file because it is too large.
|
@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Scadenza
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Riservato Quantità : quantità ordinata in vendita , ma non consegnati ."
|
||||
DocType: Drug Prescription,Interval UOM,Intervallo UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Riseleziona, se l'indirizzo scelto viene modificato dopo il salvataggio"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qtà riservata per conto lavoro: quantità di materie prime per la produzione di articoli in conto lavoro.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qtà riservata per conto lavoro: quantità di materie prime per la produzione di articoli in conto lavoro.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Prodotto Modello {0} esiste già con gli stessi attributi
|
||||
DocType: Item,Hub Publishing Details,Dettagli di pubblicazione Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Apertura'
|
||||
|
Can't render this file because it is too large.
|
@ -1589,7 +1589,7 @@ DocType: Sales Invoice,Payment Due Date,支払期日
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",予約数量:販売用に数量が注文されていますが、納品されていません。
|
||||
DocType: Drug Prescription,Interval UOM,インターバル単位
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",選択したアドレスが保存後に編集された場合は、再選択します。
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,外注の予約数量:外注品目を作成するための原料数量。
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,外注の予約数量:外注品目を作成するための原料数量。
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,アイテムバリエーション{0}は既に同じ属性で存在しています
|
||||
DocType: Item,Hub Publishing Details,ハブ公開の詳細
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',「オープニング」
|
||||
|
Can't render this file because it is too large.
|
@ -1553,7 +1553,7 @@ DocType: Sales Invoice,Payment Due Date,ការទូទាត់កាលប
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Qty បានបម្រុងទុក: បរិមាណបានបញ្ជាទិញសម្រាប់លក់ប៉ុន្តែមិនបានប្រគល់ឱ្យទេ។
|
||||
DocType: Drug Prescription,Interval UOM,ចន្លោះពេលវេលា UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",ជ្រើសរើសបើអាសយដ្ឋានដែលបានជ្រើសត្រូវបានកែសម្រួលបន្ទាប់ពីរក្សាទុក
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty ដែលបានបម្រុងទុកសម្រាប់កិច្ចសន្យារង: បរិមាណវត្ថុធាតុដើមដើម្បីធ្វើឱ្យវត្ថុរង។
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty ដែលបានបម្រុងទុកសម្រាប់កិច្ចសន្យារង: បរិមាណវត្ថុធាតុដើមដើម្បីធ្វើឱ្យវត្ថុរង។
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ធាតុវ៉ារ្យង់ {0} រួចហើយដែលមានគុណលក្ខណៈដូចគ្នា
|
||||
DocType: Item,Hub Publishing Details,ពត៌មានលម្អិតការបោះពុម្ព
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"ការបើក"
|
||||
|
Can't render this file because it is too large.
|
@ -1572,7 +1572,7 @@ DocType: Sales Invoice,Payment Due Date,ಪಾವತಿ ಕಾರಣ ದಿನ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ ಪ್ರಮಾಣ: ಪ್ರಮಾಣ ಮಾರಾಟ ಆದೇಶ , ಆದರೆ ಈಡೇರಿಸಿಲ್ಲ ."
|
||||
DocType: Drug Prescription,Interval UOM,ಮಧ್ಯಂತರ UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","ಆಯ್ಕೆ ಮಾಡಿದ ವಿಳಾಸವನ್ನು ಉಳಿಸಿದ ನಂತರ ಸಂಪಾದಿಸಿದ್ದರೆ, ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,ಉಪಗುತ್ತಿಗೆಗಾಗಿ ಕ್ಯೂಟಿ ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ: ಉಪಕೋಟ್ರಾಕ್ಟ್ ವಸ್ತುಗಳನ್ನು ತಯಾರಿಸಲು ಕಚ್ಚಾ ವಸ್ತುಗಳ ಪ್ರಮಾಣ.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,ಉಪಗುತ್ತಿಗೆಗಾಗಿ ಕ್ಯೂಟಿ ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ: ಉಪಕೋಟ್ರಾಕ್ಟ್ ವಸ್ತುಗಳನ್ನು ತಯಾರಿಸಲು ಕಚ್ಚಾ ವಸ್ತುಗಳ ಪ್ರಮಾಣ.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ಐಟಂ ಭಿನ್ನ {0} ಈಗಾಗಲೇ ಅದೇ ಲಕ್ಷಣಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದರೆ
|
||||
DocType: Item,Hub Publishing Details,ಹಬ್ ಪಬ್ಲಿಷಿಂಗ್ ವಿವರಗಳು
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',ಉದ್ಘಾಟಿಸುತ್ತಿರುವುದು
|
||||
|
Can't render this file because it is too large.
|
@ -1594,7 +1594,7 @@ DocType: Sales Invoice,Payment Due Date,지불 기한
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","예약 수량 : 수량 판매를 위해 주문,하지만 배달되지 않습니다."
|
||||
DocType: Drug Prescription,Interval UOM,간격 UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",저장 후 선택한 주소를 다시 선택한 경우 다시 선택하십시오.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,외주 용 예약 수량 : 추심 품목을 만들기위한 원자재 수량.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,외주 용 예약 수량 : 추심 품목을 만들기위한 원자재 수량.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,항목 변형 {0} 이미 동일한 속성을 가진 존재
|
||||
DocType: Item,Hub Publishing Details,허브 출판 세부 정보
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','열기'
|
||||
|
Can't render this file because it is too large.
|
@ -1551,7 +1551,7 @@ DocType: Sales Invoice,Payment Due Date,Payment Date ji ber
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Qty Reserve: Quantity ferman da firotanê, lê nehatiye radest kirin."
|
||||
DocType: Drug Prescription,Interval UOM,UOM Interfer
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Hilbijêre, eger navnîşana bijartî piştî tomarkirinê hate guherandin"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qiyama Reserve ji bo Nekokkêşanê: Kêmasiya madeyên xav ji bo çêkirina tiştên subcotracted.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qiyama Reserve ji bo Nekokkêşanê: Kêmasiya madeyên xav ji bo çêkirina tiştên subcontracted.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Babetê Variant {0} ji xwe bi taybetmendiyên xwe heman heye
|
||||
DocType: Item,Hub Publishing Details,Agahdariyên Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Dergeh'
|
||||
|
Can't render this file because it is too large.
|
@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,ການຊໍາລະເງິນກ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Qty ທີ່ສະຫງວນໄວ້: ຈຳ ນວນທີ່ສັ່ງຊື້, ແຕ່ບໍ່ໄດ້ສົ່ງ."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","ແກ້ໄຂ, ຖ້າຫາກວ່າທີ່ຢູ່ທີ່ເລືອກໄດ້ຖືກແກ້ໄຂຫຼັງຈາກທີ່ບັນທຶກ"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty ທີ່ສະຫງວນໄວ້ ສຳ ລັບສັນຍາຍ່ອຍ: ປະລິມານວັດຖຸດິບເພື່ອຜະລິດສິນຄ້າຍ່ອຍ.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty ທີ່ສະຫງວນໄວ້ ສຳ ລັບສັນຍາຍ່ອຍ: ປະລິມານວັດຖຸດິບເພື່ອຜະລິດສິນຄ້າຍ່ອຍ.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ລາຍການ Variant {0} ມີຢູ່ແລ້ວກັບຄຸນລັກສະນະດຽວກັນ
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing Details
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"ເປີດ '
|
||||
|
Can't render this file because it is too large.
|
@ -1575,7 +1575,7 @@ DocType: Sales Invoice,Payment Due Date,Sumokėti iki
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervuotas kiekis: Parduodamas kiekis, bet nepristatytas."
|
||||
DocType: Drug Prescription,Interval UOM,Intervalas UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Iš naujo pažymėkite, jei pasirinktas adresas yra redaguotas po įrašymo"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Subrangos užsakytas kiekis: Žaliavų kiekis, iš kurio gaminami subtraktoriai."
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Subrangos užsakytas kiekis: Žaliavų kiekis, iš kurio gaminami subtraktoriai."
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Prekė variantas {0} jau egzistuoja su tais pačiais atributais
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing duomenys
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Atidarymas"
|
||||
|
Can't render this file because it is too large.
|
@ -1572,7 +1572,7 @@ DocType: Sales Invoice,Payment Due Date,Maksājuma Due Date
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Daudzums: pasūtīts pārdod daudzums, bet nav sniegusi."
|
||||
DocType: Drug Prescription,Interval UOM,Intervāls UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Atkārtoti atlasiet, ja pēc saglabāšanas izvēlētā adrese tiek rediģēta"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Rezervētais daudzums apakšlīgumam: Izejvielu daudzums, lai izgatavotu apakšsavilkumus."
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Rezervētais daudzums apakšlīgumam: Izejvielu daudzums, lai izgatavotu apakšsavilkumus."
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Postenis Variant {0} jau eksistē ar tiem pašiem atribūtiem
|
||||
DocType: Item,Hub Publishing Details,Hub Publicēšanas informācija
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Atklāšana"
|
||||
|
Can't render this file because it is too large.
|
@ -1563,7 +1563,7 @@ DocType: Sales Invoice,Payment Due Date,Плаќање најдоцна до Д
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Резервирана количина: Количина нарачана за продажба, но не е доставена."
|
||||
DocType: Drug Prescription,Interval UOM,Интервал UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Ресетирај, ако избраната адреса е изменета по зачувување"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Резервирана количина за подизведувач: Количина на суровини за да се направат супструктивни производи.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Резервирана количина за подизведувач: Количина на суровини за да се направат супструктивни производи.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Ставка Варијанта {0} веќе постои со истите атрибути
|
||||
DocType: Item,Hub Publishing Details,Детали за објавување на центар
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Отворање'
|
||||
|
Can't render this file because it is too large.
|
@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,പെയ്മെന്റ് നിശ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","റിസർവ്വ് ചെയ്ത ക്യൂട്ടി: അളവ് വിൽപ്പനയ്ക്ക് ഓർഡർ ചെയ്തു, പക്ഷേ വിതരണം ചെയ്തിട്ടില്ല."
|
||||
DocType: Drug Prescription,Interval UOM,ഇടവേള UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","തിരഞ്ഞെടുത്തതിനുശേഷം തിരഞ്ഞെടുത്ത വിലാസം എഡിറ്റുചെയ്തിട്ടുണ്ടെങ്കിൽ, തിരഞ്ഞെടുപ്പ് മാറ്റുക"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,സബ് കോൺട്രാക്റ്റിനായി റിസർവ്വ് ചെയ്ത ക്യൂട്ടി: സബ്കോട്രാക്റ്റ് ഇനങ്ങൾ നിർമ്മിക്കുന്നതിനുള്ള അസംസ്കൃത വസ്തുക്കളുടെ അളവ്.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,സബ് കോൺട്രാക്റ്റിനായി റിസർവ്വ് ചെയ്ത ക്യൂട്ടി: സബ്കോട്രാക്റ്റ് ഇനങ്ങൾ നിർമ്മിക്കുന്നതിനുള്ള അസംസ്കൃത വസ്തുക്കളുടെ അളവ്.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ഇനം വേരിയന്റ് {0} ഇതിനകം അതേ ആട്രിബ്യൂട്ടുകളുമുള്ള നിലവിലുണ്ട്
|
||||
DocType: Item,Hub Publishing Details,ഹബ് പബ്ലിഷിംഗ് വിശദാംശങ്ങൾ
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','തുറക്കുന്നു'
|
||||
|
Can't render this file because it is too large.
|
@ -1557,7 +1557,7 @@ DocType: Sales Invoice,Payment Due Date,पैसे भरण्याची
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","आरक्षित मात्रा: विक्रीचे आदेश दिले, पण दिले नाहीत."
|
||||
DocType: Drug Prescription,Interval UOM,मध्यांतर UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","निवड रद्द केलेला पत्ता जतन केल्यानंतर संपादित केले असल्यास, निवड रद्द करा"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,सब कॉन्ट्रॅक्टसाठी राखीव क्वाटीटी: सबकोट्रेक्ट केलेल्या वस्तू तयार करण्यासाठी कच्च्या मालाचे प्रमाण.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,सब कॉन्ट्रॅक्टसाठी राखीव क्वाटीटी: सबकोट्रेक्ट केलेल्या वस्तू तयार करण्यासाठी कच्च्या मालाचे प्रमाण.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,आयटम व्हेरियंट {0} आधीच समान गुणधर्म अस्तित्वात आहे
|
||||
DocType: Item,Hub Publishing Details,हब प्रकाशन तपशील
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','उघडणे'
|
||||
|
Can't render this file because it is too large.
|
@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,Tarikh Pembayaran
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Dicadangkan Qty: Kuantiti yang dipesan untuk dijual, tetapi tidak dihantar."
|
||||
DocType: Drug Prescription,Interval UOM,Selang UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Pilih semula, jika alamat yang dipilih disunting selepas menyimpan"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Dicadangkan Qty untuk Subkontrak: Kuantiti bahan mentah untuk membuat item subcotracted.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Dicadangkan Qty untuk Subkontrak: Kuantiti bahan mentah untuk membuat item subcontracted.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Perkara Variant {0} telah wujud dengan sifat-sifat yang sama
|
||||
DocType: Item,Hub Publishing Details,Butiran Penerbitan Hab
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Pembukaan'
|
||||
|
Can't render this file because it is too large.
|
@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,ငွေပေးချေမှုရ
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",ချုပ်ထိန်းထားသည်အရည်အတွက်: QUANTITY ရောင်းရန်အမိန့်ထုတ်ပေမယ့်လက်သို့အပ်ဘူး။
|
||||
DocType: Drug Prescription,Interval UOM,ကြားကာလ UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Reselect, ရွေးကောက်တော်မူသောလိပ်စာမှတပါးပြီးနောက် edited လျှင်"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Subcontract အဘို့အချုပ်ထိန်းထားသည်အရည်အတွက်: subcotracted ပစ္စည်းများလုပ်ကုန်ကြမ်းအရေအတွက်။
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Subcontract အဘို့အချုပ်ထိန်းထားသည်အရည်အတွက်: subcontracted ပစ္စည်းများလုပ်ကုန်ကြမ်းအရေအတွက်။
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,item Variant {0} ပြီးသားအတူတူ Attribute တွေနှင့်အတူတည်ရှိမှု့
|
||||
DocType: Item,Hub Publishing Details,hub ထုတ်ဝေရေးအသေးစိတ်
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','' ဖွင့်ပွဲ ''
|
||||
|
Can't render this file because it is too large.
|
@ -1591,7 +1591,7 @@ DocType: Sales Invoice,Payment Due Date,Betaling Vervaldatum
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Gereserveerde Hoeveelheid: Aantal toegewezen aan verkoop, maar nog niet geleverd."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Selecteer opnieuw, als het gekozen adres is bewerkt na opslaan"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Gereserveerde hoeveelheid voor onderaanneming: hoeveelheid grondstoffen voor het maken van artikelen die zijn ondergetrokken.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Gereserveerde hoeveelheid voor onderaanneming: hoeveelheid grondstoffen voor het maken van artikelen die zijn ondergetrokken.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artikel Variant {0} bestaat al met dezelfde kenmerken
|
||||
DocType: Item,Hub Publishing Details,Hub publicatie details
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Opening'
|
||||
|
Can't render this file because it is too large.
|
@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,Betalingsfrist
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservert antall: Antall bestilt for salg, men ikke levert."
|
||||
DocType: Drug Prescription,Interval UOM,Intervall UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",Velg hvis den valgte adressen redigeres etter lagre
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reservert antall for underleveranser: Råvaremengde for å lage underleverandørvarer.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reservert antall for underleveranser: Råvaremengde for å lage underleverandørvarer.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Sak Variant {0} finnes allerede med samme attributtene
|
||||
DocType: Item,Hub Publishing Details,Hub Publishing Detaljer
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Opening"
|
||||
|
Can't render this file because it is too large.
|
@ -1595,7 +1595,7 @@ DocType: Sales Invoice,Payment Due Date,Termin Płatności
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",
|
||||
DocType: Drug Prescription,Interval UOM,Interwał UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Ponownie wybierz, jeśli wybrany adres jest edytowany po zapisaniu"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Zarezerwowana ilość na zlecenie podwykonawstwa: ilość surowców do produkcji artykułów objętych subkontraktami.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Zarezerwowana ilość na zlecenie podwykonawstwa: ilość surowców do produkcji artykułów objętych subkontraktami.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Pozycja Wersja {0} istnieje już z samymi atrybutami
|
||||
DocType: Item,Hub Publishing Details,Szczegóły publikacji wydawnictwa Hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Otwarcie"
|
||||
|
Can't render this file because it is too large.
|
@ -1550,7 +1550,7 @@ DocType: Sales Invoice,Payment Due Date,د پیسو له امله نېټه
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",خوندي مقدار: مقدار د پلور لپاره امر کړی ، مګر تحویلی شوی نه دی.
|
||||
DocType: Drug Prescription,Interval UOM,د UOM منځګړیتوب
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",بې ځایه کړئ، که چیرې غوره شوي پتې د خوندي کولو وروسته سمبال شي
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,د فرعي تړون لپاره خوندي مقدار: د فرعي محصولاتو جوړولو لپاره د خامو موادو مقدار.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,د فرعي تړون لپاره خوندي مقدار: د فرعي محصولاتو جوړولو لپاره د خامو موادو مقدار.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,د قالب variant {0} لا د همدې صفتونو شتون لري
|
||||
DocType: Item,Hub Publishing Details,د هوب د خپرولو توضیحات
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','پرانیستل'
|
||||
|
Can't render this file because it is too large.
|
@ -1589,7 +1589,7 @@ DocType: Sales Invoice,Payment Due Date,Data Limite de Pagamento
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Gereserveerd Aantal : Aantal besteld te koop , maar niet geleverd ."
|
||||
DocType: Drug Prescription,Interval UOM,UOM Intervalo
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save","Reseleccione, se o endereço escolhido for editado após salvar"
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qtd reservada para subcontratação: quantidade de matérias-primas para fazer itens subcotados.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qtd reservada para subcontratação: quantidade de matérias-primas para fazer itens subcotados.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,A Variante do Item {0} já existe com mesmos atributos
|
||||
DocType: Item,Hub Publishing Details,Detalhes da publicação do hub
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Abertura'
|
||||
|
Can't render this file because it is too large.
|
@ -1594,7 +1594,7 @@ DocType: Sales Invoice,Payment Due Date,Data scadentă de plată
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervate Cantitate: Cantitatea comandat de vânzare, dar nu livrat."
|
||||
DocType: Drug Prescription,Interval UOM,Interval UOM
|
||||
DocType: Customer,"Reselect, if the chosen address is edited after save",Resetați dacă adresa editată este editată după salvare
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Cantitate rezervată pentru subcontract: cantitate de materii prime pentru a face obiecte subcontractate.
|
||||
apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Cantitate rezervată pentru subcontract: cantitate de materii prime pentru a face obiecte subcontractate.
|
||||
apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Postul Varianta {0} există deja cu aceleași atribute
|
||||
DocType: Item,Hub Publishing Details,Detalii privind publicarea Hubului
|
||||
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Deschiderea"
|
||||
|
Can't render this file because it is too large.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user