Deepesh Garg
3 years ago
509 changed files with 10793 additions and 11943 deletions
@ -1,47 +0,0 @@ |
|||
--- |
|||
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. |
@ -0,0 +1,87 @@ |
|||
name: Bug Report |
|||
description: Report a bug encountered while using ERPNext |
|||
labels: ["bug"] |
|||
|
|||
body: |
|||
- type: markdown |
|||
attributes: |
|||
value: | |
|||
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 [user manual](https://docs.erpnext.com/) or use [forum](https://discuss.erpnext.com) |
|||
- For documentation issues, propose edit on [documentation site](https://docs.erpnext.com/) directly. |
|||
2. 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. |
|||
3. If you think you know what the reason for the bug is, share it with us. Maybe put in a PR 😉 |
|||
|
|||
- type: textarea |
|||
id: bug-info |
|||
attributes: |
|||
label: Information about bug |
|||
description: Also tell us, what did you expect to happen? |
|||
placeholder: Please provide as much information as possible. |
|||
validations: |
|||
required: true |
|||
|
|||
- type: dropdown |
|||
id: module |
|||
attributes: |
|||
label: Module |
|||
description: Select affected module of ERPNext. |
|||
multiple: true |
|||
options: |
|||
- accounts |
|||
- stock |
|||
- buying |
|||
- selling |
|||
- ecommerce |
|||
- manufacturing |
|||
- HR |
|||
- projects |
|||
- support |
|||
- assets |
|||
- integrations |
|||
- quality |
|||
- regional |
|||
- portal |
|||
- agriculture |
|||
- education |
|||
- non-profit |
|||
validations: |
|||
required: true |
|||
|
|||
- type: textarea |
|||
id: exact-version |
|||
attributes: |
|||
label: Version |
|||
description: Share exact version number of Frappe and ERPNext you are using. |
|||
placeholder: | |
|||
Frappe version - |
|||
ERPNext Verion - |
|||
validations: |
|||
required: true |
|||
|
|||
- type: dropdown |
|||
id: install-method |
|||
attributes: |
|||
label: Installation method |
|||
options: |
|||
- docker |
|||
- easy-install |
|||
- manual install |
|||
- FrappeCloud |
|||
validations: |
|||
required: false |
|||
|
|||
- type: textarea |
|||
id: logs |
|||
attributes: |
|||
label: Relevant log output / Stack trace / Full Error Message. |
|||
description: Please copy and paste any relevant log output. This will be automatically formatted. |
|||
render: shell |
|||
|
|||
- type: markdown |
|||
attributes: |
|||
value: | |
|||
By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/frappe/erpnext/blob/develop/CODE_OF_CONDUCT.md) |
@ -1,17 +0,0 @@ |
|||
--- |
|||
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~~ => [stackoverflow](https://stackoverflow.com/questions/tagged/frappe) tagged under `frappe` |
|||
|
|||
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.** |
@ -1,34 +1,36 @@ |
|||
# Configuration for probot-stale - https://github.com/probot/stale |
|||
|
|||
# Number of days of inactivity before an Issue or Pull Request becomes stale |
|||
daysUntilStale: 15 |
|||
|
|||
# Number of days of inactivity before a stale Issue or Pull Request is closed. |
|||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. |
|||
daysUntilClose: 3 |
|||
# Label to use when marking as stale |
|||
staleLabel: inactive |
|||
|
|||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable |
|||
exemptLabels: |
|||
- hotfix |
|||
# Limit the number of actions per hour, from 1-30. Default is 30 |
|||
limitPerRun: 10 |
|||
|
|||
# Set to true to ignore issues in a project (defaults to false) |
|||
exemptProjects: false |
|||
exemptProjects: true |
|||
|
|||
# Set to true to ignore issues in a milestone (defaults to false) |
|||
exemptMilestones: true |
|||
|
|||
# Label to use when marking as stale |
|||
staleLabel: inactive |
|||
|
|||
# Comment to post when marking as stale. Set to `false` to disable |
|||
markComment: > |
|||
This pull request has been automatically marked as stale because it has not had |
|||
recent activity. It will be closed within a week if no further activity occurs, but it |
|||
only takes a comment to keep a contribution alive :) Also, even if it is closed, |
|||
you can always reopen the PR when you're ready. Thank you for contributing. |
|||
|
|||
# Limit the number of actions per hour, from 1-30. Default is 30 |
|||
limitPerRun: 30 |
|||
|
|||
# Limit to only `issues` or `pulls` |
|||
only: pulls |
|||
pulls: |
|||
daysUntilStale: 15 |
|||
daysUntilClose: 3 |
|||
exemptLabels: |
|||
- hotfix |
|||
markComment: > |
|||
This pull request has been automatically marked as inactive because it has |
|||
not had recent activity. It will be closed within 3 days if no further |
|||
activity occurs, but it only takes a comment to keep a contribution alive |
|||
:) Also, even if it is closed, you can always reopen the PR when you're |
|||
ready. Thank you for contributing. |
|||
|
|||
issues: |
|||
daysUntilStale: 60 |
|||
daysUntilClose: 7 |
|||
exemptLabels: |
|||
- valid |
|||
- to-validate |
|||
markComment: > |
|||
This issue has been automatically marked as inactive because it has not had |
|||
recent activity and it wasn't validated by maintainer team. It will be |
|||
closed within a week if no further activity occurs. |
|||
|
@ -0,0 +1 @@ |
|||
hypothesis~=6.31.0 |
@ -1,29 +0,0 @@ |
|||
QUnit.module('accounts'); |
|||
|
|||
QUnit.test("test account", function(assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => frappe.set_route('Tree', 'Account'), |
|||
() => frappe.timeout(3), |
|||
() => frappe.click_button('Expand All'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_link('Debtors'), |
|||
() => frappe.click_button('Edit'), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
assert.ok(cur_frm.doc.root_type=='Asset'); |
|||
assert.ok(cur_frm.doc.report_type=='Balance Sheet'); |
|||
assert.ok(cur_frm.doc.account_type=='Receivable'); |
|||
}, |
|||
() => frappe.click_button('Ledger'), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
// check if general ledger report shown
|
|||
assert.deepEqual(frappe.get_route(), ['query-report', 'General Ledger']); |
|||
window.history.back(); |
|||
return frappe.timeout(1); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,69 +0,0 @@ |
|||
QUnit.module('accounts'); |
|||
|
|||
QUnit.test("test account with number", function(assert) { |
|||
assert.expect(7); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => frappe.set_route('Tree', 'Account'), |
|||
() => frappe.click_link('Income'), |
|||
() => frappe.click_button('Add Child'), |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
cur_dialog.fields_dict.account_name.$input.val("Test Income"); |
|||
cur_dialog.fields_dict.account_number.$input.val("4010"); |
|||
}, |
|||
() => frappe.click_button('Create New'), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
assert.ok($('a:contains("4010 - Test Income"):visible').length!=0, "Account created with number"); |
|||
}, |
|||
() => frappe.click_link('4010 - Test Income'), |
|||
() => frappe.click_button('Edit'), |
|||
() => frappe.timeout(.5), |
|||
() => frappe.click_button('Update Account Number'), |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
cur_dialog.fields_dict.account_number.$input.val("4020"); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => cur_dialog.primary_action(), |
|||
() => frappe.timeout(1), |
|||
() => cur_frm.refresh_fields(), |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
var abbr = frappe.get_abbr(frappe.defaults.get_default("Company")); |
|||
var new_account = "4020 - Test Income - " + abbr; |
|||
assert.ok(cur_frm.doc.name==new_account, "Account renamed"); |
|||
assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same"); |
|||
assert.ok(cur_frm.doc.account_number=="4020", "Account number updated to 4020"); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Menu'), |
|||
() => frappe.click_link('Rename'), |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
cur_dialog.fields_dict.new_name.$input.val("4030 - Test Income"); |
|||
}, |
|||
() => frappe.timeout(.5), |
|||
() => frappe.click_button("Rename"), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same"); |
|||
assert.ok(cur_frm.doc.account_number=="4030", "Account number updated to 4030"); |
|||
}, |
|||
() => frappe.timeout(.5), |
|||
() => frappe.click_button('Chart of Accounts'), |
|||
() => frappe.timeout(.5), |
|||
() => frappe.click_button('Menu'), |
|||
() => frappe.click_link('Refresh'), |
|||
() => frappe.click_button('Expand All'), |
|||
() => frappe.click_link('4030 - Test Income'), |
|||
() => frappe.click_button('Delete'), |
|||
() => frappe.click_button('Yes'), |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
assert.ok($('a:contains("4030 - Test Account"):visible').length==0, "Account deleted"); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,46 +0,0 @@ |
|||
QUnit.module('accounts'); |
|||
QUnit.test("test account", assert => { |
|||
assert.expect(3); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => frappe.set_route('Tree', 'Account'), |
|||
() => frappe.click_button('Expand All'), |
|||
() => frappe.click_link('Duties and Taxes - '+ frappe.get_abbr(frappe.defaults.get_default("Company"))), |
|||
() => { |
|||
if($('a:contains("CGST"):visible').length == 0){ |
|||
return frappe.map_tax.make('CGST', 9); |
|||
} |
|||
}, |
|||
() => { |
|||
if($('a:contains("SGST"):visible').length == 0){ |
|||
return frappe.map_tax.make('SGST', 9); |
|||
} |
|||
}, |
|||
() => { |
|||
if($('a:contains("IGST"):visible').length == 0){ |
|||
return frappe.map_tax.make('IGST', 18); |
|||
} |
|||
}, |
|||
() => { |
|||
assert.ok($('a:contains("CGST"):visible').length!=0, "CGST Checked"); |
|||
assert.ok($('a:contains("SGST"):visible').length!=0, "SGST Checked"); |
|||
assert.ok($('a:contains("IGST"):visible').length!=0, "IGST Checked"); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
|||
|
|||
|
|||
frappe.map_tax = { |
|||
make:function(text,rate){ |
|||
return frappe.run_serially([ |
|||
() => frappe.click_button('Add Child'), |
|||
() => frappe.timeout(0.2), |
|||
() => cur_dialog.set_value('account_name',text), |
|||
() => cur_dialog.set_value('account_type','Tax'), |
|||
() => cur_dialog.set_value('tax_rate',rate), |
|||
() => cur_dialog.set_value('account_currency','INR'), |
|||
() => frappe.click_button('Create New'), |
|||
]); |
|||
} |
|||
}; |
@ -1,35 +0,0 @@ |
|||
QUnit.module('accounts'); |
|||
|
|||
QUnit.test("test: Accounts Settings doesn't allow negatives", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
assert.expect(2); |
|||
|
|||
frappe.run_serially([ |
|||
() => frappe.set_route('Form', 'Accounts Settings', 'Accounts Settings'), |
|||
() => frappe.timeout(2), |
|||
() => unchecked_if_checked(cur_frm, 'Allow Stale Exchange Rates', frappe.click_check), |
|||
() => cur_frm.set_value('stale_days', 0), |
|||
() => frappe.click_button('Save'), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.ok(cur_dialog); |
|||
}, |
|||
() => frappe.click_button('Close'), |
|||
() => cur_frm.set_value('stale_days', -1), |
|||
() => frappe.click_button('Save'), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.ok(cur_dialog); |
|||
}, |
|||
() => frappe.click_button('Close'), |
|||
() => done() |
|||
]); |
|||
|
|||
}); |
|||
|
|||
const unchecked_if_checked = function(frm, field_name, fn){ |
|||
if (frm.doc.allow_stale) { |
|||
return fn(field_name); |
|||
} |
|||
}; |
@ -0,0 +1,56 @@ |
|||
{ |
|||
"actions": [], |
|||
"allow_rename": 1, |
|||
"creation": "2021-11-25 10:24:39.836195", |
|||
"doctype": "DocType", |
|||
"engine": "InnoDB", |
|||
"field_order": [ |
|||
"reference_type", |
|||
"reference_name", |
|||
"reference_detail", |
|||
"account_head", |
|||
"allocated_amount" |
|||
], |
|||
"fields": [ |
|||
{ |
|||
"fieldname": "reference_type", |
|||
"fieldtype": "Link", |
|||
"label": "Reference Type", |
|||
"options": "DocType" |
|||
}, |
|||
{ |
|||
"fieldname": "reference_name", |
|||
"fieldtype": "Dynamic Link", |
|||
"label": "Reference Name", |
|||
"options": "reference_type" |
|||
}, |
|||
{ |
|||
"fieldname": "reference_detail", |
|||
"fieldtype": "Data", |
|||
"label": "Reference Detail" |
|||
}, |
|||
{ |
|||
"fieldname": "account_head", |
|||
"fieldtype": "Link", |
|||
"label": "Account Head", |
|||
"options": "Account" |
|||
}, |
|||
{ |
|||
"fieldname": "allocated_amount", |
|||
"fieldtype": "Currency", |
|||
"label": "Allocated Amount", |
|||
"options": "party_account_currency" |
|||
} |
|||
], |
|||
"index_web_pages_for_search": 1, |
|||
"istable": 1, |
|||
"links": [], |
|||
"modified": "2021-11-25 10:27:51.712286", |
|||
"modified_by": "Administrator", |
|||
"module": "Accounts", |
|||
"name": "Advance Tax", |
|||
"owner": "Administrator", |
|||
"permissions": [], |
|||
"sort_field": "modified", |
|||
"sort_order": "DESC" |
|||
} |
@ -0,0 +1,9 @@ |
|||
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors |
|||
# For license information, please see license.txt |
|||
|
|||
# import frappe |
|||
from frappe.model.document import Document |
|||
|
|||
|
|||
class AdvanceTax(Document): |
|||
pass |
@ -1,69 +0,0 @@ |
|||
[ |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Short Fiscal Year 2011", |
|||
"is_short_year": 1, |
|||
"year_end_date": "2011-04-01", |
|||
"year_start_date": "2011-12-31" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2012", |
|||
"year_end_date": "2012-12-31", |
|||
"year_start_date": "2012-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2013", |
|||
"year_end_date": "2013-12-31", |
|||
"year_start_date": "2013-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2014", |
|||
"year_end_date": "2014-12-31", |
|||
"year_start_date": "2014-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2015", |
|||
"year_end_date": "2015-12-31", |
|||
"year_start_date": "2015-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2016", |
|||
"year_end_date": "2016-12-31", |
|||
"year_start_date": "2016-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2017", |
|||
"year_end_date": "2017-12-31", |
|||
"year_start_date": "2017-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2018", |
|||
"year_end_date": "2018-12-31", |
|||
"year_start_date": "2018-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2019", |
|||
"year_end_date": "2019-12-31", |
|||
"year_start_date": "2019-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2020", |
|||
"year_end_date": "2020-12-31", |
|||
"year_start_date": "2020-01-01" |
|||
}, |
|||
{ |
|||
"doctype": "Fiscal Year", |
|||
"year": "_Test Fiscal Year 2021", |
|||
"year_end_date": "2021-12-31", |
|||
"year_start_date": "2021-01-01" |
|||
} |
|||
] |
@ -1,39 +0,0 @@ |
|||
QUnit.module('Journal Entry'); |
|||
|
|||
QUnit.test("test journal entry", function(assert) { |
|||
assert.expect(2); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Journal Entry', [ |
|||
{posting_date:frappe.datetime.add_days(frappe.datetime.nowdate(), 0)}, |
|||
{accounts: [ |
|||
[ |
|||
{'account':'Debtors - '+frappe.get_abbr(frappe.defaults.get_default('Company'))}, |
|||
{'party_type':'Customer'}, |
|||
{'party':'Test Customer 1'}, |
|||
{'credit_in_account_currency':1000}, |
|||
{'is_advance':'Yes'}, |
|||
], |
|||
[ |
|||
{'account':'HDFC - '+frappe.get_abbr(frappe.defaults.get_default('Company'))}, |
|||
{'debit_in_account_currency':1000}, |
|||
] |
|||
]}, |
|||
{cheque_no:1234}, |
|||
{cheque_date: frappe.datetime.add_days(frappe.datetime.nowdate(), -1)}, |
|||
{user_remark: 'Test'}, |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.total_debit==1000, "total debit correct"); |
|||
assert.ok(cur_frm.doc.total_credit==1000, "total credit correct"); |
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,55 +0,0 @@ |
|||
QUnit.module('Payment Entry'); |
|||
|
|||
QUnit.test("test payment entry", function(assert) { |
|||
assert.expect(6); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'item_code': 'Test Product 1'}, |
|||
{'qty': 1}, |
|||
{'rate': 101}, |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Make'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_link('Payment'), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.equal(frappe.get_route()[1], 'Payment Entry', |
|||
'made payment entry'); |
|||
assert.equal(cur_frm.doc.party, 'Test Customer 1', |
|||
'customer set in payment entry'); |
|||
assert.equal(cur_frm.doc.paid_amount, 101, |
|||
'paid amount set in payment entry'); |
|||
assert.equal(cur_frm.doc.references[0].allocated_amount, 101, |
|||
'amount allocated against sales invoice'); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => cur_frm.set_value('paid_amount', 100), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
frappe.model.set_value("Payment Entry Reference", cur_frm.doc.references[0].name, |
|||
"allocated_amount", 101); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Write Off Difference Amount'), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
assert.equal(cur_frm.doc.difference_amount, 0, 'difference amount is zero'); |
|||
assert.equal(cur_frm.doc.deductions[0].amount, 1, 'Write off amount = 1'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,60 +0,0 @@ |
|||
QUnit.module('Payment Entry'); |
|||
|
|||
QUnit.test("test payment entry", function(assert) { |
|||
assert.expect(7 ); |
|||
let done = assert.async(); |
|||
|
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Purchase Invoice', [ |
|||
{supplier: 'Test Supplier'}, |
|||
{bill_no: 'in1234'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 2}, |
|||
{'item_code': 'Test Product 1'}, |
|||
{'rate':1000}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{supplier_address: 'Test1-Billing'}, |
|||
{contact_person: 'Contact 3-Test Supplier'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is just a Test'} |
|||
]); |
|||
}, |
|||
|
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Make'), |
|||
() => frappe.timeout(2), |
|||
() => frappe.click_link('Payment'), |
|||
() => frappe.timeout(3), |
|||
() => cur_frm.set_value('mode_of_payment','Cash'), |
|||
() => frappe.timeout(3), |
|||
() => { |
|||
assert.equal(frappe.get_route()[1], 'Payment Entry', |
|||
'made payment entry'); |
|||
assert.equal(cur_frm.doc.party, 'Test Supplier', |
|||
'supplier set in payment entry'); |
|||
assert.equal(cur_frm.doc.paid_amount, 2000, |
|||
'paid amount set in payment entry'); |
|||
assert.equal(cur_frm.doc.references[0].allocated_amount, 2000, |
|||
'amount allocated against purchase invoice'); |
|||
assert.equal(cur_frm.doc.references[0].bill_no, 'in1234', |
|||
'invoice number allocated against purchase invoice'); |
|||
assert.equal(cur_frm.get_field('total_allocated_amount').value, 2000, |
|||
'correct amount allocated in Write Off'); |
|||
assert.equal(cur_frm.get_field('unallocated_amount').value, 0, |
|||
'correct amount unallocated in Write Off'); |
|||
}, |
|||
|
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
QUnit.module('Accounts'); |
|||
|
|||
QUnit.test("test payment entry", function(assert) { |
|||
assert.expect(1); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Payment Entry', [ |
|||
{payment_type:'Receive'}, |
|||
{mode_of_payment:'Cash'}, |
|||
{party_type:'Customer'}, |
|||
{party:'Test Customer 3'}, |
|||
{paid_amount:675}, |
|||
{reference_no:123}, |
|||
{reference_date: frappe.datetime.add_days(frappe.datetime.nowdate(), 0)}, |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.total_allocated_amount==675, "Allocated AmountCorrect"); |
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,67 +0,0 @@ |
|||
QUnit.module('Payment Entry'); |
|||
|
|||
QUnit.test("test payment entry", function(assert) { |
|||
assert.expect(8); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{company: 'For Testing'}, |
|||
{currency: 'INR'}, |
|||
{selling_price_list: '_Test Price List'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 1}, |
|||
{'item_code': 'Test Product 1'}, |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(1.5), |
|||
() => frappe.click_button('Close'), |
|||
() => frappe.timeout(0.5), |
|||
() => frappe.click_button('Make'), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_link('Payment'), |
|||
() => frappe.timeout(2), |
|||
() => cur_frm.set_value("paid_to", "_Test Cash - FT"), |
|||
() => frappe.timeout(0.5), |
|||
() => { |
|||
assert.equal(frappe.get_route()[1], 'Payment Entry', 'made payment entry'); |
|||
assert.equal(cur_frm.doc.party, 'Test Customer 1', 'customer set in payment entry'); |
|||
assert.equal(cur_frm.doc.paid_from, 'Debtors - FT', 'customer account set in payment entry'); |
|||
assert.equal(cur_frm.doc.paid_amount, 100, 'paid amount set in payment entry'); |
|||
assert.equal(cur_frm.doc.references[0].allocated_amount, 100, |
|||
'amount allocated against sales invoice'); |
|||
}, |
|||
() => cur_frm.set_value('paid_amount', 95), |
|||
() => frappe.timeout(1), |
|||
() => { |
|||
frappe.model.set_value("Payment Entry Reference", |
|||
cur_frm.doc.references[0].name, "allocated_amount", 100); |
|||
}, |
|||
() => frappe.timeout(.5), |
|||
() => { |
|||
assert.equal(cur_frm.doc.difference_amount, 5, 'difference amount is 5'); |
|||
}, |
|||
() => { |
|||
frappe.db.set_value("Company", "For Testing", "write_off_account", "_Test Write Off - FT"); |
|||
frappe.timeout(1); |
|||
frappe.db.set_value("Company", "For Testing", |
|||
"exchange_gain_loss_account", "_Test Exchange Gain/Loss - FT"); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Write Off Difference Amount'), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.equal(cur_frm.doc.difference_amount, 0, 'difference amount is zero'); |
|||
assert.equal(cur_frm.doc.deductions[0].amount, 5, 'Write off amount = 5'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
QUnit.module('Pricing Rule'); |
|||
|
|||
QUnit.test("test pricing rule", function(assert) { |
|||
assert.expect(2); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make("Pricing Rule", [ |
|||
{title: 'Test Pricing Rule'}, |
|||
{item_code:'Test Product 2'}, |
|||
{selling:1}, |
|||
{applicable_for:'Customer'}, |
|||
{customer:'Test Customer 3'}, |
|||
{currency: frappe.defaults.get_default("currency")} |
|||
{min_qty:1}, |
|||
{max_qty:20}, |
|||
{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{discount_percentage:10}, |
|||
{for_price_list:'Standard Selling'} |
|||
]); |
|||
}, |
|||
() => { |
|||
assert.ok(cur_frm.doc.item_code=='Test Product 2'); |
|||
assert.ok(cur_frm.doc.customer=='Test Customer 3'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,58 +0,0 @@ |
|||
QUnit.module('Pricing Rule'); |
|||
|
|||
QUnit.test("test pricing rule with different currency", function(assert) { |
|||
assert.expect(3); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make("Pricing Rule", [ |
|||
{title: 'Test Pricing Rule 2'}, |
|||
{apply_on: 'Item Code'}, |
|||
{item_code:'Test Product 4'}, |
|||
{selling:1}, |
|||
{priority: 1}, |
|||
{min_qty:1}, |
|||
{max_qty:20}, |
|||
{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{margin_type: 'Amount'}, |
|||
{margin_rate_or_amount: 20}, |
|||
{rate_or_discount: 'Rate'}, |
|||
{rate:200}, |
|||
{currency:'USD'} |
|||
|
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.timeout(0.3), |
|||
() => { |
|||
assert.ok(cur_frm.doc.item_code=='Test Product 4'); |
|||
}, |
|||
|
|||
() => { |
|||
return frappe.tests.make('Sales Order', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{currency: 'INR'}, |
|||
{items: [ |
|||
[ |
|||
{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{'qty': 5}, |
|||
{'item_code': "Test Product 4"} |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.timeout(0.3), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 2', "Pricing rule correct"); |
|||
// margin not applied because different currency in pricing rule
|
|||
assert.ok(cur_frm.doc.items[0].margin_type==null, "Margin correct"); |
|||
}, |
|||
() => frappe.timeout(0.3), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,56 +0,0 @@ |
|||
QUnit.module('Pricing Rule'); |
|||
|
|||
QUnit.test("test pricing rule with same currency", function(assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make("Pricing Rule", [ |
|||
{title: 'Test Pricing Rule 1'}, |
|||
{apply_on: 'Item Code'}, |
|||
{item_code:'Test Product 4'}, |
|||
{selling:1}, |
|||
{min_qty:1}, |
|||
{max_qty:20}, |
|||
{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{rate_or_discount: 'Rate'}, |
|||
{rate:200}, |
|||
{currency:'USD'} |
|||
|
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.timeout(0.3), |
|||
() => { |
|||
assert.ok(cur_frm.doc.item_code=='Test Product 4'); |
|||
}, |
|||
|
|||
() => { |
|||
return frappe.tests.make('Sales Order', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{currency: 'USD'}, |
|||
{items: [ |
|||
[ |
|||
{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{'qty': 5}, |
|||
{'item_code': "Test Product 4"} |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.timeout(0.3), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 1', "Pricing rule correct"); |
|||
assert.ok(cur_frm.doc.items[0].price_list_rate==200, "Item rate correct"); |
|||
// get_total
|
|||
assert.ok(cur_frm.doc.total== 1000, "Total correct"); |
|||
}, |
|||
() => frappe.timeout(0.3), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,74 +0,0 @@ |
|||
QUnit.module('Purchase Invoice'); |
|||
|
|||
QUnit.test("test purchase invoice", function(assert) { |
|||
assert.expect(9); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Purchase Invoice', [ |
|||
{supplier: 'Test Supplier'}, |
|||
{bill_no: 'in123'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 5}, |
|||
{'item_code': 'Test Product 1'}, |
|||
{'rate':100}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{supplier_address: 'Test1-Billing'}, |
|||
{contact_person: 'Contact 3-Test Supplier'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'}, |
|||
{payment_terms_template: '_Test Payment Term Template UI'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// get tax account head details
|
|||
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); |
|||
|
|||
assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); |
|||
assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); |
|||
|
|||
}, |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user'); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.timeout(0.5), |
|||
() => frappe.tests.set_form_values(cur_frm, [{'payment_terms_schedule': ''}]), |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user'); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.timeout(0.5), |
|||
() => frappe.tests.set_form_values(cur_frm, [{'payment_schedule': []}]), |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(!cur_dialog, 'Message is not shown'); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(1), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
QUnit.module('Sales Taxes and Charges Template'); |
|||
|
|||
QUnit.test("test sales taxes and charges template", function(assert) { |
|||
assert.expect(2); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Purchase Taxes and Charges Template', [ |
|||
{title: "TEST In State GST"}, |
|||
{taxes:[ |
|||
[ |
|||
{charge_type:"On Net Total"}, |
|||
{account_head:"CGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) } |
|||
], |
|||
[ |
|||
{charge_type:"On Net Total"}, |
|||
{account_head:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) } |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => { |
|||
assert.ok(cur_frm.doc.title=='TEST In State GST'); |
|||
assert.ok(cur_frm.doc.name=='TEST In State GST - FT'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,73 +0,0 @@ |
|||
QUnit.module('Sales Invoice'); |
|||
|
|||
QUnit.test("test sales Invoice", function(assert) { |
|||
assert.expect(9); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 5}, |
|||
{'item_code': 'Test Product 1'}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{customer_address: 'Test1-Billing'}, |
|||
{shipping_address_name: 'Test1-Shipping'}, |
|||
{contact_person: 'Contact 1-Test Customer 1'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'}, |
|||
{payment_terms_template: '_Test Payment Term Template UI'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// get tax account head details
|
|||
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==590, "Grand Total correct"); |
|||
|
|||
assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); |
|||
assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); |
|||
|
|||
}, |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user'); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.timeout(0.5), |
|||
() => frappe.tests.set_form_values(cur_frm, [{'payment_terms_schedule': ''}]), |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user'); |
|||
}, |
|||
() => frappe.timeout(1), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.timeout(0.5), |
|||
() => frappe.tests.set_form_values(cur_frm, [{'payment_schedule': []}]), |
|||
() => { |
|||
let date = cur_frm.doc.due_date; |
|||
frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1)); |
|||
frappe.timeout(0.5); |
|||
assert.ok(!cur_dialog, 'Message is not shown'); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,42 +0,0 @@ |
|||
QUnit.module('Sales Invoice'); |
|||
|
|||
QUnit.test("test sales Invoice", function(assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 5}, |
|||
{'item_code': 'Test Product 1'}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{customer_address: 'Test1-Billing'}, |
|||
{shipping_address_name: 'Test1-Shipping'}, |
|||
{contact_person: 'Contact 1-Test Customer 1'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// get tax account head details
|
|||
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); |
|||
|
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,35 +0,0 @@ |
|||
QUnit.module('Accounts'); |
|||
|
|||
QUnit.test("test sales invoice with margin", function(assert) { |
|||
assert.expect(3); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{selling_price_list: 'Test-Selling-USD'}, |
|||
{currency: 'USD'}, |
|||
{items: [ |
|||
[ |
|||
{'item_code': 'Test Product 4'}, |
|||
{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, |
|||
{'qty': 1}, |
|||
{'margin_type': 'Percentage'}, |
|||
{'margin_rate_or_amount': 20} |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
assert.ok(cur_frm.doc.items[0].rate_with_margin == 240, "Margin rate correct"); |
|||
assert.ok(cur_frm.doc.items[0].base_rate_with_margin == cur_frm.doc.conversion_rate * 240, "Base margin rate correct"); |
|||
assert.ok(cur_frm.doc.total == 240, "Amount correct"); |
|||
|
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,56 +0,0 @@ |
|||
QUnit.module('Sales Invoice'); |
|||
|
|||
QUnit.test("test sales Invoice with payment", function(assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 5}, |
|||
{'item_code': 'Test Product 1'}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{customer_address: 'Test1-Billing'}, |
|||
{shipping_address_name: 'Test1-Shipping'}, |
|||
{contact_person: 'Contact 1-Test Customer 1'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'}, |
|||
{payment_terms_template: '_Test Payment Term Template UI'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); |
|||
|
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(2), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.tests.click_button('Make'), |
|||
() => frappe.tests.click_link('Payment'), |
|||
() => frappe.timeout(0.2), |
|||
() => { cur_frm.set_value('mode_of_payment','Cash');}, |
|||
() => { cur_frm.set_value('paid_to','Cash - '+frappe.get_abbr(frappe.defaults.get_default('Company')));}, |
|||
() => {cur_frm.set_value('reference_no','TEST1234');}, |
|||
() => {cur_frm.set_value('reference_date',frappe.datetime.add_days(frappe.datetime.nowdate(), 0));}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get payment details
|
|||
assert.ok(cur_frm.doc.paid_amount==590, "Paid Amount Correct"); |
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,51 +0,0 @@ |
|||
QUnit.module('Sales Invoice'); |
|||
|
|||
QUnit.test("test sales Invoice with payment request", function(assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 5}, |
|||
{'item_code': 'Test Product 1'}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{customer_address: 'Test1-Billing'}, |
|||
{shipping_address_name: 'Test1-Shipping'}, |
|||
{contact_person: 'Contact 1-Test Customer 1'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); |
|||
|
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(2), |
|||
() => frappe.tests.click_button('Close'), |
|||
() => frappe.tests.click_button('Make'), |
|||
() => frappe.tests.click_link('Payment Request'), |
|||
() => frappe.timeout(0.2), |
|||
() => { cur_frm.set_value('print_format','GST Tax Invoice');}, |
|||
() => { cur_frm.set_value('email_to','test@gmail.com');}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get payment details
|
|||
assert.ok(cur_frm.doc.grand_total==590, "grand total Correct"); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,44 +0,0 @@ |
|||
QUnit.module('Sales Invoice'); |
|||
|
|||
QUnit.test("test sales Invoice with serialize item", function(assert) { |
|||
assert.expect(5); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Invoice', [ |
|||
{customer: 'Test Customer 1'}, |
|||
{items: [ |
|||
[ |
|||
{'qty': 2}, |
|||
{'item_code': 'Test Product 4'}, |
|||
] |
|||
]}, |
|||
{update_stock:1}, |
|||
{customer_address: 'Test1-Billing'}, |
|||
{shipping_address_name: 'Test1-Shipping'}, |
|||
{contact_person: 'Contact 1-Test Customer 1'}, |
|||
{taxes_and_charges: 'TEST In State GST - FT'}, |
|||
{tc_name: 'Test Term 1'}, |
|||
{terms: 'This is Test'} |
|||
]); |
|||
}, |
|||
() => cur_frm.save(), |
|||
() => { |
|||
// get_item_details
|
|||
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct"); |
|||
// get tax details
|
|||
assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct"); |
|||
// get tax account head details
|
|||
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); |
|||
// get batch number
|
|||
assert.ok(cur_frm.doc.items[0].batch_no=='TEST-BATCH-001', " Batch Details correct"); |
|||
// grand_total Calculated
|
|||
assert.ok(cur_frm.doc.grand_total==218, "Grad Total correct"); |
|||
|
|||
}, |
|||
() => frappe.tests.click_button('Submit'), |
|||
() => frappe.tests.click_button('Yes'), |
|||
() => frappe.timeout(0.3), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
QUnit.module('Sales Taxes and Charges Template'); |
|||
|
|||
QUnit.test("test sales taxes and charges template", function(assert) { |
|||
assert.expect(2); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make('Sales Taxes and Charges Template', [ |
|||
{title: "TEST In State GST"}, |
|||
{taxes:[ |
|||
[ |
|||
{charge_type:"On Net Total"}, |
|||
{account_head:"CGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) } |
|||
], |
|||
[ |
|||
{charge_type:"On Net Total"}, |
|||
{account_head:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) } |
|||
] |
|||
]} |
|||
]); |
|||
}, |
|||
() => { |
|||
assert.ok(cur_frm.doc.title=='TEST In State GST'); |
|||
assert.ok(cur_frm.doc.name=='TEST In State GST - FT'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,36 +0,0 @@ |
|||
QUnit.module('Shipping Rule'); |
|||
|
|||
QUnit.test("test Shipping Rule", function(assert) { |
|||
assert.expect(1); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make("Shipping Rule", [ |
|||
{label: "Next Day Shipping"}, |
|||
{shipping_rule_type: "Selling"}, |
|||
{calculate_based_on: 'Net Total'}, |
|||
{conditions:[ |
|||
[ |
|||
{from_value:1}, |
|||
{to_value:200}, |
|||
{shipping_amount:100} |
|||
], |
|||
[ |
|||
{from_value:201}, |
|||
{to_value:2000}, |
|||
{shipping_amount:50} |
|||
], |
|||
]}, |
|||
{countries:[ |
|||
[ |
|||
{country:'India'} |
|||
] |
|||
]}, |
|||
{account:'Accounts Payable - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}, |
|||
{cost_center:'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} |
|||
]); |
|||
}, |
|||
() => {assert.ok(cur_frm.doc.name=='Next Day Shipping');}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,36 +0,0 @@ |
|||
QUnit.module('Shipping Rule'); |
|||
|
|||
QUnit.test("test Shipping Rule", function(assert) { |
|||
assert.expect(1); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
() => { |
|||
return frappe.tests.make("Shipping Rule", [ |
|||
{label: "Two Day Shipping"}, |
|||
{shipping_rule_type: "Buying"}, |
|||
{fixed_shipping_amount: 0}, |
|||
{conditions:[ |
|||
[ |
|||
{from_value:1}, |
|||
{to_value:200}, |
|||
{shipping_amount:100} |
|||
], |
|||
[ |
|||
{from_value:201}, |
|||
{to_value:3000}, |
|||
{shipping_amount:200} |
|||
], |
|||
]}, |
|||
{countries:[ |
|||
[ |
|||
{country:'India'} |
|||
] |
|||
]}, |
|||
{account:'Accounts Payable - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}, |
|||
{cost_center:'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} |
|||
]); |
|||
}, |
|||
() => {assert.ok(cur_frm.doc.name=='Two Day Shipping');}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,32 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Subscription", function (assert) { |
|||
assert.expect(4); |
|||
let done = assert.async(); |
|||
frappe.run_serially([ |
|||
// insert a new Subscription
|
|||
() => { |
|||
return frappe.tests.make("Subscription", [ |
|||
{reference_doctype: 'Sales Invoice'}, |
|||
{reference_document: 'SINV-00004'}, |
|||
{start_date: frappe.datetime.month_start()}, |
|||
{end_date: frappe.datetime.month_end()}, |
|||
{frequency: 'Weekly'} |
|||
]); |
|||
}, |
|||
() => cur_frm.savesubmit(), |
|||
() => frappe.timeout(1), |
|||
() => frappe.click_button('Yes'), |
|||
() => frappe.timeout(2), |
|||
() => { |
|||
assert.ok(cur_frm.doc.frequency.includes("Weekly"), "Set frequency Weekly"); |
|||
assert.ok(cur_frm.doc.reference_doctype.includes("Sales Invoice"), "Set base doctype Sales Invoice"); |
|||
assert.equal(cur_frm.doc.docstatus, 1, "Submitted subscription"); |
|||
assert.equal(cur_frm.doc.next_schedule_date, |
|||
frappe.datetime.add_days(frappe.datetime.get_today(), 7), "Set schedule date"); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -0,0 +1,114 @@ |
|||
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
|||
// For license information, please see license.txt
|
|||
/* eslint-disable */ |
|||
|
|||
function get_filters() { |
|||
let filters = [ |
|||
{ |
|||
"fieldname":"company", |
|||
"label": __("Company"), |
|||
"fieldtype": "Link", |
|||
"options": "Company", |
|||
"default": frappe.defaults.get_user_default("Company"), |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname":"filter_based_on", |
|||
"label": __("Filter Based On"), |
|||
"fieldtype": "Select", |
|||
"options": ["Fiscal Year", "Date Range"], |
|||
"default": ["Fiscal Year"], |
|||
"reqd": 1, |
|||
on_change: function() { |
|||
let filter_based_on = frappe.query_report.get_filter_value('filter_based_on'); |
|||
frappe.query_report.toggle_filter_display('from_fiscal_year', filter_based_on === 'Date Range'); |
|||
frappe.query_report.toggle_filter_display('to_fiscal_year', filter_based_on === 'Date Range'); |
|||
frappe.query_report.toggle_filter_display('period_start_date', filter_based_on === 'Fiscal Year'); |
|||
frappe.query_report.toggle_filter_display('period_end_date', filter_based_on === 'Fiscal Year'); |
|||
|
|||
frappe.query_report.refresh(); |
|||
} |
|||
}, |
|||
{ |
|||
"fieldname":"period_start_date", |
|||
"label": __("Start Date"), |
|||
"fieldtype": "Date", |
|||
"hidden": 1, |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname":"period_end_date", |
|||
"label": __("End Date"), |
|||
"fieldtype": "Date", |
|||
"hidden": 1, |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname":"from_fiscal_year", |
|||
"label": __("Start Year"), |
|||
"fieldtype": "Link", |
|||
"options": "Fiscal Year", |
|||
"default": frappe.defaults.get_user_default("fiscal_year"), |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname":"to_fiscal_year", |
|||
"label": __("End Year"), |
|||
"fieldtype": "Link", |
|||
"options": "Fiscal Year", |
|||
"default": frappe.defaults.get_user_default("fiscal_year"), |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname": "periodicity", |
|||
"label": __("Periodicity"), |
|||
"fieldtype": "Select", |
|||
"options": [ |
|||
{ "value": "Monthly", "label": __("Monthly") }, |
|||
{ "value": "Quarterly", "label": __("Quarterly") }, |
|||
{ "value": "Half-Yearly", "label": __("Half-Yearly") }, |
|||
{ "value": "Yearly", "label": __("Yearly") } |
|||
], |
|||
"default": "Monthly", |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname": "type", |
|||
"label": __("Invoice Type"), |
|||
"fieldtype": "Select", |
|||
"options": [ |
|||
{ "value": "Revenue", "label": __("Revenue") }, |
|||
{ "value": "Expense", "label": __("Expense") } |
|||
], |
|||
"default": "Revenue", |
|||
"reqd": 1 |
|||
}, |
|||
{ |
|||
"fieldname" : "with_upcoming_postings", |
|||
"label": __("Show with upcoming revenue/expense"), |
|||
"fieldtype": "Check", |
|||
"default": 1 |
|||
} |
|||
] |
|||
|
|||
return filters; |
|||
} |
|||
|
|||
frappe.query_reports["Deferred Revenue and Expense"] = { |
|||
"filters": get_filters(), |
|||
"formatter": function(value, row, column, data, default_formatter){ |
|||
return default_formatter(value, row, column, data); |
|||
}, |
|||
onload: function(report){ |
|||
let fiscal_year = frappe.defaults.get_user_default("fiscal_year"); |
|||
|
|||
frappe.model.with_doc("Fiscal Year", fiscal_year, function(r) { |
|||
var fy = frappe.model.get_doc("Fiscal Year", fiscal_year); |
|||
frappe.query_report.set_filter_value({ |
|||
period_start_date: fy.year_start_date, |
|||
period_end_date: fy.year_end_date |
|||
}); |
|||
}); |
|||
} |
|||
}; |
|||
|
@ -0,0 +1,32 @@ |
|||
{ |
|||
"add_total_row": 0, |
|||
"columns": [], |
|||
"creation": "2021-12-10 19:27:14.654220", |
|||
"disable_prepared_report": 0, |
|||
"disabled": 0, |
|||
"docstatus": 0, |
|||
"doctype": "Report", |
|||
"filters": [], |
|||
"idx": 0, |
|||
"is_standard": "Yes", |
|||
"modified": "2021-12-10 19:27:14.654220", |
|||
"modified_by": "Administrator", |
|||
"module": "Accounts", |
|||
"name": "Deferred Revenue and Expense", |
|||
"owner": "Administrator", |
|||
"prepared_report": 0, |
|||
"ref_doctype": "GL Entry", |
|||
"report_name": "Deferred Revenue and Expense", |
|||
"report_type": "Script Report", |
|||
"roles": [ |
|||
{ |
|||
"role": "Accounts User" |
|||
}, |
|||
{ |
|||
"role": "Accounts Manager" |
|||
}, |
|||
{ |
|||
"role": "Auditor" |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,440 @@ |
|||
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors |
|||
# License: MIT. See LICENSE |
|||
|
|||
import frappe |
|||
from frappe import _, qb |
|||
from frappe.query_builder import Column, functions |
|||
from frappe.utils import add_days, date_diff, flt, get_first_day, get_last_day, rounded |
|||
|
|||
from erpnext.accounts.report.financial_statements import get_period_list |
|||
|
|||
|
|||
class Deferred_Item(object): |
|||
""" |
|||
Helper class for processing items with deferred revenue/expense |
|||
""" |
|||
|
|||
def __init__(self, item, inv, gle_entries): |
|||
self.name = item |
|||
self.parent = inv.name |
|||
self.item_name = gle_entries[0].item_name |
|||
self.service_start_date = gle_entries[0].service_start_date |
|||
self.service_end_date = gle_entries[0].service_end_date |
|||
self.base_net_amount = gle_entries[0].base_net_amount |
|||
self.filters = inv.filters |
|||
self.period_list = inv.period_list |
|||
|
|||
if gle_entries[0].deferred_revenue_account: |
|||
self.type = "Deferred Sale Item" |
|||
self.deferred_account = gle_entries[0].deferred_revenue_account |
|||
elif gle_entries[0].deferred_expense_account: |
|||
self.type = "Deferred Purchase Item" |
|||
self.deferred_account = gle_entries[0].deferred_expense_account |
|||
|
|||
self.gle_entries = [] |
|||
# holds period wise total for item |
|||
self.period_total = [] |
|||
self.last_entry_date = self.service_start_date |
|||
|
|||
if gle_entries: |
|||
self.gle_entries = gle_entries |
|||
for x in self.gle_entries: |
|||
if self.get_amount(x): |
|||
self.last_entry_date = x.gle_posting_date |
|||
|
|||
def report_data(self): |
|||
""" |
|||
Generate report data for output |
|||
""" |
|||
ret_data = frappe._dict({"name": self.item_name}) |
|||
for period in self.period_total: |
|||
ret_data[period.key] = period.total |
|||
ret_data.indent = 1 |
|||
return ret_data |
|||
|
|||
def get_amount(self, entry): |
|||
""" |
|||
For a given GL/Journal posting, get balance based on item type |
|||
""" |
|||
if self.type == "Deferred Sale Item": |
|||
return entry.debit - entry.credit |
|||
elif self.type == "Deferred Purchase Item": |
|||
return -(entry.credit - entry.debit) |
|||
return 0 |
|||
|
|||
def get_item_total(self): |
|||
""" |
|||
Helper method - calculate booked amount. Includes simulated postings as well |
|||
""" |
|||
total = 0 |
|||
for gle_posting in self.gle_entries: |
|||
total += self.get_amount(gle_posting) |
|||
|
|||
return total |
|||
|
|||
def calculate_amount(self, start_date, end_date): |
|||
""" |
|||
start_date, end_date - datetime.datetime.date |
|||
return - estimated amount to post for given period |
|||
Calculated based on already booked amount and item service period |
|||
""" |
|||
total_months = ( |
|||
(self.service_end_date.year - self.service_start_date.year) * 12 |
|||
+ (self.service_end_date.month - self.service_start_date.month) |
|||
+ 1 |
|||
) |
|||
|
|||
prorate = date_diff(self.service_end_date, self.service_start_date) / date_diff( |
|||
get_last_day(self.service_end_date), get_first_day(self.service_start_date) |
|||
) |
|||
|
|||
actual_months = rounded(total_months * prorate, 1) |
|||
|
|||
already_booked_amount = self.get_item_total() |
|||
base_amount = self.base_net_amount / actual_months |
|||
|
|||
if base_amount + already_booked_amount > self.base_net_amount: |
|||
base_amount = self.base_net_amount - already_booked_amount |
|||
|
|||
if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date): |
|||
partial_month = flt(date_diff(end_date, start_date)) / flt( |
|||
date_diff(get_last_day(end_date), get_first_day(start_date)) |
|||
) |
|||
base_amount *= rounded(partial_month, 1) |
|||
|
|||
return base_amount |
|||
|
|||
def make_dummy_gle(self, name, date, amount): |
|||
""" |
|||
return - frappe._dict() of a dummy gle entry |
|||
""" |
|||
entry = frappe._dict( |
|||
{"name": name, "gle_posting_date": date, "debit": 0, "credit": 0, "posted": "not"} |
|||
) |
|||
if self.type == "Deferred Sale Item": |
|||
entry.debit = amount |
|||
elif self.type == "Deferred Purchase Item": |
|||
entry.credit = amount |
|||
return entry |
|||
|
|||
def simulate_future_posting(self): |
|||
""" |
|||
simulate future posting by creating dummy gl entries. starts from the last posting date. |
|||
""" |
|||
if add_days(self.last_entry_date, 1) < self.period_list[-1].to_date: |
|||
self.estimate_for_period_list = get_period_list( |
|||
self.filters.from_fiscal_year, |
|||
self.filters.to_fiscal_year, |
|||
add_days(self.last_entry_date, 1), |
|||
self.period_list[-1].to_date, |
|||
"Date Range", |
|||
"Monthly", |
|||
company=self.filters.company, |
|||
) |
|||
for period in self.estimate_for_period_list: |
|||
amount = self.calculate_amount(period.from_date, period.to_date) |
|||
gle = self.make_dummy_gle(period.key, period.to_date, amount) |
|||
self.gle_entries.append(gle) |
|||
|
|||
def calculate_item_revenue_expense_for_period(self): |
|||
""" |
|||
calculate item postings for each period and update period_total list |
|||
""" |
|||
for period in self.period_list: |
|||
period_sum = 0 |
|||
actual = 0 |
|||
for posting in self.gle_entries: |
|||
# if period.from_date <= posting.posting_date <= period.to_date: |
|||
if period.from_date <= posting.gle_posting_date <= period.to_date: |
|||
period_sum += self.get_amount(posting) |
|||
if posting.posted == "posted": |
|||
actual += self.get_amount(posting) |
|||
|
|||
self.period_total.append( |
|||
frappe._dict({"key": period.key, "total": period_sum, "actual": actual}) |
|||
) |
|||
return self.period_total |
|||
|
|||
|
|||
class Deferred_Invoice(object): |
|||
def __init__(self, invoice, items, filters, period_list): |
|||
""" |
|||
Helper class for processing invoices with deferred revenue/expense items |
|||
invoice - string : invoice name |
|||
items - list : frappe._dict() with item details. Refer Deferred_Item for required fields |
|||
""" |
|||
self.name = invoice |
|||
self.posting_date = items[0].posting_date |
|||
self.filters = filters |
|||
self.period_list = period_list |
|||
# holds period wise total for invoice |
|||
self.period_total = [] |
|||
|
|||
if items[0].deferred_revenue_account: |
|||
self.type = "Sales" |
|||
elif items[0].deferred_expense_account: |
|||
self.type = "Purchase" |
|||
|
|||
self.items = [] |
|||
# for each uniq items |
|||
self.uniq_items = set([x.item for x in items]) |
|||
for item in self.uniq_items: |
|||
self.items.append(Deferred_Item(item, self, [x for x in items if x.item == item])) |
|||
|
|||
def calculate_invoice_revenue_expense_for_period(self): |
|||
""" |
|||
calculate deferred revenue/expense for all items in invoice |
|||
""" |
|||
# initialize period_total list for invoice |
|||
for period in self.period_list: |
|||
self.period_total.append(frappe._dict({"key": period.key, "total": 0, "actual": 0})) |
|||
|
|||
for item in self.items: |
|||
item_total = item.calculate_item_revenue_expense_for_period() |
|||
# update invoice total |
|||
for idx, period in enumerate(self.period_list, 0): |
|||
self.period_total[idx].total += item_total[idx].total |
|||
self.period_total[idx].actual += item_total[idx].actual |
|||
return self.period_total |
|||
|
|||
def estimate_future(self): |
|||
""" |
|||
create dummy GL entries for upcoming months for all items in invoice |
|||
""" |
|||
[item.simulate_future_posting() for item in self.items] |
|||
|
|||
def report_data(self): |
|||
""" |
|||
generate report data for invoice, includes invoice total |
|||
""" |
|||
ret_data = [] |
|||
inv_total = frappe._dict({"name": self.name}) |
|||
for x in self.period_total: |
|||
inv_total[x.key] = x.total |
|||
inv_total.indent = 0 |
|||
ret_data.append(inv_total) |
|||
list(map(lambda item: ret_data.append(item.report_data()), self.items)) |
|||
return ret_data |
|||
|
|||
|
|||
class Deferred_Revenue_and_Expense_Report(object): |
|||
def __init__(self, filters=None): |
|||
""" |
|||
Initialize deferred revenue/expense report with user provided filters or system defaults, if none is provided |
|||
""" |
|||
|
|||
# If no filters are provided, get user defaults |
|||
if not filters: |
|||
fiscal_year = frappe.get_doc("Fiscal Year", frappe.defaults.get_user_default("fiscal_year")) |
|||
self.filters = frappe._dict( |
|||
{ |
|||
"company": frappe.defaults.get_user_default("Company"), |
|||
"filter_based_on": "Fiscal Year", |
|||
"period_start_date": fiscal_year.year_start_date, |
|||
"period_end_date": fiscal_year.year_end_date, |
|||
"from_fiscal_year": fiscal_year.year, |
|||
"to_fiscal_year": fiscal_year.year, |
|||
"periodicity": "Monthly", |
|||
"type": "Revenue", |
|||
"with_upcoming_postings": True, |
|||
} |
|||
) |
|||
else: |
|||
self.filters = frappe._dict(filters) |
|||
|
|||
self.period_list = None |
|||
self.deferred_invoices = [] |
|||
# holds period wise total for report |
|||
self.period_total = [] |
|||
|
|||
def get_period_list(self): |
|||
""" |
|||
Figure out selected period based on filters |
|||
""" |
|||
self.period_list = get_period_list( |
|||
self.filters.from_fiscal_year, |
|||
self.filters.to_fiscal_year, |
|||
self.filters.period_start_date, |
|||
self.filters.period_end_date, |
|||
self.filters.filter_based_on, |
|||
self.filters.periodicity, |
|||
company=self.filters.company, |
|||
) |
|||
|
|||
def get_invoices(self): |
|||
""" |
|||
Get all sales and purchase invoices which has deferred revenue/expense items |
|||
""" |
|||
gle = qb.DocType("GL Entry") |
|||
# column doesn't have an alias option |
|||
posted = Column("posted") |
|||
|
|||
if self.filters.type == "Revenue": |
|||
inv = qb.DocType("Sales Invoice") |
|||
inv_item = qb.DocType("Sales Invoice Item") |
|||
deferred_flag_field = inv_item["enable_deferred_revenue"] |
|||
deferred_account_field = inv_item["deferred_revenue_account"] |
|||
|
|||
elif self.filters.type == "Expense": |
|||
inv = qb.DocType("Purchase Invoice") |
|||
inv_item = qb.DocType("Purchase Invoice Item") |
|||
deferred_flag_field = inv_item["enable_deferred_expense"] |
|||
deferred_account_field = inv_item["deferred_expense_account"] |
|||
|
|||
query = ( |
|||
qb.from_(inv_item) |
|||
.join(inv) |
|||
.on(inv.name == inv_item.parent) |
|||
.join(gle) |
|||
.on((inv_item.name == gle.voucher_detail_no) & (deferred_account_field == gle.account)) |
|||
.select( |
|||
inv.name.as_("doc"), |
|||
inv.posting_date, |
|||
inv_item.name.as_("item"), |
|||
inv_item.item_name, |
|||
inv_item.service_start_date, |
|||
inv_item.service_end_date, |
|||
inv_item.base_net_amount, |
|||
deferred_account_field, |
|||
gle.posting_date.as_("gle_posting_date"), |
|||
functions.Sum(gle.debit).as_("debit"), |
|||
functions.Sum(gle.credit).as_("credit"), |
|||
posted, |
|||
) |
|||
.where( |
|||
(inv.docstatus == 1) |
|||
& (deferred_flag_field == 1) |
|||
& ( |
|||
( |
|||
(self.period_list[0].from_date >= inv_item.service_start_date) |
|||
& (inv_item.service_end_date >= self.period_list[0].from_date) |
|||
) |
|||
| ( |
|||
(inv_item.service_start_date >= self.period_list[0].from_date) |
|||
& (inv_item.service_start_date <= self.period_list[-1].to_date) |
|||
) |
|||
) |
|||
) |
|||
.groupby(inv.name, inv_item.name, gle.posting_date) |
|||
.orderby(gle.posting_date) |
|||
) |
|||
self.invoices = query.run(as_dict=True) |
|||
|
|||
uniq_invoice = set([x.doc for x in self.invoices]) |
|||
for inv in uniq_invoice: |
|||
self.deferred_invoices.append( |
|||
Deferred_Invoice( |
|||
inv, [x for x in self.invoices if x.doc == inv], self.filters, self.period_list |
|||
) |
|||
) |
|||
|
|||
def estimate_future(self): |
|||
""" |
|||
For all Invoices estimate upcoming postings |
|||
""" |
|||
for x in self.deferred_invoices: |
|||
x.estimate_future() |
|||
|
|||
def calculate_revenue_and_expense(self): |
|||
""" |
|||
calculate the deferred revenue/expense for all invoices |
|||
""" |
|||
# initialize period_total list for report |
|||
for period in self.period_list: |
|||
self.period_total.append(frappe._dict({"key": period.key, "total": 0, "actual": 0})) |
|||
|
|||
for inv in self.deferred_invoices: |
|||
inv_total = inv.calculate_invoice_revenue_expense_for_period() |
|||
# calculate total for whole report |
|||
for idx, period in enumerate(self.period_list, 0): |
|||
self.period_total[idx].total += inv_total[idx].total |
|||
self.period_total[idx].actual += inv_total[idx].actual |
|||
|
|||
def get_columns(self): |
|||
columns = [] |
|||
columns.append({"label": _("Name"), "fieldname": "name", "fieldtype": "Data", "read_only": 1}) |
|||
for period in self.period_list: |
|||
columns.append( |
|||
{ |
|||
"label": _(period.label), |
|||
"fieldname": period.key, |
|||
"fieldtype": "Currency", |
|||
"read_only": 1, |
|||
}) |
|||
return columns |
|||
|
|||
def generate_report_data(self): |
|||
""" |
|||
Generate report data for all invoices. Adds total rows for revenue and expense |
|||
""" |
|||
ret = [] |
|||
|
|||
for inv in self.deferred_invoices: |
|||
ret += inv.report_data() |
|||
|
|||
# empty row for padding |
|||
ret += [{}] |
|||
|
|||
# add total row |
|||
if ret is not []: |
|||
if self.filters.type == "Revenue": |
|||
total_row = frappe._dict({"name": "Total Deferred Income"}) |
|||
elif self.filters.type == "Expense": |
|||
total_row = frappe._dict({"name": "Total Deferred Expense"}) |
|||
|
|||
for idx, period in enumerate(self.period_list, 0): |
|||
total_row[period.key] = self.period_total[idx].total |
|||
ret.append(total_row) |
|||
|
|||
return ret |
|||
|
|||
def prepare_chart(self): |
|||
chart = { |
|||
"data": { |
|||
"labels": [period.label for period in self.period_list], |
|||
"datasets": [ |
|||
{ |
|||
"name": "Actual Posting", |
|||
"chartType": "bar", |
|||
"values": [x.actual for x in self.period_total], |
|||
} |
|||
], |
|||
}, |
|||
"type": "axis-mixed", |
|||
"height": 500, |
|||
"axisOptions": {"xAxisMode": "Tick", "xIsSeries": True}, |
|||
"barOptions": {"stacked": False, "spaceRatio": 0.5}, |
|||
} |
|||
|
|||
if self.filters.with_upcoming_postings: |
|||
chart["data"]["datasets"].append({ |
|||
"name": "Expected", |
|||
"chartType": "line", |
|||
"values": [x.total for x in self.period_total] |
|||
}) |
|||
|
|||
return chart |
|||
|
|||
def run(self, *args, **kwargs): |
|||
""" |
|||
Run report and generate data |
|||
""" |
|||
self.deferred_invoices.clear() |
|||
self.get_period_list() |
|||
self.get_invoices() |
|||
|
|||
if self.filters.with_upcoming_postings: |
|||
self.estimate_future() |
|||
self.calculate_revenue_and_expense() |
|||
|
|||
|
|||
def execute(filters=None): |
|||
report = Deferred_Revenue_and_Expense_Report(filters=filters) |
|||
report.run() |
|||
|
|||
columns = report.get_columns() |
|||
data = report.generate_report_data() |
|||
message = [] |
|||
chart = report.prepare_chart() |
|||
|
|||
return columns, data, message, chart |
@ -0,0 +1,253 @@ |
|||
import unittest |
|||
|
|||
import frappe |
|||
from frappe import qb |
|||
from frappe.utils import nowdate |
|||
|
|||
from erpnext.accounts.doctype.account.test_account import create_account |
|||
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice |
|||
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice |
|||
from erpnext.accounts.report.deferred_revenue_and_expense.deferred_revenue_and_expense import ( |
|||
Deferred_Revenue_and_Expense_Report, |
|||
) |
|||
from erpnext.buying.doctype.supplier.test_supplier import create_supplier |
|||
from erpnext.stock.doctype.item.test_item import create_item |
|||
|
|||
|
|||
class TestDeferredRevenueAndExpense(unittest.TestCase): |
|||
@classmethod |
|||
def setUpClass(self): |
|||
clear_old_entries() |
|||
create_company() |
|||
|
|||
def test_deferred_revenue(self): |
|||
# created deferred expense accounts, if not found |
|||
deferred_revenue_account = create_account( |
|||
account_name="Deferred Revenue", |
|||
parent_account="Current Liabilities - _CD", |
|||
company="_Test Company DR", |
|||
) |
|||
|
|||
acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings") |
|||
acc_settings.book_deferred_entries_based_on = "Months" |
|||
acc_settings.save() |
|||
|
|||
customer = frappe.new_doc("Customer") |
|||
customer.customer_name = "_Test Customer DR" |
|||
customer.type = "Individual" |
|||
customer.insert() |
|||
|
|||
item = create_item( |
|||
"_Test Internet Subscription", |
|||
is_stock_item=0, |
|||
warehouse="All Warehouses - _CD", |
|||
company="_Test Company DR", |
|||
) |
|||
item.enable_deferred_revenue = 1 |
|||
item.deferred_revenue_account = deferred_revenue_account |
|||
item.no_of_months = 3 |
|||
item.save() |
|||
|
|||
si = create_sales_invoice( |
|||
item=item.name, |
|||
company="_Test Company DR", |
|||
customer="_Test Customer DR", |
|||
debit_to="Debtors - _CD", |
|||
posting_date="2021-05-01", |
|||
parent_cost_center="Main - _CD", |
|||
cost_center="Main - _CD", |
|||
do_not_submit=True, |
|||
rate=300, |
|||
price_list_rate=300, |
|||
) |
|||
si.items[0].enable_deferred_revenue = 1 |
|||
si.items[0].service_start_date = "2021-05-01" |
|||
si.items[0].service_end_date = "2021-08-01" |
|||
si.items[0].deferred_revenue_account = deferred_revenue_account |
|||
si.items[0].income_account = "Sales - _CD" |
|||
si.save() |
|||
si.submit() |
|||
|
|||
pda = frappe.get_doc( |
|||
dict( |
|||
doctype="Process Deferred Accounting", |
|||
posting_date=nowdate(), |
|||
start_date="2021-05-01", |
|||
end_date="2021-08-01", |
|||
type="Income", |
|||
company="_Test Company DR", |
|||
) |
|||
) |
|||
pda.insert() |
|||
pda.submit() |
|||
|
|||
# execute report |
|||
fiscal_year = frappe.get_doc("Fiscal Year", frappe.defaults.get_user_default("fiscal_year")) |
|||
self.filters = frappe._dict( |
|||
{ |
|||
"company": frappe.defaults.get_user_default("Company"), |
|||
"filter_based_on": "Date Range", |
|||
"period_start_date": "2021-05-01", |
|||
"period_end_date": "2021-08-01", |
|||
"from_fiscal_year": fiscal_year.year, |
|||
"to_fiscal_year": fiscal_year.year, |
|||
"periodicity": "Monthly", |
|||
"type": "Revenue", |
|||
"with_upcoming_postings": False, |
|||
} |
|||
) |
|||
|
|||
report = Deferred_Revenue_and_Expense_Report(filters=self.filters) |
|||
report.run() |
|||
expected = [ |
|||
{"key": "may_2021", "total": 100.0, "actual": 100.0}, |
|||
{"key": "jun_2021", "total": 100.0, "actual": 100.0}, |
|||
{"key": "jul_2021", "total": 100.0, "actual": 100.0}, |
|||
{"key": "aug_2021", "total": 0, "actual": 0}, |
|||
] |
|||
self.assertEqual(report.period_total, expected) |
|||
|
|||
def test_deferred_expense(self): |
|||
# created deferred expense accounts, if not found |
|||
deferred_expense_account = create_account( |
|||
account_name="Deferred Expense", |
|||
parent_account="Current Assets - _CD", |
|||
company="_Test Company DR", |
|||
) |
|||
|
|||
acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings") |
|||
acc_settings.book_deferred_entries_based_on = "Months" |
|||
acc_settings.save() |
|||
|
|||
supplier = create_supplier( |
|||
supplier_name="_Test Furniture Supplier", supplier_group="Local", supplier_type="Company" |
|||
) |
|||
supplier.save() |
|||
|
|||
item = create_item( |
|||
"_Test Office Desk", |
|||
is_stock_item=0, |
|||
warehouse="All Warehouses - _CD", |
|||
company="_Test Company DR", |
|||
) |
|||
item.enable_deferred_expense = 1 |
|||
item.deferred_expense_account = deferred_expense_account |
|||
item.no_of_months_exp = 3 |
|||
item.save() |
|||
|
|||
pi = make_purchase_invoice( |
|||
item=item.name, |
|||
company="_Test Company DR", |
|||
supplier="_Test Furniture Supplier", |
|||
is_return=False, |
|||
update_stock=False, |
|||
posting_date=frappe.utils.datetime.date(2021, 5, 1), |
|||
parent_cost_center="Main - _CD", |
|||
cost_center="Main - _CD", |
|||
do_not_save=True, |
|||
rate=300, |
|||
price_list_rate=300, |
|||
warehouse="All Warehouses - _CD", |
|||
qty=1, |
|||
) |
|||
pi.set_posting_time = True |
|||
pi.items[0].enable_deferred_expense = 1 |
|||
pi.items[0].service_start_date = "2021-05-01" |
|||
pi.items[0].service_end_date = "2021-08-01" |
|||
pi.items[0].deferred_expense_account = deferred_expense_account |
|||
pi.items[0].expense_account = "Office Maintenance Expenses - _CD" |
|||
pi.save() |
|||
pi.submit() |
|||
|
|||
pda = frappe.get_doc( |
|||
dict( |
|||
doctype="Process Deferred Accounting", |
|||
posting_date=nowdate(), |
|||
start_date="2021-05-01", |
|||
end_date="2021-08-01", |
|||
type="Expense", |
|||
company="_Test Company DR", |
|||
) |
|||
) |
|||
pda.insert() |
|||
pda.submit() |
|||
|
|||
# execute report |
|||
fiscal_year = frappe.get_doc("Fiscal Year", frappe.defaults.get_user_default("fiscal_year")) |
|||
self.filters = frappe._dict( |
|||
{ |
|||
"company": frappe.defaults.get_user_default("Company"), |
|||
"filter_based_on": "Date Range", |
|||
"period_start_date": "2021-05-01", |
|||
"period_end_date": "2021-08-01", |
|||
"from_fiscal_year": fiscal_year.year, |
|||
"to_fiscal_year": fiscal_year.year, |
|||
"periodicity": "Monthly", |
|||
"type": "Expense", |
|||
"with_upcoming_postings": False, |
|||
} |
|||
) |
|||
|
|||
report = Deferred_Revenue_and_Expense_Report(filters=self.filters) |
|||
report.run() |
|||
expected = [ |
|||
{"key": "may_2021", "total": -100.0, "actual": -100.0}, |
|||
{"key": "jun_2021", "total": -100.0, "actual": -100.0}, |
|||
{"key": "jul_2021", "total": -100.0, "actual": -100.0}, |
|||
{"key": "aug_2021", "total": 0, "actual": 0}, |
|||
] |
|||
self.assertEqual(report.period_total, expected) |
|||
|
|||
|
|||
def create_company(): |
|||
company = frappe.db.exists("Company", "_Test Company DR") |
|||
if not company: |
|||
company = frappe.new_doc("Company") |
|||
company.company_name = "_Test Company DR" |
|||
company.default_currency = "INR" |
|||
company.chart_of_accounts = "Standard" |
|||
company.insert() |
|||
|
|||
|
|||
def clear_old_entries(): |
|||
item = qb.DocType("Item") |
|||
account = qb.DocType("Account") |
|||
customer = qb.DocType("Customer") |
|||
supplier = qb.DocType("Supplier") |
|||
sinv = qb.DocType("Sales Invoice") |
|||
sinv_item = qb.DocType("Sales Invoice Item") |
|||
pinv = qb.DocType("Purchase Invoice") |
|||
pinv_item = qb.DocType("Purchase Invoice Item") |
|||
|
|||
qb.from_(account).delete().where( |
|||
(account.account_name == "Deferred Revenue") |
|||
| (account.account_name == "Deferred Expense") & (account.company == "_Test Company DR") |
|||
).run() |
|||
qb.from_(item).delete().where( |
|||
(item.item_code == "_Test Internet Subscription") | (item.item_code == "_Test Office Rent") |
|||
).run() |
|||
qb.from_(customer).delete().where(customer.customer_name == "_Test Customer DR").run() |
|||
qb.from_(supplier).delete().where(supplier.supplier_name == "_Test Furniture Supplier").run() |
|||
|
|||
# delete existing invoices with deferred items |
|||
deferred_invoices = ( |
|||
qb.from_(sinv) |
|||
.join(sinv_item) |
|||
.on(sinv.name == sinv_item.parent) |
|||
.select(sinv.name) |
|||
.where(sinv_item.enable_deferred_revenue == 1) |
|||
.run() |
|||
) |
|||
if deferred_invoices: |
|||
qb.from_(sinv).delete().where(sinv.name.isin(deferred_invoices)).run() |
|||
|
|||
deferred_invoices = ( |
|||
qb.from_(pinv) |
|||
.join(pinv_item) |
|||
.on(pinv.name == pinv_item.parent) |
|||
.select(pinv.name) |
|||
.where(pinv_item.enable_deferred_expense == 1) |
|||
.run() |
|||
) |
|||
if deferred_invoices: |
|||
qb.from_(pinv).delete().where(pinv.name.isin(deferred_invoices)).run() |
@ -1,27 +1,30 @@ |
|||
{ |
|||
"add_total_row": 0, |
|||
"apply_user_permissions": 1, |
|||
"creation": "2013-05-06 12:28:23", |
|||
"disabled": 0, |
|||
"docstatus": 0, |
|||
"doctype": "Report", |
|||
"idx": 3, |
|||
"is_standard": "Yes", |
|||
"modified": "2017-03-06 05:52:57.645281", |
|||
"modified_by": "Administrator", |
|||
"module": "Accounts", |
|||
"name": "Sales Partners Commission", |
|||
"owner": "Administrator", |
|||
"query": "SELECT\n sales_partner as \"Sales Partner:Link/Sales Partner:150\",\n\tsum(base_net_total) as \"Invoiced Amount (Exclusive Tax):Currency:210\",\n\tsum(total_commission) as \"Total Commission:Currency:150\",\n\tsum(total_commission)*100/sum(base_net_total) as \"Average Commission Rate:Currency:170\"\nFROM\n\t`tabSales Invoice`\nWHERE\n\tdocstatus = 1 and ifnull(base_net_total, 0) > 0 and ifnull(total_commission, 0) > 0\nGROUP BY\n\tsales_partner\nORDER BY\n\t\"Total Commission:Currency:120\"", |
|||
"ref_doctype": "Sales Invoice", |
|||
"report_name": "Sales Partners Commission", |
|||
"report_type": "Query Report", |
|||
"add_total_row": 0, |
|||
"columns": [], |
|||
"creation": "2013-05-06 12:28:23", |
|||
"disable_prepared_report": 0, |
|||
"disabled": 0, |
|||
"docstatus": 0, |
|||
"doctype": "Report", |
|||
"filters": [], |
|||
"idx": 3, |
|||
"is_standard": "Yes", |
|||
"modified": "2021-10-06 06:26:07.881340", |
|||
"modified_by": "Administrator", |
|||
"module": "Accounts", |
|||
"name": "Sales Partners Commission", |
|||
"owner": "Administrator", |
|||
"prepared_report": 0, |
|||
"query": "SELECT\n sales_partner as \"Sales Partner:Link/Sales Partner:220\",\n\tsum(base_net_total) as \"Invoiced Amount (Excl. Tax):Currency:220\",\n\tsum(amount_eligible_for_commission) as \"Amount Eligible for Commission:Currency:220\",\n\tsum(total_commission) as \"Total Commission:Currency:170\",\n\tsum(total_commission)*100/sum(amount_eligible_for_commission) as \"Average Commission Rate:Percent:220\"\nFROM\n\t`tabSales Invoice`\nWHERE\n\tdocstatus = 1 and ifnull(base_net_total, 0) > 0 and ifnull(total_commission, 0) > 0\nGROUP BY\n\tsales_partner\nORDER BY\n\t\"Total Commission:Currency:120\"", |
|||
"ref_doctype": "Sales Invoice", |
|||
"report_name": "Sales Partners Commission", |
|||
"report_type": "Query Report", |
|||
"roles": [ |
|||
{ |
|||
"role": "Accounts Manager" |
|||
}, |
|||
}, |
|||
{ |
|||
"role": "Accounts User" |
|||
} |
|||
] |
|||
} |
|||
} |
@ -1,116 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Crop", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(2); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Item
|
|||
() => frappe.tests.make('Item', [ |
|||
// values to be set
|
|||
{item_code: 'Basil Seeds'}, |
|||
{item_name: 'Basil Seeds'}, |
|||
{item_group: 'Seed'} |
|||
]), |
|||
// insert a new Item
|
|||
() => frappe.tests.make('Item', [ |
|||
// values to be set
|
|||
{item_code: 'Twigs'}, |
|||
{item_name: 'Twigs'}, |
|||
{item_group: 'By-product'} |
|||
]), |
|||
// insert a new Item
|
|||
() => frappe.tests.make('Item', [ |
|||
// values to be set
|
|||
{item_code: 'Basil Leaves'}, |
|||
{item_name: 'Basil Leaves'}, |
|||
{item_group: 'Produce'} |
|||
]), |
|||
// insert a new Crop
|
|||
() => frappe.tests.make('Crop', [ |
|||
// values to be set
|
|||
{title: 'Basil from seed'}, |
|||
{crop_name: 'Basil'}, |
|||
{scientific_name: 'Ocimum basilicum'}, |
|||
{materials_required: [ |
|||
[ |
|||
{item_code: 'Basil Seeds'}, |
|||
{qty: '25'}, |
|||
{uom: 'Nos'}, |
|||
{rate: '1'} |
|||
], |
|||
[ |
|||
{item_code: 'Urea'}, |
|||
{qty: '5'}, |
|||
{uom: 'Kg'}, |
|||
{rate: '10'} |
|||
] |
|||
]}, |
|||
{byproducts: [ |
|||
[ |
|||
{item_code: 'Twigs'}, |
|||
{qty: '25'}, |
|||
{uom: 'Nos'}, |
|||
{rate: '1'} |
|||
] |
|||
]}, |
|||
{produce: [ |
|||
[ |
|||
{item_code: 'Basil Leaves'}, |
|||
{qty: '100'}, |
|||
{uom: 'Nos'}, |
|||
{rate: '1'} |
|||
] |
|||
]}, |
|||
{agriculture_task: [ |
|||
[ |
|||
{task_name: "Plough the field"}, |
|||
{start_day: 1}, |
|||
{end_day: 1}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "Plant the seeds"}, |
|||
{start_day: 2}, |
|||
{end_day: 3}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "Water the field"}, |
|||
{start_day: 4}, |
|||
{end_day: 4}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "First harvest"}, |
|||
{start_day: 8}, |
|||
{end_day: 8}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "Add the fertilizer"}, |
|||
{start_day: 10}, |
|||
{end_day: 12}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "Final cut"}, |
|||
{start_day: 15}, |
|||
{end_day: 15}, |
|||
{holiday_management: "Ignore holidays"} |
|||
] |
|||
]} |
|||
]), |
|||
// agriculture task list
|
|||
() => { |
|||
assert.equal(cur_frm.doc.name, 'Basil from seed'); |
|||
assert.equal(cur_frm.doc.period, 15); |
|||
}, |
|||
() => done() |
|||
]); |
|||
|
|||
}); |
@ -1,34 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Crop Cycle", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(1); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Crop Cycle
|
|||
() => frappe.tests.make('Crop Cycle', [ |
|||
// values to be set
|
|||
{title: 'Basil from seed 2017'}, |
|||
{detected_disease: [ |
|||
[ |
|||
{start_date: '2017-11-21'}, |
|||
{disease: 'Aphids'} |
|||
] |
|||
]}, |
|||
{linked_land_unit: [ |
|||
[ |
|||
{land_unit: 'Basil Farm'} |
|||
] |
|||
]}, |
|||
{crop: 'Basil from seed'}, |
|||
{start_date: '2017-11-11'}, |
|||
{cycle_type: 'Less than a year'} |
|||
]), |
|||
() => assert.equal(cur_frm.doc.name, 'Basil from seed 2017'), |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,38 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Disease", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(1); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Disease
|
|||
() => frappe.tests.make('Disease', [ |
|||
// values to be set
|
|||
{common_name: 'Aphids'}, |
|||
{scientific_name: 'Aphidoidea'}, |
|||
{treatment_task: [ |
|||
[ |
|||
{task_name: "Survey and find the aphid locations"}, |
|||
{start_day: 1}, |
|||
{end_day: 2}, |
|||
{holiday_management: "Ignore holidays"} |
|||
], |
|||
[ |
|||
{task_name: "Apply Pesticides"}, |
|||
{start_day: 3}, |
|||
{end_day: 3}, |
|||
{holiday_management: "Ignore holidays"} |
|||
] |
|||
]} |
|||
]), |
|||
() => { |
|||
assert.equal(cur_frm.doc.treatment_period, 3); |
|||
}, |
|||
() => done() |
|||
]); |
|||
|
|||
}); |
@ -1,31 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Fertilizer", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(1); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Item
|
|||
() => frappe.tests.make('Item', [ |
|||
// values to be set
|
|||
{item_code: 'Urea'}, |
|||
{item_name: 'Urea'}, |
|||
{item_group: 'Fertilizer'} |
|||
]), |
|||
// insert a new Fertilizer
|
|||
() => frappe.tests.make('Fertilizer', [ |
|||
// values to be set
|
|||
{fertilizer_name: 'Urea'}, |
|||
{item: 'Urea'} |
|||
]), |
|||
() => { |
|||
assert.equal(cur_frm.doc.name, 'Urea'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
|
|||
}); |
@ -1,26 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Soil Texture", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(2); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Soil Texture
|
|||
() => frappe.tests.make('Soil Texture', [ |
|||
// values to be set
|
|||
{location: '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[72.882185,19.076395]}}]}'}, |
|||
{collection_datetime: '2017-11-08'}, |
|||
{clay_composition: 20}, |
|||
{sand_composition: 30} |
|||
]), |
|||
() => { |
|||
assert.equal(cur_frm.doc.silt_composition, 50); |
|||
assert.equal(cur_frm.doc.soil_type, 'Silt Loam'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
}); |
@ -1,25 +0,0 @@ |
|||
/* eslint-disable */ |
|||
// rename this file from _test_[name] to test_[name] to activate
|
|||
// and remove above this line
|
|||
|
|||
QUnit.test("test: Water Analysis", function (assert) { |
|||
let done = assert.async(); |
|||
|
|||
// number of asserts
|
|||
assert.expect(1); |
|||
|
|||
frappe.run_serially([ |
|||
// insert a new Water Analysis
|
|||
() => frappe.tests.make('Water Analysis', [ |
|||
// values to be set
|
|||
{location: '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[72.882185,19.076395]}}]}'}, |
|||
{collection_datetime: '2017-11-08 18:43:57'}, |
|||
{laboratory_testing_datetime: '2017-11-10 18:43:57'} |
|||
]), |
|||
() => { |
|||
assert.equal(cur_frm.doc.result_datetime, '2017-11-10 18:43:57'); |
|||
}, |
|||
() => done() |
|||
]); |
|||
|
|||
}); |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue