Merge branch 'develop' of https://github.com/frappe/erpnext into develop
This commit is contained in:
commit
20370e1ea5
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a bug encountered while using ERPNext
|
||||
labels: bug
|
||||
---
|
||||
|
||||
<!--
|
||||
Welcome to ERPNext issue tracker! Before creating an issue, please heed the following:
|
||||
|
||||
1. This tracker should only be used to report bugs and request features / enhancements to ERPNext
|
||||
- For questions and general support, checkout the manual https://erpnext.com/docs/user/manual/en or use https://discuss.erpnext.com
|
||||
- For documentation issues, refer to https://github.com/frappe/erpnext_com
|
||||
2. Use the search function before creating a new issue. Duplicates will be closed and directed to
|
||||
the original discussion.
|
||||
3. When making a bug report, make sure you provide all required information. The easier it is for
|
||||
maintainers to reproduce, the faster it'll be fixed.
|
||||
4. If you think you know what the reason for the bug is, share it with us. Maybe put in a PR 😉
|
||||
-->
|
||||
|
||||
## Description of the issue
|
||||
|
||||
## Context information (for bug reports)
|
||||
|
||||
**Output of `bench version`**
|
||||
```
|
||||
(paste here)
|
||||
```
|
||||
|
||||
## Steps to reproduce the issue
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Observed result
|
||||
|
||||
### Expected result
|
||||
|
||||
### Stacktrace / full error message
|
||||
|
||||
```
|
||||
(paste here)
|
||||
```
|
||||
|
||||
## Additional information
|
||||
|
||||
OS version / distribution, `ERPNext` install method, etc.
|
28
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
28
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea to improve ERPNext
|
||||
labels: feature-request
|
||||
---
|
||||
|
||||
<!--
|
||||
Welcome to ERPNext issue tracker! Before creating an issue, please heed the following:
|
||||
|
||||
1. This tracker should only be used to report bugs and request features / enhancements to ERPNext
|
||||
- For questions and general support, checkout the manual https://erpnext.com/docs/user/manual/en or use https://discuss.erpnext.com
|
||||
- For documentation issues, refer to https://github.com/frappe/erpnext_com
|
||||
2. Use the search function before creating a new issue. Duplicates will be closed and directed to
|
||||
the original discussion.
|
||||
3. When making a feature request, make sure to be as verbose as possible. The better you convey your message, the greater the drive to make it happen.
|
||||
-->
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
17
.github/ISSUE_TEMPLATE/question-about-using-erpnext.md
vendored
Normal file
17
.github/ISSUE_TEMPLATE/question-about-using-erpnext.md
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Question about using ERPNext
|
||||
about: This is not the appropriate channel
|
||||
labels: invalid
|
||||
---
|
||||
|
||||
Please post on our forums:
|
||||
|
||||
for questions about using `ERPNext`: https://discuss.erpnext.com
|
||||
|
||||
for questions about using the `Frappe Framework`: https://discuss.frappe.io
|
||||
|
||||
for questions about using `bench`, probably the best place to start is the [bench repo](https://github.com/frappe/bench)
|
||||
|
||||
For documentation issues, use the [ERPNext Documentation](https://erpnext.com/docs/) or [Frappe Framework Documentation](https://frappe.io/docs/user/en) or the [developer cheetsheet](https://github.com/frappe/frappe/wiki/Developer-Cheatsheet)
|
||||
|
||||
> **Posts that are not bug reports or feature requests will not be addressed on this issue tracker.**
|
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,2 +1,33 @@
|
||||
Please read the pull request checklist to make sure your changes are merged: https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist
|
||||
<!--
|
||||
|
||||
Some key notes before you open a PR:
|
||||
|
||||
1. Select which branch should this PR be merged in?
|
||||
2. PR name follows [convention](http://karma-runner.github.io/4.0/dev/git-commit-msg.html)
|
||||
3. All tests pass locally, UI and Unit tests
|
||||
4. All business logic and validations must be on the server-side
|
||||
5. Update necessary Documentation
|
||||
6. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes
|
||||
|
||||
|
||||
Also, if you're new here
|
||||
|
||||
- Documentation Guidelines => https://github.com/frappe/erpnext/wiki/Updating-Documentation
|
||||
|
||||
- Contribution Guide => https://github.com/frappe/erpnext/blob/develop/.github/CONTRIBUTING.md
|
||||
|
||||
- Pull Request Checklist => https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist
|
||||
|
||||
-->
|
||||
|
||||
> Please provide enough information so that others can review your pull request:
|
||||
|
||||
<!-- You can skip this if you're fixing a typo or updating existing documentation -->
|
||||
|
||||
> Explain the **details** for making this change. What existing problem does the pull request solve?
|
||||
|
||||
<!-- Example: When "Adding a function to do X", explain why it is necessary to have a way to do X. -->
|
||||
|
||||
> Screenshots/GIFs
|
||||
|
||||
<!-- Add images/recordings to better visualize the change: expected/current behviour -->
|
||||
|
7
SECURITY.md
Normal file
7
SECURITY.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Security Policy
|
||||
|
||||
The ERPNext team and community take security issues seriously. To report a security issue, fill out the form at [https://erpnext.com/security/report](https://erpnext.com/security/report).
|
||||
|
||||
You can help us make ERPNext and all it's users more secure by following the [Reporting guidelines](https://erpnext.com/security).
|
||||
|
||||
We appreciate your efforts to responsibly disclose your findings. We'll endeavor to respond quickly, and will keep you updated throughout the process.
|
@ -18,7 +18,7 @@ def get_data():
|
||||
"onboard_present": 1
|
||||
},
|
||||
{
|
||||
"module_name": "Accounting",
|
||||
"module_name": "Accounts",
|
||||
"category": "Modules",
|
||||
"label": _("Accounting"),
|
||||
"color": "#3498db",
|
||||
|
@ -127,7 +127,11 @@ def get_data():
|
||||
"name": "Shipping Rule",
|
||||
"description": _("Rules for adding shipping costs."),
|
||||
},
|
||||
|
||||
{
|
||||
"type": "doctype",
|
||||
"name": "Coupon Code",
|
||||
"description": _("Define coupon codes."),
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -280,22 +280,31 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
||||
"page_len": page_len
|
||||
}
|
||||
|
||||
having_clause = "having sum(sle.actual_qty) > 0"
|
||||
if filters.get("is_return"):
|
||||
having_clause = ""
|
||||
|
||||
if args.get('warehouse'):
|
||||
batch_nos = frappe.db.sql("""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom, concat('MFG-',batch.manufacturing_date), concat('EXP-',batch.expiry_date)
|
||||
from `tabStock Ledger Entry` sle
|
||||
INNER JOIN `tabBatch` batch on sle.batch_no = batch.name
|
||||
where
|
||||
batch.disabled = 0
|
||||
and sle.item_code = %(item_code)s
|
||||
and sle.warehouse = %(warehouse)s
|
||||
and (sle.batch_no like %(txt)s
|
||||
or batch.manufacturing_date like %(txt)s)
|
||||
and batch.docstatus < 2
|
||||
{0}
|
||||
{match_conditions}
|
||||
group by batch_no having sum(sle.actual_qty) > 0
|
||||
order by batch.expiry_date, sle.batch_no desc
|
||||
limit %(start)s, %(page_len)s""".format(cond, match_conditions=get_match_cond(doctype)), args)
|
||||
batch_nos = frappe.db.sql("""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom,
|
||||
concat('MFG-',batch.manufacturing_date), concat('EXP-',batch.expiry_date)
|
||||
from `tabStock Ledger Entry` sle
|
||||
INNER JOIN `tabBatch` batch on sle.batch_no = batch.name
|
||||
where
|
||||
batch.disabled = 0
|
||||
and sle.item_code = %(item_code)s
|
||||
and sle.warehouse = %(warehouse)s
|
||||
and (sle.batch_no like %(txt)s
|
||||
or batch.manufacturing_date like %(txt)s)
|
||||
and batch.docstatus < 2
|
||||
{cond}
|
||||
{match_conditions}
|
||||
group by batch_no {having_clause}
|
||||
order by batch.expiry_date, sle.batch_no desc
|
||||
limit %(start)s, %(page_len)s""".format(
|
||||
cond=cond,
|
||||
match_conditions=get_match_cond(doctype),
|
||||
having_clause = having_clause
|
||||
), args)
|
||||
|
||||
return batch_nos
|
||||
else:
|
||||
|
@ -10,13 +10,14 @@ from erpnext.demo.domains import data
|
||||
from frappe import _
|
||||
|
||||
def setup(domain):
|
||||
frappe.flags.in_demo = 1
|
||||
complete_setup(domain)
|
||||
setup_demo_page()
|
||||
setup_fiscal_year()
|
||||
setup_holiday_list()
|
||||
setup_user()
|
||||
setup_employee()
|
||||
setup_user_roles()
|
||||
setup_user_roles(domain)
|
||||
setup_role_permissions()
|
||||
setup_custom_field_for_domain()
|
||||
|
||||
@ -183,13 +184,19 @@ def setup_salary_structure(employees, salary_slip_based_on_timesheet=0):
|
||||
|
||||
return ss
|
||||
|
||||
def setup_user_roles():
|
||||
def setup_user_roles(domain):
|
||||
user = frappe.get_doc('User', 'demo@erpnext.com')
|
||||
user.add_roles('HR User', 'HR Manager', 'Accounts User', 'Accounts Manager',
|
||||
'Stock User', 'Stock Manager', 'Sales User', 'Sales Manager', 'Purchase User',
|
||||
'Purchase Manager', 'Projects User', 'Manufacturing User', 'Manufacturing Manager',
|
||||
'Support Team', 'Academics User', 'Physician', 'Healthcare Administrator', 'Laboratory User',
|
||||
'Nursing User', 'Patient')
|
||||
'Support Team')
|
||||
|
||||
if domain == "Healthcare":
|
||||
user.add_roles('Physician', 'Healthcare Administrator', 'Laboratory User',
|
||||
'Nursing User', 'Patient')
|
||||
|
||||
if domain == "Education":
|
||||
user.add_roles('Academics User')
|
||||
|
||||
if not frappe.db.get_global('demo_hr_user'):
|
||||
user = frappe.get_doc('User', 'CaitlinSnow@example.com')
|
||||
@ -219,7 +226,7 @@ def setup_user_roles():
|
||||
|
||||
if not frappe.db.get_global('demo_manufacturing_user'):
|
||||
user = frappe.get_doc('User', 'NeptuniaAquaria@example.com')
|
||||
user.add_roles('Manufacturing User', 'Stock User', 'Purchase User', 'Accounts User')
|
||||
user.add_roles('Manufacturing User', 'Stock Manager', 'Stock User', 'Purchase User', 'Accounts User')
|
||||
update_employee_department(user.name, 'Production')
|
||||
frappe.db.set_global('demo_manufacturing_user', user.name)
|
||||
|
||||
@ -241,11 +248,12 @@ def setup_user_roles():
|
||||
update_employee_department(user.name, 'Management')
|
||||
frappe.db.set_global('demo_projects_user', user.name)
|
||||
|
||||
if not frappe.db.get_global('demo_education_user'):
|
||||
user = frappe.get_doc('User', 'ArthurCurry@example.com')
|
||||
user.add_roles('Academics User')
|
||||
update_employee_department(user.name, 'Management')
|
||||
frappe.db.set_global('demo_education_user', user.name)
|
||||
if domain == "Education":
|
||||
if not frappe.db.get_global('demo_education_user'):
|
||||
user = frappe.get_doc('User', 'ArthurCurry@example.com')
|
||||
user.add_roles('Academics User')
|
||||
update_employee_department(user.name, 'Management')
|
||||
frappe.db.set_global('demo_education_user', user.name)
|
||||
|
||||
#Add Expense Approver
|
||||
user = frappe.get_doc('User', 'ClarkKent@example.com')
|
||||
|
@ -73,14 +73,16 @@ def work():
|
||||
make_pos_invoice()
|
||||
|
||||
def make_payment_entries(ref_doctype, report):
|
||||
outstanding_invoices = list(set([r[3] for r in query_report.run(report, {
|
||||
"report_date": frappe.flags.current_date,
|
||||
"company": erpnext.get_default_company()
|
||||
})["result"] if r[2]==ref_doctype]))
|
||||
|
||||
outstanding_invoices = frappe.get_all(ref_doctype, fields=["name"],
|
||||
filters={
|
||||
"company": erpnext.get_default_company(),
|
||||
"outstanding_amount": (">", 0.0)
|
||||
})
|
||||
|
||||
# make Payment Entry
|
||||
for inv in outstanding_invoices[:random.randint(1, 2)]:
|
||||
pe = get_payment_entry(ref_doctype, inv)
|
||||
pe = get_payment_entry(ref_doctype, inv.name)
|
||||
pe.posting_date = frappe.flags.current_date
|
||||
pe.reference_no = random_string(6)
|
||||
pe.reference_date = frappe.flags.current_date
|
||||
@ -91,7 +93,7 @@ def make_payment_entries(ref_doctype, report):
|
||||
|
||||
# make payment via JV
|
||||
for inv in outstanding_invoices[:1]:
|
||||
jv = frappe.get_doc(get_payment_entry_against_invoice(ref_doctype, inv))
|
||||
jv = frappe.get_doc(get_payment_entry_against_invoice(ref_doctype, inv.name))
|
||||
jv.posting_date = frappe.flags.current_date
|
||||
jv.cheque_no = random_string(6)
|
||||
jv.cheque_date = frappe.flags.current_date
|
||||
|
@ -39,61 +39,4 @@ def make_project(current_date):
|
||||
"doctype": "Project",
|
||||
"project_name": "New Product Development " + current_date.strftime("%Y-%m-%d"),
|
||||
})
|
||||
project.set("tasks", [
|
||||
{
|
||||
"title": "Review Requirements",
|
||||
"start_date": frappe.utils.add_days(current_date, 10),
|
||||
"end_date": frappe.utils.add_days(current_date, 11)
|
||||
},
|
||||
{
|
||||
"title": "Design Options",
|
||||
"start_date": frappe.utils.add_days(current_date, 11),
|
||||
"end_date": frappe.utils.add_days(current_date, 20)
|
||||
},
|
||||
{
|
||||
"title": "Make Prototypes",
|
||||
"start_date": frappe.utils.add_days(current_date, 20),
|
||||
"end_date": frappe.utils.add_days(current_date, 30)
|
||||
},
|
||||
{
|
||||
"title": "Customer Feedback on Prototypes",
|
||||
"start_date": frappe.utils.add_days(current_date, 30),
|
||||
"end_date": frappe.utils.add_days(current_date, 40)
|
||||
},
|
||||
{
|
||||
"title": "Freeze Feature Set",
|
||||
"start_date": frappe.utils.add_days(current_date, 40),
|
||||
"end_date": frappe.utils.add_days(current_date, 45)
|
||||
},
|
||||
{
|
||||
"title": "Testing",
|
||||
"start_date": frappe.utils.add_days(current_date, 45),
|
||||
"end_date": frappe.utils.add_days(current_date, 60)
|
||||
},
|
||||
{
|
||||
"title": "Product Engineering",
|
||||
"start_date": frappe.utils.add_days(current_date, 45),
|
||||
"end_date": frappe.utils.add_days(current_date, 55)
|
||||
},
|
||||
{
|
||||
"title": "Supplier Contracts",
|
||||
"start_date": frappe.utils.add_days(current_date, 55),
|
||||
"end_date": frappe.utils.add_days(current_date, 70)
|
||||
},
|
||||
{
|
||||
"title": "Design and Build Fixtures",
|
||||
"start_date": frappe.utils.add_days(current_date, 45),
|
||||
"end_date": frappe.utils.add_days(current_date, 65)
|
||||
},
|
||||
{
|
||||
"title": "Test Run",
|
||||
"start_date": frappe.utils.add_days(current_date, 70),
|
||||
"end_date": frappe.utils.add_days(current_date, 80)
|
||||
},
|
||||
{
|
||||
"title": "Launch",
|
||||
"start_date": frappe.utils.add_days(current_date, 80),
|
||||
"end_date": frappe.utils.add_days(current_date, 90)
|
||||
},
|
||||
])
|
||||
project.insert()
|
||||
|
@ -66,7 +66,7 @@ def make_opportunity(domain):
|
||||
b = frappe.get_doc({
|
||||
"doctype": "Opportunity",
|
||||
"opportunity_from": "Customer",
|
||||
"customer": get_random("Customer"),
|
||||
"party_name": frappe.get_value("Customer", get_random("Customer"), 'name'),
|
||||
"opportunity_type": "Sales",
|
||||
"with_items": 1,
|
||||
"transaction_date": frappe.flags.current_date,
|
||||
|
@ -1653,6 +1653,11 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
'item_code': item.item_code,
|
||||
'posting_date': me.frm.doc.posting_date || frappe.datetime.nowdate(),
|
||||
}
|
||||
|
||||
if (doc.is_return) {
|
||||
filters["is_return"] = 1;
|
||||
}
|
||||
|
||||
if (item.warehouse) filters["warehouse"] = item.warehouse;
|
||||
|
||||
return {
|
||||
|
@ -204,7 +204,7 @@ class Company(NestedSet):
|
||||
})
|
||||
|
||||
for default_account in default_accounts:
|
||||
if self.is_new() or frappe.flags.in_test:
|
||||
if self.is_new() or frappe.flags.in_test or frappe.flags.in_demo:
|
||||
self._set_default_account(default_account, default_accounts.get(default_account))
|
||||
|
||||
if not self.default_income_account:
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="row no-gutters">
|
||||
<div class="col-md-3">
|
||||
<div class="card-body">
|
||||
<a class="no-underline" href="{{ item.route }}">
|
||||
<a class="no-underline" href="/{{ item.route }}">
|
||||
<img class="website-image" src="{{ item.website_image or item.image or 'no-image.jpg' }}" alt="{{ item.item_name }}">
|
||||
</a>
|
||||
</div>
|
||||
@ -10,14 +10,14 @@
|
||||
<div class="col-md-9">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">
|
||||
<a class="text-dark" href="{{ item.route }}">
|
||||
<a class="text-dark" href="/{{ item.route }}">
|
||||
{{ item.item_name or item.name }}
|
||||
</a>
|
||||
</h5>
|
||||
<p class="card-text">
|
||||
{{ item.website_description or item.description or '<i class="text-muted">No description</i>' }}
|
||||
</p>
|
||||
<a href="{{ item.route }}" class="btn btn-sm btn-light">{{ _('More details') }}</a>
|
||||
<a href="/{{ item.route }}" class="btn btn-sm btn-light">{{ _('More details') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user