Merge branch 'master' of github.com:webnotes/erpnext into cleanup
This commit is contained in:
commit
bed14d7fa4
@ -6,7 +6,6 @@ test_records = [
|
||||
"doctype": "POS Setting",
|
||||
"name": "_Test POS Setting",
|
||||
"currency": "INR",
|
||||
"conversion_rate": 1.0,
|
||||
"selling_price_list": "_Test Price List",
|
||||
"company": "_Test Company",
|
||||
"warehouse": "_Test Warehouse - _TC",
|
||||
|
@ -338,11 +338,14 @@ class DocType(BuyingController):
|
||||
)
|
||||
|
||||
# accumulate valuation tax
|
||||
if tax.category in ("Valuation", "Valuation and Total") and flt(tax.tax_amount) \
|
||||
and tax.cost_center:
|
||||
valuation_tax.setdefault(tax.cost_center, 0)
|
||||
valuation_tax[tax.cost_center] += \
|
||||
(tax.add_deduct_tax == "Add" and 1 or -1) * flt(tax.tax_amount)
|
||||
if tax.category in ("Valuation", "Valuation and Total") and flt(tax.tax_amount):
|
||||
if auto_accounting_for_stock and not tax.cost_center:
|
||||
webnotes.throw(_("Row %(row)s: Cost Center is mandatory \
|
||||
if tax/charges category is Valuation or Valuation and Total" %
|
||||
{"row": tax.idx}))
|
||||
valuation_tax.setdefault(tax.cost_center, 0)
|
||||
valuation_tax[tax.cost_center] += \
|
||||
(tax.add_deduct_tax == "Add" and 1 or -1) * flt(tax.tax_amount)
|
||||
|
||||
# item gl entries
|
||||
stock_item_and_auto_accounting_for_stock = False
|
||||
|
@ -100,7 +100,7 @@ class DocType:
|
||||
except webnotes.DuplicateEntryError, e:
|
||||
# already exists
|
||||
pass
|
||||
|
||||
profile_wrapper.ignore_permissions = True
|
||||
profile_wrapper.save()
|
||||
|
||||
def validate_date(self):
|
||||
|
@ -19,6 +19,7 @@ requirements = [
|
||||
"requests",
|
||||
"chardet",
|
||||
"dropbox",
|
||||
"Werkzeug",
|
||||
"google-api-python-client ",
|
||||
"pygeoip"
|
||||
]
|
||||
@ -113,12 +114,6 @@ def install_using_yum():
|
||||
def update_config_for_redhat():
|
||||
import re
|
||||
|
||||
# update memcache user
|
||||
with open("/etc/sysconfig/memcached", "r") as original:
|
||||
memcached_conf = original.read()
|
||||
with open("/etc/sysconfig/memcached", "w") as modified:
|
||||
modified.write(re.sub('USER.*', 'USER="%s"' % apache_user, memcached_conf))
|
||||
|
||||
# set to autostart on startup
|
||||
for service in ("mysqld", "httpd", "memcached", "ntpd"):
|
||||
exec_in_shell("chkconfig --level 2345 %s on" % service)
|
||||
@ -132,6 +127,11 @@ def install_using_apt():
|
||||
print packages
|
||||
print "-"*80
|
||||
exec_in_shell("apt-get install -y %s" % packages)
|
||||
global root_password
|
||||
if not root_password:
|
||||
root_password = get_root_password()
|
||||
exec_in_shell("echo mysql-server mysql-server/root_password password %s | sudo debconf-set-selections" % root_password)
|
||||
exec_in_shell("echo mysql-server mysql-server/root_password_again password %s | sudo debconf-set-selections" % root_password)
|
||||
|
||||
if not exec_in_shell("which mysql"):
|
||||
packages = "mysql-server libmysqlclient-dev"
|
||||
@ -141,20 +141,12 @@ def install_using_apt():
|
||||
update_config_for_debian()
|
||||
|
||||
def update_config_for_debian():
|
||||
|
||||
# update memcache user
|
||||
with open("/etc/memcached.conf", "r") as original:
|
||||
memcached_conf = original.read()
|
||||
with open("/etc/memcached.conf", "w") as modified:
|
||||
modified.write(memcached_conf.replace("-u memcache", "-u %s" % apache_user))
|
||||
|
||||
for service in ("mysql", "memcached", "ntpd"):
|
||||
for service in ("mysql", "ntpd"):
|
||||
exec_in_shell("service %s restart" % service)
|
||||
|
||||
def install_python_modules():
|
||||
print "-"*80
|
||||
print "Installing Python Modules: (This may take some time)"
|
||||
print python_modules
|
||||
print "-"*80
|
||||
|
||||
if not exec_in_shell("which pip"):
|
||||
@ -163,7 +155,7 @@ def install_python_modules():
|
||||
exec_in_shell("pip install --upgrade pip")
|
||||
exec_in_shell("pip install --upgrade setuptools")
|
||||
exec_in_shell("pip install --upgrade virtualenv")
|
||||
exec_in_shell("pip install -r {}".format(' '.join(requirements)))
|
||||
exec_in_shell("pip install {}".format(' '.join(requirements)))
|
||||
|
||||
def install_erpnext(install_path):
|
||||
print
|
||||
@ -208,7 +200,7 @@ def setup_folders(install_path):
|
||||
app = os.path.join(install_path, "app")
|
||||
if not os.path.exists(app):
|
||||
print "Cloning erpnext"
|
||||
exec_in_shell("cd %s && git clone https://github.com/webnotes/erpnext.git app && cd app && git checkout wsgi" % install_path)
|
||||
exec_in_shell("cd %s && git clone https://github.com/webnotes/erpnext.git app" % install_path)
|
||||
exec_in_shell("cd app && git config core.filemode false")
|
||||
if not os.path.exists(app):
|
||||
raise Exception, "Couldn't clone erpnext repository"
|
||||
@ -216,7 +208,7 @@ def setup_folders(install_path):
|
||||
lib = os.path.join(install_path, "lib")
|
||||
if not os.path.exists(lib):
|
||||
print "Cloning wnframework"
|
||||
exec_in_shell("cd %s && git clone https://github.com/webnotes/wnframework.git lib && cd lib && git checkout wsgi" % install_path)
|
||||
exec_in_shell("cd %s && git clone https://github.com/webnotes/wnframework.git lib" % install_path)
|
||||
exec_in_shell("cd lib && git config core.filemode false")
|
||||
if not os.path.exists(lib):
|
||||
raise Exception, "Couldn't clone wnframework repository"
|
||||
|
@ -409,7 +409,8 @@ def get_bom_items_as_dict(bom, qty=1, fetch_exploded=1):
|
||||
item_dict = {}
|
||||
|
||||
query = """select
|
||||
bom_item.item_code,
|
||||
bom_item.item_code,
|
||||
item.item_name,
|
||||
ifnull(sum(bom_item.qty_consumed_per_unit),0) * %(qty)s as qty,
|
||||
item.description,
|
||||
item.stock_uom,
|
||||
|
@ -133,16 +133,16 @@ class DocType:
|
||||
|
||||
@webnotes.whitelist()
|
||||
def get_item_details(item):
|
||||
res = webnotes.conn.sql("""select stock_uom
|
||||
res = webnotes.conn.sql("""select stock_uom, description
|
||||
from `tabItem` where (ifnull(end_of_life, "")="" or end_of_life > now())
|
||||
and name=%s""", (item,), as_dict=1)
|
||||
and name=%s""", item, as_dict=1)
|
||||
|
||||
if not res:
|
||||
return {}
|
||||
|
||||
res = res[0]
|
||||
bom = webnotes.conn.sql("""select name from `tabBOM` where item=%s
|
||||
and ifnull(is_default, 0)=1""", (item,))
|
||||
and ifnull(is_default, 0)=1""", item)
|
||||
if bom:
|
||||
res.bom_no = bom[0][0]
|
||||
|
||||
|
@ -174,7 +174,7 @@ erpnext.AccountTreeGrid = wn.views.TreeGridReport.extend({
|
||||
var me= this;
|
||||
$.each(this.data, function(i, account) {
|
||||
// update groups
|
||||
if(account.rgt - account.lft == 1) {
|
||||
if((account.group_or_ledger == "Ledger") || (account.rgt - account.lft == 1)) {
|
||||
var parent = me.parent_map[account.name];
|
||||
while(parent) {
|
||||
var parent_account = me.item_by_name[parent];
|
||||
|
@ -13,23 +13,18 @@ class DocType:
|
||||
def __init__(self, d, dl):
|
||||
self.doc, self.doclist = d, dl
|
||||
|
||||
def on_update(self):
|
||||
def validate(self):
|
||||
self.check_duplicate_item()
|
||||
self.update_price_list_details()
|
||||
self.update_item_details()
|
||||
self.check_duplicate_item()
|
||||
|
||||
def update_price_list_details(self):
|
||||
self.doc.buying_or_selling = webnotes.conn.get_value("Price List", self.doc.price_list,
|
||||
"buying_or_selling")
|
||||
|
||||
self.doc.currency = webnotes.conn.get_value("Price List", self.doc.price_list,
|
||||
"currency")
|
||||
self.doc.buying_or_selling, self.doc.currency = webnotes.conn.get_value("Price List",
|
||||
self.doc.price_list, ["buying_or_selling", "currency"])
|
||||
|
||||
def update_item_details(self):
|
||||
self.doc.item_name = webnotes.conn.get_value("Item", self.doc.item_code, "item_name")
|
||||
|
||||
self.doc.item_description = webnotes.conn.get_value("Item", self.doc.item_code,
|
||||
"description")
|
||||
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item",
|
||||
self.doc.item_code, ["item_name", "description"])
|
||||
|
||||
def check_duplicate_item(self):
|
||||
if webnotes.conn.sql("""select name from `tabItem Price`
|
||||
|
@ -451,35 +451,44 @@ class DocType(StockController):
|
||||
item["to_warehouse"] = ""
|
||||
|
||||
# add raw materials to Stock Entry Detail table
|
||||
self.add_to_stock_entry_detail(item_dict)
|
||||
idx = self.add_to_stock_entry_detail(item_dict)
|
||||
|
||||
# add finished good item to Stock Entry Detail table -- along with bom_no
|
||||
if self.doc.production_order and self.doc.purpose == "Manufacture/Repack":
|
||||
item = webnotes.conn.get_value("Item", pro_obj.doc.production_item, ["item_name",
|
||||
"description", "stock_uom", "purchase_account", "cost_center"], as_dict=1)
|
||||
self.add_to_stock_entry_detail({
|
||||
cstr(pro_obj.doc.production_item): {
|
||||
"to_warehouse": pro_obj.doc.fg_warehouse,
|
||||
"from_warehouse": "",
|
||||
"qty": self.doc.fg_completed_qty,
|
||||
"description": pro_obj.doc.description,
|
||||
"stock_uom": pro_obj.doc.stock_uom
|
||||
"item_name": item.item_name,
|
||||
"description": item.description,
|
||||
"stock_uom": item.stock_uom,
|
||||
"expense_account": item.purchase_account,
|
||||
"cost_center": item.cost_center,
|
||||
}
|
||||
}, bom_no=pro_obj.doc.bom_no)
|
||||
}, bom_no=pro_obj.doc.bom_no, idx=idx)
|
||||
|
||||
elif self.doc.purpose in ["Material Receipt", "Manufacture/Repack"]:
|
||||
if self.doc.purpose=="Material Receipt":
|
||||
self.doc.from_warehouse = ""
|
||||
|
||||
item = webnotes.conn.sql("""select name, item_name, description, uom
|
||||
from `tabItem` where name=%s""", (self.doc.bom_no), as_dict=1)
|
||||
item = webnotes.conn.sql("""select name, item_name, description,
|
||||
uom, purchase_account, cost_center from `tabItem`
|
||||
where name=(select item from tabBOM where name=%s)""",
|
||||
self.doc.bom_no, as_dict=1)
|
||||
self.add_to_stock_entry_detail({
|
||||
item[0]["item"] : {
|
||||
"qty": self.doc.fg_completed_qty,
|
||||
"item_name": item[0].item_name,
|
||||
"description": item[0]["description"],
|
||||
"stock_uom": item[0]["uom"],
|
||||
"from_warehouse": ""
|
||||
"from_warehouse": "",
|
||||
"expense_account": item[0].purchase_account,
|
||||
"cost_center": item[0].cost_center,
|
||||
}
|
||||
}, bom_no=self.doc.bom_no)
|
||||
}, bom_no=self.doc.bom_no, idx=idx)
|
||||
|
||||
self.get_stock_and_rate()
|
||||
|
||||
@ -543,8 +552,8 @@ class DocType(StockController):
|
||||
|
||||
return issued_item_qty
|
||||
|
||||
def add_to_stock_entry_detail(self, item_dict, bom_no=None):
|
||||
idx = 1
|
||||
def add_to_stock_entry_detail(self, item_dict, bom_no=None, idx=None):
|
||||
if not idx: idx = 1
|
||||
expense_account, cost_center = webnotes.conn.get_values("Company", self.doc.company, \
|
||||
["default_expense_account", "cost_center"])[0]
|
||||
|
||||
@ -572,6 +581,7 @@ class DocType(StockController):
|
||||
|
||||
# increment idx by 1
|
||||
idx += 1
|
||||
return idx
|
||||
|
||||
def get_cust_values(self):
|
||||
"""fetches customer details"""
|
||||
|
49
utilities/demo/demo_docs/Item_Price.csv
Normal file
49
utilities/demo/demo_docs/Item_Price.csv
Normal file
@ -0,0 +1,49 @@
|
||||
Data Import Template,,,,,,,
|
||||
Table:,Item Price,,,,,,
|
||||
,,,,,,,
|
||||
,,,,,,,
|
||||
Notes:,,,,,,,
|
||||
Please do not change the template headings.,,,,,,,
|
||||
First data column must be blank.,,,,,,,
|
||||
"If you are uploading new records, leave the ""name"""" (ID) column blank.""",,,,,,,
|
||||
"If you are uploading new records, ""Naming Series"""" becomes mandatory"," if present.""",,,,,,
|
||||
Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.,,,,,,,
|
||||
"For updating, you can update only selective columns.",,,,,,,
|
||||
You can only upload upto 5000 records in one go. (may be less in some cases),,,,,,,
|
||||
,,,,,,,
|
||||
DocType:,Item Price,,,,,,
|
||||
Column Labels:,ID,Price List,Item Code,Rate,Valid for Buying or Selling?,Item Name,Item Description
|
||||
Column Name:,name,price_list,item_code,ref_rate,buying_or_selling,item_name,item_description
|
||||
Mandatory:,Yes,Yes,Yes,Yes,No,No,No
|
||||
Type:,Data (text),Link,Link,Currency,Select,Data,Text
|
||||
Info:,,Valid Price List,Valid Item,,"One of: Selling, Buying",,
|
||||
Start entering data below this line,,,,,,,
|
||||
,,Standard Buying,Base Bearing Plate,15,Buying,,
|
||||
,,Standard Buying,Base Plate,20,Buying,,
|
||||
,,Standard Buying,Bearing Block,10,Buying,,
|
||||
,,Standard Buying,Bearing Collar,20,Buying,,
|
||||
,,Standard Buying,Bearing Pipe,15,Buying,,
|
||||
,,Standard Buying,Blade Rib,10,Buying,,
|
||||
,,Standard Buying,Disc Collars,74,Buying,,
|
||||
,,Standard Buying,External Disc,45,Buying,,
|
||||
,,Standard Buying,Internal Disc,33,Buying,,
|
||||
,,Standard Buying,Shaft,30,Buying,,
|
||||
,,Standard Buying,Stand,40,Buying,,
|
||||
,,Standard Buying,Upper Bearing Plate,50,Buying,,
|
||||
,,Standard Buying,Wing Sheet,22,Buying,,
|
||||
,,Standard Selling,Wind Turbine,21,Selling,,
|
||||
,,Standard Selling,Wind Mill A Series,28,Selling,,
|
||||
,,Standard Selling,Wind MIll C Series,14,Selling,,
|
||||
,,Standard Selling,Base Bearing Plate,28,Selling,,
|
||||
,,Standard Selling,Base Plate,21,Selling,,
|
||||
,,Standard Selling,Bearing Block,14,Selling,,
|
||||
,,Standard Selling,Bearing Collar,103.6,Selling,,
|
||||
,,Standard Selling,Bearing Pipe,63,Selling,,
|
||||
,,Standard Selling,Blade Rib,46.2,Selling,,
|
||||
,,Standard Selling,Disc Collars,42,Selling,,
|
||||
,,Standard Selling,External Disc,56,Selling,,
|
||||
,,Standard Selling,Internal Disc,70,Selling,,
|
||||
,,Standard Selling,Shaft,340,Selling,,
|
||||
,,Standard Selling,Stand,400,Selling,,
|
||||
,,Standard Selling,Upper Bearing Plate,300,Selling,,
|
||||
,,Standard Selling,Wing Sheet,30.8,Selling,,
|
|
@ -1,49 +0,0 @@
|
||||
Data Import Template,,,,,,,,,,,
|
||||
Table:,Price List,,,,,,,,,,
|
||||
,,,,,,,,,,,
|
||||
,,,,,,,,,,,
|
||||
Notes:,,,,,,,,,,,
|
||||
Please do not change the template headings.,,,,,,,,,,,
|
||||
First data column must be blank.,,,,,,,,,,,
|
||||
"If you are uploading new records, leave the ""name"" (ID) column blank.",,,,,,,,,,,
|
||||
"If you are uploading new records, ""Naming Series"" becomes mandatory, if present.",,,,,,,,,,,
|
||||
Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.,,,,,,,,,,,
|
||||
"For updating, you can update only selective columns.",,,,,,,,,,,
|
||||
You can only upload upto 5000 records in one go. (may be less in some cases),,,,,,,,,,,
|
||||
,,,,,,,,,,,
|
||||
DocType:,Price List,,,,~,For Territory,valid_for_territories,~,Item Price,item_prices,
|
||||
Column Labels:,ID,Price List Name,Currency,Valid for Buying or Selling?,,ID,Territory,,ID,Item Code,Rate
|
||||
Column Name:,name,price_list_name,currency,buying_or_selling,~,name,territory,~,name,item_code,ref_rate
|
||||
Mandatory:,Yes,Yes,Yes,Yes,,Yes,Yes,,Yes,Yes,Yes
|
||||
Type:,Data (text),Data,Link,Select,,Data,Link,,Data,Link,Currency
|
||||
Info:,,,Valid Currency,"One of: Buying, Selling",,Leave blank for new records,Valid Territory,,Leave blank for new records,Valid Item,
|
||||
Start entering data below this line,,,,,,,,,,,
|
||||
,Standard Buying,Standard Buying,USD,Buying,,,United States,,,Base Bearing Plate,15
|
||||
,,,,,,,,,,Base Plate,20
|
||||
,,,,,,,,,,Bearing Block,10
|
||||
,,,,,,,,,,Bearing Collar,20
|
||||
,,,,,,,,,,Bearing Pipe,15
|
||||
,,,,,,,,,,Blade Rib,10
|
||||
,,,,,,,,,,Disc Collars,74
|
||||
,,,,,,,,,,External Disc,45
|
||||
,,,,,,,,,,Internal Disc,33
|
||||
,,,,,,,,,,Shaft,30
|
||||
,,,,,,,,,,Stand,40
|
||||
,,,,,,,,,,Upper Bearing Plate,50
|
||||
,,,,,,,,,,Wing Sheet,22
|
||||
,Standard Selling,Standard Selling,USD,Selling,,,United States,,,Wind Turbine,21
|
||||
,,,,,,,,,,Wind Mill A Series,28
|
||||
,,,,,,,,,,Wind MIll C Series,14
|
||||
,,,,,,,,,,Base Bearing Plate,28
|
||||
,,,,,,,,,,Base Plate,21
|
||||
,,,,,,,,,,Bearing Block,14
|
||||
,,,,,,,,,,Bearing Collar,103.6
|
||||
,,,,,,,,,,Bearing Pipe,63
|
||||
,,,,,,,,,,Blade Rib,46.2
|
||||
,,,,,,,,,,Disc Collars,42
|
||||
,,,,,,,,,,External Disc,56
|
||||
,,,,,,,,,,Internal Disc,70
|
||||
,,,,,,,,,,Shaft,340
|
||||
,,,,,,,,,,Stand,400
|
||||
,,,,,,,,,,Upper Bearing Plate,300
|
||||
,,,,,,,,,,Wing Sheet,30.8
|
|
@ -396,7 +396,7 @@ def make_items():
|
||||
import_data("BOM", submit=True)
|
||||
|
||||
def make_price_lists():
|
||||
import_data("Price_List", overwrite=True)
|
||||
import_data("Item_Price", overwrite=True)
|
||||
|
||||
def make_customers_suppliers_contacts():
|
||||
import_data(["Customer", "Supplier", "Contact", "Address", "Lead"])
|
||||
|
Loading…
x
Reference in New Issue
Block a user