Merge branch 'master' of github.com:webnotes/erpnext into cleanup

This commit is contained in:
Rushabh Mehta 2013-10-31 15:16:05 +05:30
commit bed14d7fa4
12 changed files with 101 additions and 101 deletions

View File

@ -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",

View File

@ -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

View File

@ -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):

View File

@ -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"

View File

@ -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,

View File

@ -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]

View File

@ -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];

View File

@ -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`

View File

@ -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"""

View 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 Data Import Template
2 Table: Item Price
3
4
5 Notes:
6 Please do not change the template headings.
7 First data column must be blank.
8 If you are uploading new records, leave the "name"" (ID) column blank."
9 If you are uploading new records, "Naming Series"" becomes mandatory if present."
10 Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.
11 For updating, you can update only selective columns.
12 You can only upload upto 5000 records in one go. (may be less in some cases)
13
14 DocType: Item Price
15 Column Labels: ID Price List Item Code Rate Valid for Buying or Selling? Item Name Item Description
16 Column Name: name price_list item_code ref_rate buying_or_selling item_name item_description
17 Mandatory: Yes Yes Yes Yes No No No
18 Type: Data (text) Link Link Currency Select Data Text
19 Info: Valid Price List Valid Item One of: Selling, Buying
20 Start entering data below this line
21 Standard Buying Base Bearing Plate 15 Buying
22 Standard Buying Base Plate 20 Buying
23 Standard Buying Bearing Block 10 Buying
24 Standard Buying Bearing Collar 20 Buying
25 Standard Buying Bearing Pipe 15 Buying
26 Standard Buying Blade Rib 10 Buying
27 Standard Buying Disc Collars 74 Buying
28 Standard Buying External Disc 45 Buying
29 Standard Buying Internal Disc 33 Buying
30 Standard Buying Shaft 30 Buying
31 Standard Buying Stand 40 Buying
32 Standard Buying Upper Bearing Plate 50 Buying
33 Standard Buying Wing Sheet 22 Buying
34 Standard Selling Wind Turbine 21 Selling
35 Standard Selling Wind Mill A Series 28 Selling
36 Standard Selling Wind MIll C Series 14 Selling
37 Standard Selling Base Bearing Plate 28 Selling
38 Standard Selling Base Plate 21 Selling
39 Standard Selling Bearing Block 14 Selling
40 Standard Selling Bearing Collar 103.6 Selling
41 Standard Selling Bearing Pipe 63 Selling
42 Standard Selling Blade Rib 46.2 Selling
43 Standard Selling Disc Collars 42 Selling
44 Standard Selling External Disc 56 Selling
45 Standard Selling Internal Disc 70 Selling
46 Standard Selling Shaft 340 Selling
47 Standard Selling Stand 400 Selling
48 Standard Selling Upper Bearing Plate 300 Selling
49 Standard Selling Wing Sheet 30.8 Selling

View File

@ -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
1 Data Import Template
2 Table: Price List
3
4
5 Notes:
6 Please do not change the template headings.
7 First data column must be blank.
8 If you are uploading new records, leave the "name" (ID) column blank.
9 If you are uploading new records, "Naming Series" becomes mandatory, if present.
10 Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.
11 For updating, you can update only selective columns.
12 You can only upload upto 5000 records in one go. (may be less in some cases)
13
14 DocType: Price List ~ For Territory valid_for_territories ~ Item Price item_prices
15 Column Labels: ID Price List Name Currency Valid for Buying or Selling? ID Territory ID Item Code Rate
16 Column Name: name price_list_name currency buying_or_selling ~ name territory ~ name item_code ref_rate
17 Mandatory: Yes Yes Yes Yes Yes Yes Yes Yes Yes
18 Type: Data (text) Data Link Select Data Link Data Link Currency
19 Info: Valid Currency One of: Buying, Selling Leave blank for new records Valid Territory Leave blank for new records Valid Item
20 Start entering data below this line
21 Standard Buying Standard Buying USD Buying United States Base Bearing Plate 15
22 Base Plate 20
23 Bearing Block 10
24 Bearing Collar 20
25 Bearing Pipe 15
26 Blade Rib 10
27 Disc Collars 74
28 External Disc 45
29 Internal Disc 33
30 Shaft 30
31 Stand 40
32 Upper Bearing Plate 50
33 Wing Sheet 22
34 Standard Selling Standard Selling USD Selling United States Wind Turbine 21
35 Wind Mill A Series 28
36 Wind MIll C Series 14
37 Base Bearing Plate 28
38 Base Plate 21
39 Bearing Block 14
40 Bearing Collar 103.6
41 Bearing Pipe 63
42 Blade Rib 46.2
43 Disc Collars 42
44 External Disc 56
45 Internal Disc 70
46 Shaft 340
47 Stand 400
48 Upper Bearing Plate 300
49 Wing Sheet 30.8

View File

@ -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"])