Merge branch 'develop' into pos-service-items

This commit is contained in:
Saqib Ansari 2021-12-29 14:55:20 +05:30 committed by GitHub
commit 689e08aca3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
248 changed files with 1766 additions and 8066 deletions

View File

@ -24,20 +24,6 @@ body:
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: Affected versions.
multiple: true
options:
- v12
- v13
- v14
- develop
validations:
required: true
- type: dropdown
id: module
attributes:
@ -86,7 +72,7 @@ body:
- manual install
- FrappeCloud
validations:
required: true
required: false
- type: textarea
id: logs
@ -95,12 +81,7 @@ body:
description: Please copy and paste any relevant log output. This will be automatically formatted.
render: shell
- type: checkboxes
id: terms
- type: markdown
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/frappe/erpnext/blob/develop/CODE_OF_CONDUCT.md)
options:
- label: I agree to follow this project's Code of Conduct
required: true
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
dev-requirements.txt Normal file
View File

@ -0,0 +1 @@
hypothesis~=6.31.0

View File

@ -55,9 +55,9 @@ def set_perpetual_inventory(enable=1, company=None):
company.enable_perpetual_inventory = enable
company.save()
def encode_company_abbr(name, company):
def encode_company_abbr(name, company=None, abbr=None):
'''Returns name encoded with company abbreviation'''
company_abbr = frappe.get_cached_value('Company', company, "abbr")
company_abbr = abbr or frappe.get_cached_value('Company', company, "abbr")
parts = name.rsplit(" - ", 1)
if parts[-1].lower() != company_abbr.lower():

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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'),
]);
}
};

View File

@ -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);
}
};

View File

@ -218,6 +218,8 @@ def reconcile_vouchers(bank_transaction_name, vouchers):
# updated clear date of all the vouchers based on the bank transaction
vouchers = json.loads(vouchers)
transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
company_account = frappe.db.get_value('Bank Account', transaction.bank_account, 'account')
if transaction.unallocated_amount == 0:
frappe.throw(_("This bank transaction is already fully reconciled"))
total_amount = 0
@ -226,7 +228,7 @@ def reconcile_vouchers(bank_transaction_name, vouchers):
total_amount += get_paid_amount(frappe._dict({
'payment_document': voucher['payment_doctype'],
'payment_entry': voucher['payment_name'],
}), transaction.currency)
}), transaction.currency, company_account)
if total_amount > transaction.unallocated_amount:
frappe.throw(_("The Sum Total of Amounts of All Selected Vouchers Should be Less than the Unallocated Amount of the Bank Transaction"))
@ -261,7 +263,7 @@ def get_linked_payments(bank_transaction_name, document_types = None):
return matching
def check_matching(bank_account, company, transaction, document_types):
# combine all types of vocuhers
# combine all types of vouchers
subquery = get_queries(bank_account, company, transaction, document_types)
filters = {
"amount": transaction.unallocated_amount,
@ -343,13 +345,11 @@ def get_pe_matching_query(amount_condition, account_from_to, transaction):
def get_je_matching_query(amount_condition, transaction):
# get matching journal entry query
# We have mapping at the bank level
# So one bank could have both types of bank accounts like asset and liability
# So cr_or_dr should be judged only on basis of withdrawal and deposit and not account type
company_account = frappe.get_value("Bank Account", transaction.bank_account, "account")
root_type = frappe.get_value("Account", company_account, "root_type")
if root_type == "Liability":
cr_or_dr = "debit" if transaction.withdrawal > 0 else "credit"
else:
cr_or_dr = "credit" if transaction.withdrawal > 0 else "debit"
cr_or_dr = "credit" if transaction.withdrawal > 0 else "debit"
return f"""

View File

@ -102,7 +102,7 @@ def get_total_allocated_amount(payment_entry):
AND
bt.docstatus = 1""", (payment_entry.payment_document, payment_entry.payment_entry), as_dict=True)
def get_paid_amount(payment_entry, currency):
def get_paid_amount(payment_entry, currency, bank_account):
if payment_entry.payment_document in ["Payment Entry", "Sales Invoice", "Purchase Invoice"]:
paid_amount_field = "paid_amount"
@ -115,7 +115,7 @@ def get_paid_amount(payment_entry, currency):
payment_entry.payment_entry, paid_amount_field)
elif payment_entry.payment_document == "Journal Entry":
return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "total_credit")
return frappe.db.get_value('Journal Entry Account', {'parent': payment_entry.payment_entry, 'account': bank_account}, "sum(credit_in_account_currency)")
elif payment_entry.payment_document == "Expense Claim":
return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "total_amount_reimbursed")

View File

@ -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()
]);
});

View File

@ -148,7 +148,7 @@ def make_company():
company.company_name = "_Test Opening Invoice Company"
company.abbr = "_TOIC"
company.default_currency = "INR"
company.country = "India"
company.country = "Pakistan"
company.insert()
return company

View File

@ -110,12 +110,13 @@
"description": "Reference number of the invoice from the previous system",
"fieldname": "invoice_number",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Invoice Number"
}
],
"istable": 1,
"links": [],
"modified": "2021-12-13 18:15:41.295007",
"modified": "2021-12-17 19:25:06.053187",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Opening Invoice Creation Tool Item",

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -986,7 +986,7 @@ class TestPurchaseInvoice(unittest.TestCase):
pi = make_purchase_invoice(item=item.name, qty=1, rate=100, do_not_save=True)
pi.set_posting_time = 1
pi.posting_date = '2019-03-15'
pi.posting_date = '2019-01-10'
pi.items[0].enable_deferred_expense = 1
pi.items[0].service_start_date = "2019-01-10"
pi.items[0].service_end_date = "2019-03-15"

View File

@ -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()
]);
});

View File

@ -1049,6 +1049,8 @@ class SalesInvoice(SellingController):
frappe.flags.is_reverse_depr_entry = False
asset.flags.ignore_validate_update_after_submit = True
schedule.journal_entry = None
depreciation_amount = self.get_depreciation_amount_in_je(reverse_journal_entry)
asset.finance_books[0].value_after_depreciation += depreciation_amount
asset.save()
def get_posting_date_of_sales_invoice(self):
@ -1071,6 +1073,12 @@ class SalesInvoice(SellingController):
return False
def get_depreciation_amount_in_je(self, journal_entry):
if journal_entry.accounts[0].debit_in_account_currency:
return journal_entry.accounts[0].debit_in_account_currency
else:
return journal_entry.accounts[0].credit_in_account_currency
@property
def enable_discount_accounting(self):
if not hasattr(self, "_enable_discount_accounting"):

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -370,7 +370,7 @@ def get_account_heads(root_type, companies, filters):
accounts = get_accounts(root_type, filters)
if not accounts:
return None, None
return None, None, None
accounts = update_parent_account_names(accounts)

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -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()
]);
});

View File

@ -1,80 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order", function(assert) {
assert.expect(16);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{currency: 'INR'},
{items: [
[
{"item_code": 'Test Product 4'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 2)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 100},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
],
[
{"item_code": 'Test Product 1'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"qty": 2},
{"uom": 'Unit'},
{"rate": 100},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{tc_name: 'Test Term 1'},
{terms: 'This is a term.'}
]);
},
() => {
// Get supplier details
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 1), "Schedule Date correct");
assert.ok(cur_frm.doc.contact_email == 'test@supplier.com', "Contact email correct");
// Get item details
assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item name correct");
assert.ok(cur_frm.doc.items[0].description == 'Test Product 4', "Description correct");
assert.ok(cur_frm.doc.items[0].qty == 5, "Quantity correct");
assert.ok(cur_frm.doc.items[0].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 2), "Schedule Date correct");
assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Item name correct");
assert.ok(cur_frm.doc.items[1].description == 'Test Product 1', "Description correct");
assert.ok(cur_frm.doc.items[1].qty == 2, "Quantity correct");
assert.ok(cur_frm.doc.items[1].schedule_date == cur_frm.doc.schedule_date, "Schedule Date correct");
// Calculate total
assert.ok(cur_frm.doc.total == 700, "Total correct");
// Get terms
assert.ok(cur_frm.doc.terms == 'This is a term.', "Terms correct");
},
() => cur_frm.print_doc(),
() => frappe.timeout(2),
() => {
assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
assert.ok($('div > div:nth-child(5) > div > div > table > tbody > tr > td:nth-child(4) > div').text().includes('Test Product 4'), "Print Preview Works");
},
() => cur_frm.print_doc(),
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.status == 'To Receive and Bill', "Submitted successfully");
},
() => done()
]);
});

View File

@ -1,61 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with get items", function(assert) {
assert.expect(4);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-USD'},
{currency: 'USD'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]}
]);
},
() => {
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
},
() => frappe.timeout(0.3),
() => frappe.click_button('Get items from'),
() => frappe.timeout(0.3),
() => frappe.click_link('Product Bundle'),
() => frappe.timeout(0.5),
() => cur_dialog.set_value('product_bundle', 'Computer'),
() => frappe.click_button('Get Items'),
() => frappe.timeout(1),
// Check if items are fetched from Product Bundle
() => {
assert.ok(cur_frm.doc.items[1].item_name == 'CPU', "Product bundle item 1 correct");
assert.ok(cur_frm.doc.items[2].item_name == 'Screen', "Product bundle item 2 correct");
assert.ok(cur_frm.doc.items[3].item_name == 'Keyboard', "Product bundle item 3 correct");
},
() => cur_frm.doc.items[1].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
() => cur_frm.doc.items[2].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
() => cur_frm.doc.items[3].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
() => cur_frm.save(),
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,74 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order receipt", function(assert) {
assert.expect(5);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-USD'},
{currency: 'USD'},
{items: [
[
{"item_code": 'Test Product 1'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 100},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
]);
},
() => {
// Check supplier and item details
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 1', "Item name correct");
assert.ok(cur_frm.doc.items[0].description == 'Test Product 1', "Description correct");
assert.ok(cur_frm.doc.items[0].qty == 5, "Quantity correct");
},
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1.5),
() => frappe.click_button('Close'),
() => frappe.timeout(0.3),
// Make Purchase Receipt
() => frappe.click_button('Make'),
() => frappe.timeout(0.3),
() => frappe.click_link('Receipt'),
() => frappe.timeout(2),
() => cur_frm.save(),
// Save and submit Purchase Receipt
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1),
// View Purchase order in Stock Ledger
() => frappe.click_button('View'),
() => frappe.timeout(0.3),
() => frappe.click_link('Stock Ledger'),
() => frappe.timeout(2),
() => {
assert.ok($('div.slick-cell.l2.r2 > a').text().includes('Test Product 1')
&& $('div.slick-cell.l9.r9 > div').text().includes(5), "Stock ledger entry correct");
},
() => done()
]);
});

View File

@ -1,47 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with discount on grand total", function(assert) {
assert.expect(4);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-EUR'},
{currency: 'EUR'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 500 },
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{apply_discount_on: 'Grand Total'},
{additional_discount_percentage: 10}
]);
},
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.items[0].rate == 500, "Rate correct");
// Calculate total
assert.ok(cur_frm.doc.total == 2500, "Total correct");
// Calculate grand total after discount
assert.ok(cur_frm.doc.grand_total == 2250, "Grand total correct");
},
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,44 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with item wise discount", function(assert) {
assert.expect(4);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-EUR'},
{currency: 'EUR'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))},
{"discount_percentage": 20}
]
]}
]);
},
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.items[0].discount_percentage == 20, "Discount correct");
// Calculate totals after discount
assert.ok(cur_frm.doc.total == 2000, "Total correct");
assert.ok(cur_frm.doc.grand_total == 2000, "Grand total correct");
},
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,39 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with multi UOM", function(assert) {
assert.expect(3);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 100},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]}
]);
},
() => {
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item name correct");
assert.ok(cur_frm.doc.items[0].uom == 'Unit', "Multi UOM correct");
},
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,43 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with shipping rule", function(assert) {
assert.expect(3);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-USD'},
{currency: 'USD'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 500 },
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{shipping_rule:'Two Day Shipping'}
]);
},
() => {
// Check grand total
assert.ok(cur_frm.doc.total_taxes_and_charges == 200, "Taxes and charges correct");
assert.ok(cur_frm.doc.grand_total == 2700, "Grand total correct");
},
() => frappe.timeout(0.3),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,44 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: purchase order with taxes and charges", function(assert) {
assert.expect(3);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Purchase Order', [
{supplier: 'Test Supplier'},
{is_subcontracted: 'No'},
{buying_price_list: 'Test-Buying-USD'},
{currency: 'USD'},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 500 },
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{taxes_and_charges: 'TEST In State GST - FT'}
]);
},
() => {
// Check taxes and calculate grand total
assert.ok(cur_frm.doc.taxes[1].account_head=='SGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), "Account Head abbr correct");
assert.ok(cur_frm.doc.total_taxes_and_charges == 225, "Taxes and charges correct");
assert.ok(cur_frm.doc.grand_total == 2725, "Grand total correct");
},
() => frappe.timeout(0.3),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,76 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: request_for_quotation", function(assert) {
assert.expect(14);
let done = assert.async();
let date;
frappe.run_serially([
() => {
date = frappe.datetime.add_days(frappe.datetime.now_date(), 10);
return frappe.tests.make('Request for Quotation', [
{transaction_date: date},
{suppliers: [
[
{"supplier": 'Test Supplier'},
{"email_id": 'test@supplier.com'}
]
]},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(),20)},
{"warehouse": 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{message_for_supplier: 'Please supply the specified items at the best possible rates'},
{tc_name: 'Test Term 1'}
]);
},
() => frappe.timeout(3),
() => {
assert.ok(cur_frm.doc.transaction_date == date, "Date correct");
assert.ok(cur_frm.doc.company == cur_frm.doc.company, "Company correct");
assert.ok(cur_frm.doc.suppliers[0].supplier_name == 'Test Supplier', "Supplier name correct");
assert.ok(cur_frm.doc.suppliers[0].contact == 'Contact 3-Test Supplier', "Contact correct");
assert.ok(cur_frm.doc.suppliers[0].email_id == 'test@supplier.com', "Email id correct");
assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item Name correct");
assert.ok(cur_frm.doc.items[0].warehouse == 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company")), "Warehouse correct");
assert.ok(cur_frm.doc.message_for_supplier == 'Please supply the specified items at the best possible rates', "Reply correct");
assert.ok(cur_frm.doc.tc_name == 'Test Term 1', "Term name correct");
},
() => frappe.timeout(3),
() => cur_frm.print_doc(),
() => frappe.timeout(1),
() => {
assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
assert.ok($('.section-break+ .section-break .column-break:nth-child(1) .value').text().includes("Test Product 4"), "Print Preview Works");
},
() => cur_frm.print_doc(),
() => frappe.timeout(1),
() => frappe.click_button('Get items from'),
() => frappe.timeout(0.3),
() => frappe.click_link('Material Request'),
() => frappe.timeout(1),
() => frappe.click_button('Get Items'),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Getting items from material requests work");
},
() => cur_frm.save(),
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.docstatus == 1, "Quotation request submitted");
},
() => frappe.click_button('Send Supplier Emails'),
() => frappe.timeout(6),
() => {
assert.ok($('div.modal.fade.in > div.modal-dialog > div > div.modal-body.ui-front > div.msgprint').text().includes("Email sent to supplier Test Supplier"), "Send emails working");
},
() => frappe.click_button('Close'),
() => done()
]);
});

View File

@ -1,128 +0,0 @@
QUnit.module('buying');
QUnit.test("Test: Request for Quotation", function (assert) {
assert.expect(5);
let done = assert.async();
let rfq_name = "";
frappe.run_serially([
// Go to RFQ list
() => frappe.set_route("List", "Request for Quotation"),
// Create a new RFQ
() => frappe.new_doc("Request for Quotation"),
() => frappe.timeout(1),
() => cur_frm.set_value("transaction_date", "04-04-2017"),
() => cur_frm.set_value("company", "For Testing"),
// Add Suppliers
() => {
cur_frm.fields_dict.suppliers.grid.grid_rows[0].toggle_view();
},
() => frappe.timeout(1),
() => {
cur_frm.fields_dict.suppliers.grid.grid_rows[0].doc.supplier = "_Test Supplier";
frappe.click_check('Send Email');
cur_frm.cur_grid.frm.script_manager.trigger('supplier');
},
() => frappe.timeout(1),
() => {
cur_frm.cur_grid.toggle_view();
},
() => frappe.timeout(1),
() => frappe.click_button('Add Row',0),
() => frappe.timeout(1),
() => {
cur_frm.fields_dict.suppliers.grid.grid_rows[1].toggle_view();
},
() => frappe.timeout(1),
() => {
cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.supplier = "_Test Supplier 1";
frappe.click_check('Send Email');
cur_frm.cur_grid.frm.script_manager.trigger('supplier');
},
() => frappe.timeout(1),
() => {
cur_frm.cur_grid.toggle_view();
},
() => frappe.timeout(1),
// Add Item
() => {
cur_frm.fields_dict.items.grid.grid_rows[0].toggle_view();
},
() => frappe.timeout(1),
() => {
cur_frm.fields_dict.items.grid.grid_rows[0].doc.item_code = "_Test Item";
frappe.set_control('item_code',"_Test Item");
frappe.set_control('qty',5);
frappe.set_control('schedule_date', "05-05-2017");
cur_frm.cur_grid.frm.script_manager.trigger('supplier');
},
() => frappe.timeout(2),
() => {
cur_frm.cur_grid.toggle_view();
},
() => frappe.timeout(2),
() => {
cur_frm.fields_dict.items.grid.grid_rows[0].doc.warehouse = "_Test Warehouse - FT";
},
() => frappe.click_button('Save'),
() => frappe.timeout(1),
() => frappe.click_button('Submit'),
() => frappe.timeout(1),
() => frappe.click_button('Yes'),
() => frappe.timeout(1),
() => frappe.click_button('Menu'),
() => frappe.timeout(1),
() => frappe.click_link('Reload'),
() => frappe.timeout(1),
() => {
assert.equal(cur_frm.doc.docstatus, 1);
rfq_name = cur_frm.doc.name;
assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[0].doc.quote_status == "Pending");
assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.quote_status == "Pending");
},
() => {
cur_frm.fields_dict.suppliers.grid.grid_rows[0].toggle_view();
},
() => frappe.timeout(1),
() => frappe.timeout(1),
() => {
cur_frm.cur_grid.toggle_view();
},
() => frappe.click_button('Update'),
() => frappe.timeout(1),
() => frappe.click_button('Supplier Quotation'),
() => frappe.timeout(1),
() => frappe.click_link('Make'),
() => frappe.timeout(1),
() => {
frappe.set_control('supplier',"_Test Supplier 1");
},
() => frappe.timeout(1),
() => frappe.click_button('Make Supplier Quotation'),
() => frappe.timeout(1),
() => cur_frm.set_value("company", "For Testing"),
() => cur_frm.fields_dict.items.grid.grid_rows[0].doc.rate = 4.99,
() => frappe.timeout(1),
() => frappe.click_button('Save'),
() => frappe.timeout(1),
() => frappe.click_button('Submit'),
() => frappe.timeout(1),
() => frappe.click_button('Yes'),
() => frappe.timeout(1),
() => frappe.set_route("List", "Request for Quotation"),
() => frappe.timeout(2),
() => frappe.set_route("List", "Request for Quotation"),
() => frappe.timeout(2),
() => frappe.click_link(rfq_name),
() => frappe.timeout(1),
() => frappe.click_button('Menu'),
() => frappe.timeout(1),
() => frappe.click_link('Reload'),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.quote_status == "Received");
},
() => done()
]);
});

View File

@ -1,77 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: supplier", function(assert) {
assert.expect(6);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Supplier', [
{supplier_name: 'Test Supplier'},
{supplier_group: 'Hardware'},
{country: 'India'},
{default_currency: 'INR'},
{accounts: [
[
{'company': "For Testing"},
{'account': "Creditors - FT"}
]]
}
]);
},
() => frappe.timeout(1),
() => frappe.click_button('New Address'),
() => {
return frappe.tests.set_form_values(cur_frm, [
{address_title:"Test3"},
{address_type: "Billing"},
{address_line1: "Billing Street 3"},
{city: "Billing City 3"},
]);
},
() => cur_frm.save(),
() => frappe.timeout(2),
() => frappe.click_button('New Address'),
() => {
return frappe.tests.set_form_values(cur_frm, [
{address_title:"Test3"},
{address_type: "Shipping"},
{address_line1: "Shipping Street 3"},
{city: "Shipping City 3"},
]);
},
() => cur_frm.save(),
() => frappe.timeout(2),
() => frappe.click_button('New Address'),
() => {
return frappe.tests.set_form_values(cur_frm, [
{address_title:"Test3"},
{address_type: "Warehouse"},
{address_line1: "Warehouse Street 3"},
{city: "Warehouse City 3"},
]);
},
() => cur_frm.save(),
() => frappe.timeout(2),
() => frappe.click_button('New Contact'),
() => {
return frappe.tests.set_form_values(cur_frm, [
{first_name: "Contact 3"},
{email_id: "test@supplier.com"}
]);
},
() => cur_frm.save(),
() => frappe.timeout(1),
() => frappe.set_route('Form', 'Supplier', 'Test Supplier'),
() => frappe.timeout(0.3),
() => {
assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Name correct");
assert.ok(cur_frm.doc.supplier_group == 'Hardware', "Type correct");
assert.ok(cur_frm.doc.default_currency == 'INR', "Currency correct");
assert.ok(cur_frm.doc.accounts[0].account == 'Creditors - '+frappe.get_abbr('For Testing'), " Account Head abbr correct");
assert.ok($('.address-box:nth-child(3) p').text().includes('Shipping City 3'), "Address correct");
assert.ok($('.col-sm-6+ .col-sm-6 .h6').text().includes('Contact 3'), "Contact correct");
},
() => done()
]);
});

View File

@ -1,74 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: supplier quotation", function(assert) {
assert.expect(11);
let done = assert.async();
let date;
frappe.run_serially([
() => {
date = frappe.datetime.add_days(frappe.datetime.now_date(), 10);
return frappe.tests.make('Supplier Quotation', [
{supplier: 'Test Supplier'},
{transaction_date: date},
{currency: 'INR'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"rate": 200},
{"warehouse": 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
]
]},
{apply_discount_on: 'Grand Total'},
{additional_discount_percentage: 10},
{tc_name: 'Test Term 1'},
{terms: 'This is a term'}
]);
},
() => frappe.timeout(3),
() => {
// Get Supplier details
assert.ok(cur_frm.doc.supplier == 'Test Supplier', "Supplier correct");
assert.ok(cur_frm.doc.company == cur_frm.doc.company, "Company correct");
// Get Contact details
assert.ok(cur_frm.doc.contact_person == 'Contact 3-Test Supplier', "Conatct correct");
assert.ok(cur_frm.doc.contact_email == 'test@supplier.com', "Email correct");
// Get uom
assert.ok(cur_frm.doc.items[0].uom == 'Unit', "Multi uom correct");
assert.ok(cur_frm.doc.total == 1000, "Total correct");
// Calculate total after discount
assert.ok(cur_frm.doc.grand_total == 900, "Grand total correct");
// Get terms
assert.ok(cur_frm.doc.tc_name == 'Test Term 1', "Terms correct");
},
() => cur_frm.print_doc(),
() => frappe.timeout(2),
() => {
assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
assert.ok($("table > tbody > tr > td:nth-child(3) > div").text().includes("Test Product 4"), "Print Preview Works As Expected");
},
() => cur_frm.print_doc(),
() => frappe.timeout(1),
() => frappe.click_button('Get items from'),
() => frappe.timeout(0.3),
() => frappe.click_link('Material Request'),
() => frappe.timeout(0.3),
() => frappe.click_button('Get Items'),
() => frappe.timeout(1),
() => {
// Get item from Material Requests
assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Getting items from material requests work");
},
() => cur_frm.save(),
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,34 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: supplier quotation with item wise discount", function(assert){
assert.expect(2);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Supplier Quotation', [
{supplier: 'Test Supplier'},
{company: 'For Testing'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"uom": 'Unit'},
{"warehouse": 'All Warehouses - FT'},
{'discount_percentage': 10},
]
]}
]);
},
() => {
assert.ok(cur_frm.doc.total == 900, "Total correct");
assert.ok(cur_frm.doc.grand_total == 900, "Grand total correct");
},
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -1,37 +0,0 @@
QUnit.module('Buying');
QUnit.test("test: supplier quotation with taxes and charges", function(assert) {
assert.expect(3);
let done = assert.async();
let supplier_quotation_name;
frappe.run_serially([
() => {
return frappe.tests.make('Supplier Quotation', [
{supplier: 'Test Supplier'},
{items: [
[
{"item_code": 'Test Product 4'},
{"qty": 5},
{"rate": 100},
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
]
]},
{taxes_and_charges:'TEST In State GST - FT'},
]);
},
() => {supplier_quotation_name = cur_frm.doc.name;},
() => {
assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
assert.ok(cur_frm.doc.total_taxes_and_charges == 45, "Taxes and charges correct");
assert.ok(cur_frm.doc.grand_total == 545, "Grand total correct");
},
() => cur_frm.save(),
() => frappe.timeout(0.3),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.3),
() => done()
]);
});

View File

@ -184,6 +184,8 @@ class AccountsController(TransactionBase):
frappe.throw(_("Row #{0}: Service Start Date cannot be greater than Service End Date").format(d.idx))
elif getdate(self.posting_date) > getdate(d.service_end_date):
frappe.throw(_("Row #{0}: Service End Date cannot be before Invoice Posting Date").format(d.idx))
elif getdate(self.posting_date) > getdate(d.service_start_date):
frappe.throw(_("Row #{0}: Service Start Date cannot be before Invoice Posting Date").format(d.idx))
def validate_invoice_documents_schedule(self):
self.validate_payment_schedule_dates()

View File

@ -8,7 +8,6 @@ from frappe.contacts.address_and_contact import load_address_and_contact
from frappe.email.inbox import link_communication_to_document
from frappe.model.mapper import get_mapped_doc
from frappe.utils import (
cint,
comma_and,
cstr,
get_link_to_form,
@ -39,11 +38,7 @@ class Lead(SellingController):
self.check_email_id_is_unique()
self.validate_email_id()
self.validate_contact_date()
self._prev = frappe._dict({
"contact_date": frappe.db.get_value("Lead", self.name, "contact_date") if (not cint(self.is_new())) else None,
"ends_on": frappe.db.get_value("Lead", self.name, "ends_on") if (not cint(self.is_new())) else None,
"contact_by": frappe.db.get_value("Lead", self.name, "contact_by") if (not cint(self.is_new())) else None,
})
self.set_prev()
def set_full_name(self):
if self.first_name:
@ -75,6 +70,16 @@ class Lead(SellingController):
self.add_calendar_event()
self.update_prospects()
def set_prev(self):
if self.is_new():
self._prev = frappe._dict({
"contact_date": None,
"ends_on": None,
"contact_by": None
})
else:
self._prev = frappe.db.get_value("Lead", self.name, ["contact_date", "ends_on", "contact_by"], as_dict=1)
def before_insert(self):
self.contact_doc = self.create_contact()

View File

@ -23,6 +23,17 @@ class TestLead(unittest.TestCase):
customer.customer_group = "_Test Customer Group"
customer.insert()
#check whether lead contact is carried forward to the customer.
contact = frappe.db.get_value('Dynamic Link', {
"parenttype": "Contact",
"link_doctype": "Lead",
"link_name": customer.lead_name,
}, "parent")
if contact:
contact_doc = frappe.get_doc("Contact", contact)
self.assertEqual(contact_doc.has_link(customer.doctype, customer.name), True)
def test_make_customer_from_organization(self):
from erpnext.crm.doctype.lead.lead import make_customer

View File

@ -1,43 +0,0 @@
QUnit.module("sales");
QUnit.test("test: lead", function (assert) {
assert.expect(4);
let done = assert.async();
let lead_name = frappe.utils.get_random(10);
frappe.run_serially([
// test lead creation
() => frappe.set_route("List", "Lead"),
() => frappe.new_doc("Lead"),
() => frappe.timeout(1),
() => cur_frm.set_value("lead_name", lead_name),
() => cur_frm.save(),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.lead_name.includes(lead_name),
'name correctly set');
frappe.lead_name = cur_frm.doc.name;
},
// create address and contact
() => frappe.click_link('Address & Contact'),
() => frappe.click_button('New Address'),
() => frappe.timeout(1),
() => frappe.set_control('address_line1', 'Gateway'),
() => frappe.set_control('city', 'Mumbai'),
() => cur_frm.save(),
() => frappe.timeout(3),
() => assert.equal(frappe.get_route()[1], 'Lead',
'back to lead form'),
() => frappe.click_link('Address & Contact'),
() => assert.ok($('.address-box').text().includes('Mumbai'),
'city is seen in address box'),
// make opportunity
() => frappe.click_button('Make'),
() => frappe.click_link('Opportunity'),
() => frappe.timeout(2),
() => assert.equal(cur_frm.doc.lead, frappe.lead_name,
'lead name correctly mapped'),
() => done()
]);
});

View File

@ -1,55 +0,0 @@
QUnit.module("sales");
QUnit.test("test: lead", function (assert) {
assert.expect(5);
let done = assert.async();
let lead_name = frappe.utils.get_random(10);
frappe.run_serially([
// test lead creation
() => frappe.set_route("List", "Lead"),
() => frappe.new_doc("Lead"),
() => frappe.timeout(1),
() => cur_frm.set_value("company_name", lead_name),
() => cur_frm.save(),
() => frappe.timeout(1),
() => {
assert.ok(cur_frm.doc.lead_name.includes(lead_name),
'name correctly set');
frappe.lead_name = cur_frm.doc.name;
},
// create address and contact
() => frappe.click_link('Address & Contact'),
() => frappe.click_button('New Address'),
() => frappe.timeout(1),
() => frappe.set_control('address_line1', 'Gateway'),
() => frappe.set_control('city', 'Mumbai'),
() => cur_frm.save(),
() => frappe.timeout(3),
() => assert.equal(frappe.get_route()[1], 'Lead',
'back to lead form'),
() => frappe.click_link('Address & Contact'),
() => assert.ok($('.address-box').text().includes('Mumbai'),
'city is seen in address box'),
() => frappe.click_button('New Contact'),
() => frappe.timeout(1),
() => frappe.set_control('first_name', 'John'),
() => frappe.set_control('last_name', 'Doe'),
() => cur_frm.save(),
() => frappe.timeout(3),
() => frappe.set_route('Form', 'Lead', cur_frm.doc.links[0].link_name),
() => frappe.timeout(1),
() => frappe.click_link('Address & Contact'),
() => assert.ok($('.address-box').text().includes('John'),
'contact is seen in contact box'),
// make customer
() => frappe.click_button('Make'),
() => frappe.click_link('Customer'),
() => frappe.timeout(2),
() => assert.equal(cur_frm.doc.lead_name, frappe.lead_name,
'lead name correctly mapped'),
() => done()
]);
});

View File

@ -1,56 +0,0 @@
QUnit.test("test: opportunity", function (assert) {
assert.expect(8);
let done = assert.async();
frappe.run_serially([
() => frappe.set_route('List', 'Opportunity'),
() => frappe.timeout(1),
() => frappe.click_button('New'),
() => frappe.timeout(1),
() => cur_frm.set_value('opportunity_from', 'Customer'),
() => cur_frm.set_value('customer', 'Test Customer 1'),
// check items
() => cur_frm.set_value('with_items', 1),
() => frappe.tests.set_grid_values(cur_frm, 'items', [
[
{item_code:'Test Product 1'},
{qty: 4}
]
]),
() => cur_frm.save(),
() => frappe.timeout(1),
() => {
assert.notOk(cur_frm.is_new(), 'saved');
frappe.opportunity_name = cur_frm.doc.name;
},
// close and re-open
() => frappe.click_button('Close'),
() => frappe.timeout(1),
() => assert.equal(cur_frm.doc.status, 'Closed',
'closed'),
() => frappe.click_button('Reopen'),
() => assert.equal(cur_frm.doc.status, 'Open',
'reopened'),
() => frappe.timeout(1),
// make quotation
() => frappe.click_button('Make'),
() => frappe.click_link('Quotation', 1),
() => frappe.timeout(2),
() => {
assert.equal(frappe.get_route()[1], 'Quotation',
'made quotation');
assert.equal(cur_frm.doc.customer, 'Test Customer 1',
'customer set in quotation');
assert.equal(cur_frm.doc.items[0].item_code, 'Test Product 1',
'item set in quotation');
assert.equal(cur_frm.doc.items[0].qty, 4,
'qty set in quotation');
assert.equal(cur_frm.doc.items[0].prevdoc_docname, frappe.opportunity_name,
'opportunity set in quotation');
},
() => done()
]);
});

View File

@ -1,24 +0,0 @@
// Testing Setup Module in Education
QUnit.module('education');
QUnit.test('Test: Academic Term', function(assert){
assert.expect(4);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Academic Term', [
{academic_year: '2016-17'},
{term_name: "Semester 1"},
{term_start_date: '2016-07-20'},
{term_end_date:'2017-06-20'},
]);
},
() => {
assert.ok(cur_frm.doc.academic_year=='2016-17');
assert.ok(cur_frm.doc.term_name=='Semester 1');
assert.ok(cur_frm.doc.term_start_date=='2016-07-20');
assert.ok(cur_frm.doc.term_end_date=='2017-06-20');
},
() => done()
]);
});

View File

@ -1,16 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Assessment Criteria', function(assert){
assert.expect(0);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Assessment Criteria', [
{assessment_criteria: 'Pass'},
{assessment_criteria_group: 'Reservation'}
]);
},
() => done()
]);
});

View File

@ -1,15 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Assessment Criteria Group', function(assert){
assert.expect(0);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Assessment Criteria Group', [
{assessment_criteria_group: 'Reservation'}
]);
},
() => done()
]);
});

View File

@ -1,65 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Assessment Group', function(assert){
assert.expect(4);
let done = assert.async();
frappe.run_serially([
() => frappe.set_route('Tree', 'Assessment Group'),
// Checking adding child without selecting any Node
() => frappe.tests.click_button('New'),
() => frappe.timeout(0.2),
() => {assert.equal($(`.msgprint`).text(), "Select a group node first.", "Error message success");},
() => frappe.tests.click_button('Close'),
() => frappe.timeout(0.2),
// Creating child nodes
() => frappe.tests.click_link('All Assessment Groups'),
() => frappe.map_group.make('Assessment-group-1'),
() => frappe.map_group.make('Assessment-group-4', "All Assessment Groups", 1),
() => frappe.tests.click_link('Assessment-group-4'),
() => frappe.map_group.make('Assessment-group-5', "Assessment-group-3", 0),
// Checking Edit button
() => frappe.timeout(0.5),
() => frappe.tests.click_link('Assessment-group-1'),
() => frappe.tests.click_button('Edit'),
() => frappe.timeout(0.5),
() => {assert.deepEqual(frappe.get_route(), ["Form", "Assessment Group", "Assessment-group-1"], "Edit route checks");},
// Deleting child Node
() => frappe.set_route('Tree', 'Assessment Group'),
() => frappe.timeout(0.5),
() => frappe.tests.click_link('Assessment-group-1'),
() => frappe.tests.click_button('Delete'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Yes'),
// Checking Collapse and Expand button
() => frappe.timeout(2),
() => frappe.tests.click_link('Assessment-group-4'),
() => frappe.click_button('Collapse'),
() => frappe.tests.click_link('All Assessment Groups'),
() => frappe.click_button('Collapse'),
() => {assert.ok($('.opened').size() == 0, 'Collapsed');},
() => frappe.click_button('Expand'),
() => {assert.ok($('.opened').size() > 0, 'Expanded');},
() => done()
]);
});
frappe.map_group = {
make:function(assessment_group_name, parent_assessment_group = 'All Assessment Groups', is_group = 0){
return frappe.run_serially([
() => frappe.click_button('Add Child'),
() => frappe.timeout(0.2),
() => cur_dialog.set_value('is_group', is_group),
() => cur_dialog.set_value('assessment_group_name', assessment_group_name),
() => cur_dialog.set_value('parent_assessment_group', parent_assessment_group),
() => frappe.click_button('Create New'),
]);
}
};

View File

@ -1,54 +0,0 @@
// Testing Assessment Module in education
QUnit.module('education');
QUnit.test('Test: Assessment Plan', function(assert){
assert.expect(6);
let done = assert.async();
let room_name, instructor_name, assessment_name;
frappe.run_serially([
() => frappe.db.get_value('Room', {'room_name': 'Room 1'}, 'name'),
(room) => {room_name = room.message.name;}, // Fetching Room name
() => frappe.db.get_value('Instructor', {'instructor_name': 'Instructor 1'}, 'name'),
(instructor) => {instructor_name = instructor.message.name;}, // Fetching Instructor name
() => {
return frappe.tests.make('Assessment Plan', [
{assessment_name: "Test-Mid-Term"},
{assessment_group: 'Assessment-group-5'},
{maximum_assessment_score: 100},
{student_group: 'test-course-wise-group-2'},
{course: 'Test_Sub'},
{grading_scale: 'GTU'},
{schedule_date: frappe.datetime.nowdate()},
{room: room_name},
{examiner: instructor_name},
{supervisor: instructor_name},
{from_time: "12:30:00"},
{to_time: "2:30:00"}
]);
},
() => {
assessment_name = cur_frm.doc.name; // Storing the name of current Assessment Plan
assert.equal(cur_frm.doc.assessment_criteria[0].assessment_criteria, 'Pass', 'Assessment Criteria auto-filled correctly');
assert.equal(cur_frm.doc.assessment_criteria[0].maximum_score, 100, 'Maximum score correctly set');
}, // Checking if the table was auto-filled upon selecting appropriate fields
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5),
() => {assert.equal(cur_frm.doc.docstatus, 1, "Assessment Plan submitted successfully");},
() => frappe.click_button('Assessment Result'), // Checking out Assessment Result button option
() => frappe.timeout(0.5),
() => {
assert.deepEqual(frappe.get_route(), ["Form", "Assessment Result Tool"], 'Assessment Result properly linked');
assert.equal(cur_frm.doc.assessment_plan, assessment_name, 'Assessment correctly set');
assert.equal(cur_frm.doc.student_group, 'test-course-wise-group-2', 'Course for Assessment correctly set');
},
() => done()
]);
});

View File

@ -1,73 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Assessment Result', function(assert){
assert.expect(25);
let done = assert.async();
let student_list = [];
let assessment_name;
let tasks = []
frappe.run_serially([
// Saving Assessment Plan name
() => frappe.db.get_value('Assessment Plan', {'assessment_name': 'Test-Mid-Term'}, 'name'),
(assessment_plan) => {assessment_name = assessment_plan.message.name;},
// Fetching list of Student for which Result is supposed to be set
() => frappe.set_route('Form', 'Assessment Plan', assessment_name),
() => frappe.timeout(1),
() => frappe.tests.click_button('Assessment Result'),
() => frappe.timeout(1),
() => cur_frm.refresh(),
() => frappe.timeout(1),
() => {
$("tbody tr").each( function(i, input){
student_list.push($(input).data().student);
});
},
// Looping through each student in the list and setting up their score
() => {
student_list.forEach(index => {
tasks.push(
() => frappe.set_route('List', 'Assessment Result', 'List'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('New'),
() => frappe.timeout(0.5),
() => cur_frm.set_value('student', index),
() => cur_frm.set_value('assessment_plan', assessment_name),
() => frappe.timeout(0.2),
() => cur_frm.doc.details[0].score = (39 + (15 * student_list.indexOf(index))),
() => cur_frm.save(),
() => frappe.timeout(0.5),
() => frappe.db.get_value('Assessment Plan', {'name': 'ASP00001'}, ['grading_scale', 'maximum_assessment_score']),
(assessment_plan) => {
assert.equal(cur_frm.doc.grading_scale, assessment_plan.message.grading_scale, 'Grading scale correctly fetched');
assert.equal(cur_frm.doc.maximum_score, assessment_plan.message.maximum_assessment_score, 'Maximum score correctly fetched');
frappe.call({
method: "erpnext.education.api.get_grade",
args: {
"grading_scale": assessment_plan.message.grading_scale,
"percentage": cur_frm.doc.total_score
},
callback: function(r){
assert.equal(cur_frm.doc.grade, r.message, "Grade correctly calculated");
}
});
},
() => frappe.tests.click_button('Submit'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5),
() => {assert.equal();},
() => {assert.equal(cur_frm.doc.docstatus, 1, "Submitted successfully");},
);
});
return frappe.run_serially(tasks);
},
() => done()
]);
});

View File

@ -1,29 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Assessment Result Tool', function(assert){
assert.expect(1);
let done = assert.async();
let i, count = 0, assessment_name;
frappe.run_serially([
// Saving Assessment Plan name
() => frappe.db.get_value('Assessment Plan', {'assessment_name': 'Test-Mid-Term'}, 'name'),
(assessment_plan) => {assessment_name = assessment_plan.message.name;},
() => frappe.set_route('Form', 'Assessment Plan', assessment_name),
() => frappe.timeout(1),
() => frappe.tests.click_button('Assessment Result'),
() => frappe.timeout(1),
() => cur_frm.refresh(),
() => frappe.timeout(1),
() => {
for(i = 2; i < $('tbody tr').size() * 4; i = (i + 4)){
if(($(`tbody td:eq("${i}")`) != "") && ($(`tbody td:eq("${i+1}")`) != ""))
count++;
}
assert.equal($('tbody tr').size(), count, 'All grades correctly displayed');
},
() => done()
]);
});

View File

@ -1,36 +0,0 @@
// Testing Setup Module in education
QUnit.module('education');
QUnit.test('test course', function(assert) {
assert.expect(8);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Course', [
{course_name: 'Test_Subject'},
{course_code: 'Test_Sub'},
{department: 'Test Department'},
{course_abbreviation: 'Test_Sub'},
{course_intro: 'Test Subject Intro'},
{default_grading_scale: 'GTU'},
{assessment_criteria: [
[
{assessment_criteria: 'Pass'},
{weightage: 100}
]
]}
]);
},
() => {
assert.ok(cur_frm.doc.course_name == 'Test_Subject', 'Course name correctly set');
assert.ok(cur_frm.doc.course_code == 'Test_Sub', 'Course code correctly set');
assert.ok(cur_frm.doc.department == 'Test Department', 'Department selected correctly');
assert.ok(cur_frm.doc.course_abbreviation == 'Test_Sub');
assert.ok(cur_frm.doc.course_intro == 'Test Subject Intro');
assert.ok(cur_frm.doc.default_grading_scale == 'GTU', 'Grading scale selected correctly');
assert.ok(cur_frm.doc.assessment_criteria[0].assessment_criteria == 'Pass', 'Assessment criteria selected correctly');
assert.ok(cur_frm.doc.assessment_criteria[0].weightage == '100');
},
() => done()
]);
});

View File

@ -1,31 +0,0 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
// Testing Setup Module in Education
QUnit.module('education');
QUnit.test("test: Education Settings", function (assert) {
let done = assert.async();
assert.expect(3);
frappe.run_serially([
() => frappe.set_route("List", "Education Settings"),
() => frappe.timeout(0.4),
() => {
return frappe.tests.set_form_values(cur_frm, [
{current_academic_year: '2016-17'},
{current_academic_term: '2016-17 (Semester 1)'},
{attendance_freeze_date: '2016-07-20'}
]);
},
() => {
cur_frm.save();
assert.ok(cur_frm.doc.current_academic_year=="2016-17");
assert.ok(cur_frm.doc.current_academic_term=="2016-17 (Semester 1)");
assert.ok(cur_frm.doc.attendance_freeze_date=="2016-07-20");
},
() => done()
]);
});

View File

@ -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: Fees", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially('Fees', [
// insert a new Fees
() => {
return frappe.tests.make('Fees', [
{student: 'STUD00001'},
{due_date: frappe.datetime.get_today()},
{fee_structure: 'FS00001'}
]);
},
() => {
assert.equal(cur_frm.doc.grand_total===cur_frm.doc.outstanding_amount);
},
() => frappe.timeout(0.3),
() => cur_frm.save(),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => done()
]);
});

View File

@ -1,102 +0,0 @@
// Education Assessment module
QUnit.module('education');
QUnit.test('Test: Grading Scale', function(assert){
assert.expect(3);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Grading Scale', [
{grading_scale_name: 'GTU'},
{description: 'The score will be set according to 100 based system.'},
{intervals: [
[
{grade_code: 'AA'},
{threshold: '95'},
{grade_description: 'First Class + Distinction'}
],
[
{grade_code: 'AB'},
{threshold: '90'},
{grade_description: 'First Class'}
],
[
{grade_code: 'BB'},
{threshold: '80'},
{grade_description: 'Distinction'}
],
[
{grade_code: 'BC'},
{threshold: '70'},
{grade_description: 'Second Class'}
],
[
{grade_code: 'CC'},
{threshold: '60'},
{grade_description: 'Third Class'}
],
[
{grade_code: 'CD'},
{threshold: '50'},
{grade_description: 'Average'}
],
[
{grade_code: 'DD'},
{threshold: '40'},
{grade_description: 'Pass'}
],
[
{grade_code: 'FF'},
{threshold: '0'},
{grade_description: 'Fail'}
],
]}
]);
},
() => {
return frappe.tests.make('Grading Scale', [
{grading_scale_name: 'GTU-2'},
{description: 'The score will be set according to 100 based system.'},
{intervals: [
[
{grade_code: 'AA'},
{threshold: '90'},
{grade_description: 'Distinction'}
],
[
{grade_code: 'FF'},
{threshold: '0'},
{grade_description: 'Fail'}
]
]}
]);
},
() => {
let grading_scale = ['GTU', 'GTU-2'];
let tasks = [];
grading_scale.forEach(index => {
tasks.push(
() => frappe.set_route('Form', 'Grading Scale', index),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Submit'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Yes'),
() => {assert.equal(cur_frm.doc.docstatus, 1, 'Submitted successfully');}
);
});
return frappe.run_serially(tasks);
},
() => frappe.timeout(1),
() => frappe.set_route('Form', 'Grading Scale','GTU-2'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Cancel'),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5),
() => {assert.equal(cur_frm.doc.docstatus, 2, 'Cancelled successfully');},
() => done()
]);
});

View File

@ -1,34 +0,0 @@
// Testing Student Module in education
QUnit.module('education');
QUnit.test('Test: Guardian', function(assert){
assert.expect(9);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Guardian', [
{guardian_name: 'Test Guardian'},
{email_address: 'guardian@testmail.com'},
{mobile_number: 9898980000},
{alternate_number: 8989890000},
{date_of_birth: '1982-07-22'},
{education: 'Testing'},
{occupation: 'Testing'},
{designation: 'Testing'},
{work_address: 'Testing address'}
]);
},
() => {
assert.ok(cur_frm.doc.guardian_name == 'Test Guardian');
assert.ok(cur_frm.doc.email_address == 'guardian@testmail.com');
assert.ok(cur_frm.doc.mobile_number == 9898980000);
assert.ok(cur_frm.doc.alternate_number == 8989890000);
assert.ok(cur_frm.doc.date_of_birth == '1982-07-22');
assert.ok(cur_frm.doc.education == 'Testing');
assert.ok(cur_frm.doc.occupation == 'Testing');
assert.ok(cur_frm.doc.designation == 'Testing');
assert.ok(cur_frm.doc.work_address == 'Testing address');
},
() => done()
]);
});

View File

@ -1,20 +0,0 @@
// Testing Setup Module in education
QUnit.module('education');
QUnit.test('Test: Instructor', function(assert){
assert.expect(2);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make("Instructor", [
{instructor_name: 'Instructor 1'},
{department: 'Test Department'}
]);
},
() => {
assert.ok(cur_frm.doc.instructor_name == 'Instructor 1');
assert.ok(cur_frm.doc.department = 'Test Department');
},
() => done()
]);
});

View File

@ -1,34 +0,0 @@
// Testing Setup Module in education
QUnit.module('education');
QUnit.test('Test: Program', function(assert){
assert.expect(6);
let done = assert.async();
let fee_structure_code;
frappe.run_serially([
() => {
return frappe.tests.make('Program', [
{program_name: 'Standard Test'},
{program_code: 'Standard Test'},
{department: 'Test Department'},
{program_abbreviation: 'Standard Test'},
{courses: [
[
{course: 'Test_Sub'},
{required: true}
]
]}
]);
},
() => {
assert.ok(cur_frm.doc.program_name == 'Standard Test');
assert.ok(cur_frm.doc.program_code == 'Standard Test');
assert.ok(cur_frm.doc.department == 'Test Department');
assert.ok(cur_frm.doc.program_abbreviation == 'Standard Test');
assert.ok(cur_frm.doc.courses[0].course == 'Test_Sub');
assert.ok(cur_frm.doc.courses[0].required == true);
},
() => done()
]);
});

View File

@ -1,22 +0,0 @@
// Testing Setup Module in Education
QUnit.module('education');
QUnit.test('Test: Room', function(assert){
assert.expect(3);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Room', [
{room_name: 'Room 1'},
{room_number: '1'},
{seating_capacity: '60'},
]);
},
() => {
assert.ok(cur_frm.doc.room_name == 'Room 1');
assert.ok(cur_frm.doc.room_number = '1');
assert.ok(cur_frm.doc.seating_capacity = '60');
},
() => done()
]);
});

View File

@ -1,40 +0,0 @@
// Testing Admission Module in Education
QUnit.module('education');
QUnit.test('Test: Student Admission', function(assert) {
assert.expect(10);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Student Admission', [
{academic_year: '2016-17'},
{admission_start_date: '2016-04-20'},
{admission_end_date: '2016-05-31'},
{title: '2016-17 Admissions'},
{enable_admission_application: 1},
{introduction: 'Test intro'},
{program_details: [
[
{'program': 'Standard Test'},
{'application_fee': 1000},
{'applicant_naming_series': 'AP'},
]
]}
]);
},
() => cur_frm.save(),
() => {
assert.ok(cur_frm.doc.academic_year == '2016-17');
assert.ok(cur_frm.doc.admission_start_date == '2016-04-20');
assert.ok(cur_frm.doc.admission_end_date == '2016-05-31');
assert.ok(cur_frm.doc.title == '2016-17 Admissions');
assert.ok(cur_frm.doc.enable_admission_application == 1);
assert.ok(cur_frm.doc.introduction == 'Test intro');
assert.ok(cur_frm.doc.program_details[0].program == 'Standard Test', 'Program correctly selected');
assert.ok(cur_frm.doc.program_details[0].application_fee == 1000);
assert.ok(cur_frm.doc.program_details[0].applicant_naming_series == 'AP');
assert.ok(cur_frm.doc.route == 'admissions/2016-17-Admissions', "Route successfully set");
},
() => done()
]);
});

View File

@ -1,95 +0,0 @@
// Testing Admission module in Education
QUnit.module('education');
QUnit.test('Test: Student Applicant', function(assert){
assert.expect(24);
let done = assert.async();
let guradian_auto_code;
let guardian_name;
frappe.run_serially([
() => frappe.set_route('List', 'Guardian'),
() => frappe.timeout(0.5),
() => {$(`a:contains("Test Guardian"):visible`)[0].click();},
() => frappe.timeout(1),
() => {
guardian_name = cur_frm.doc.guardian_name;
guradian_auto_code = frappe.get_route()[2];
},
// Testing data entry for Student Applicant
() => {
return frappe.tests.make('Student Applicant',[
{first_name: 'Fname'},
{middle_name: 'Mname'},
{last_name: 'Lname'},
{program: 'Standard Test'},
{student_admission: '2016-17 Admissions'},
{academic_year: '2016-17'},
{date_of_birth: '1995-07-20'},
{student_email_id: 'test@testmail.com'},
{gender: 'Male'},
{student_mobile_number: '9898980000'},
{blood_group: 'O+'},
{address_line_1: 'Test appt, Test Society,'},
{address_line_2: 'Test district, Test city.'},
{city: 'Test'},
{state: 'Test'},
{pincode: '400086'}
]);
},
// Entry in Guardian child table
() => $('a:contains("Guardian Details"):visible').click(),
() => $('.btn:contains("Add Row"):visible').click(),
() => {
cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian = guradian_auto_code;
cur_frm.get_field("guardians").grid.grid_rows[0].doc.relation = "Father";
cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian_name = guardian_name;
$('a:contains("Guardian Details"):visible').click();
},
// Entry in Sibling child table
() => $('a:contains("Sibling Details"):visible').click(),
() => $('.btn:contains("Add Row"):visible').click(),
() => {
cur_frm.get_field("siblings").grid.grid_rows[0].doc.full_name = "Test Name";
cur_frm.get_field("siblings").grid.grid_rows[0].doc.gender = "Male";
cur_frm.get_field("siblings").grid.grid_rows[0].doc.institution = "Test Institution";
cur_frm.get_field("siblings").grid.grid_rows[0].doc.program = "Test Program";
cur_frm.get_field("siblings").grid.grid_rows[0].doc.date_of_birth = "1995-07-20";
$('span.hidden-xs.octicon.octicon-triangle-up').click();
cur_frm.save();
},
() => {
assert.ok(cur_frm.doc.first_name == 'Fname');
assert.ok(cur_frm.doc.middle_name == 'Mname');
assert.ok(cur_frm.doc.last_name == 'Lname');
assert.ok(cur_frm.doc.program == 'Standard Test', 'Program selected correctly');
assert.ok(cur_frm.doc.student_admission == '2016-17 Admissions', 'Student Admission entry correctly selected');
assert.ok(cur_frm.doc.academic_year == '2016-17');
assert.ok(cur_frm.doc.date_of_birth == '1995-07-20');
assert.ok(cur_frm.doc.student_email_id == 'test@testmail.com');
assert.ok(cur_frm.doc.gender == 'Male');
assert.ok(cur_frm.doc.student_mobile_number == '9898980000');
assert.ok(cur_frm.doc.blood_group == 'O+');
assert.ok(cur_frm.doc.address_line_1 == 'Test appt, Test Society,');
assert.ok(cur_frm.doc.address_line_2 == 'Test district, Test city.');
assert.ok(cur_frm.doc.city == 'Test');
assert.ok(cur_frm.doc.state == 'Test');
assert.ok(cur_frm.doc.pincode == '400086');
},
() => frappe.timeout(1),
() => $('a:contains("Guardian Details"):visible').click(),
() => {
assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian == guradian_auto_code, 'Guardian correctly selected from dropdown');
assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.relation == 'Father');
assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian_name == guardian_name, 'Guardian name was correctly retrieved');
},
() => $('a:contains("Sibling Details"):visible').click(),
() => {
assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.full_name == 'Test Name');
assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.gender == 'Male');
assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.institution == 'Test Institution');
assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.program == 'Test Program');
assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.date_of_birth == '1995-07-20');
},
() => done()
]);
});

View File

@ -1,87 +0,0 @@
QUnit.module('Admission');
QUnit.test('Make Students', function(assert){
assert.expect(0);
let done = assert.async();
let tasks = [];
let loop = [1,2,3,4];
let fname;
frappe.run_serially([
// Making School House to be used in this test and later
() => frappe.set_route('Form', 'School House/New School House'),
() => frappe.timeout(0.5),
() => cur_frm.doc.house_name = 'Test_house',
() => cur_frm.save(),
// Making Student Applicant entries
() => {
loop.forEach(index => {
tasks.push(() => {
fname = "Fname" + index;
return frappe.tests.make('Student Applicant', [
{first_name: fname},
{middle_name: "Mname"},
{last_name: "Lname"},
{program: "Standard Test"},
{student_admission: "2016-17 Admissions"},
{date_of_birth: '1995-08-20'},
{student_email_id: ('test' + (index+3) + '@testmail.com')},
{gender: 'Male'},
{student_mobile_number: (9898980000 + index)},
{blood_group: 'O+'},
{address_line_1: 'Test appt, Test Society,'},
{address_line_2: 'Test district, Test city.'},
{city: 'Test'},
{state: 'Test'},
{pincode: '395007'}
]);
});
});
return frappe.run_serially(tasks);
},
// Using Program Enrollment Tool to enroll all dummy student at once
() => frappe.set_route('Form', 'Program Enrollment Tool'),
() => {
cur_frm.set_value("get_students_from", "Student Applicants");
cur_frm.set_value("academic_year", "2016-17");
cur_frm.set_value("program", "Standard Test");
},
() => frappe.tests.click_button("Get Students"),
() => frappe.timeout(1),
() => frappe.tests.click_button("Enroll Students"),
() => frappe.timeout(1.5),
() => frappe.tests.click_button("Close"),
// Submitting required data for each enrolled Student
() => {
tasks = [];
loop.forEach(index => {
tasks.push(
() => {fname = "Fname" + index + " Mname Lname";},
() => frappe.set_route('List', 'Program Enrollment/List'),
() => frappe.timeout(0.6),
() => frappe.tests.click_link(fname),
() => frappe.timeout(0.4),
() => {
cur_frm.set_value('program', 'Standard Test');
cur_frm.set_value('student_category', 'Reservation');
cur_frm.set_value('student_batch_name', 'A');
cur_frm.set_value('academic_year', '2016-17');
cur_frm.set_value('academic_term', '2016-17 (Semester 1)');
cur_frm.set_value('school_house', 'Test_house');
},
() => cur_frm.save(),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5)
);
});
return frappe.run_serially(tasks);
},
() => done()
]);
});

View File

@ -1,110 +0,0 @@
// Testing Admission module in Education
QUnit.module('education');
QUnit.test('test student applicant', function(assert){
assert.expect(11);
let done = assert.async();
let testing_status;
frappe.run_serially([
() => frappe.set_route('List', 'Student Applicant'),
() => frappe.timeout(0.5),
() => {$(`a:contains("Fname Mname Lname"):visible`)[0].click();},
// Checking different options
// 1. Moving forward with Submit
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5),
() => {
testing_status = $('span.indicator.orange').text();
assert.ok(testing_status.indexOf('Submit this document to confirm') == -1); // checking if submit has been successfull
},
// 2. Cancelling the Submit request
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Cancel'),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.5),
() => {
testing_status = $('h1.editable-title').text();
assert.ok(testing_status.indexOf('Cancelled') != -1); // checking if cancel request has been successfull
},
// 3. Checking Amend option
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Amend'),
() => cur_frm.doc.student_email_id = "test2@testmail.com", // updating email id since same id again is not allowed
() => cur_frm.save(),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'), // Submitting again after amend
() => {
testing_status = $('span.indicator.orange').text();
assert.ok(testing_status.indexOf('Submit this document to confirm') == -1); // checking if submit has been successfull after amend
},
// Checking different Application status option
() => {
testing_status = $('h1.editable-title').text();
assert.ok(testing_status.indexOf('Applied') != -1); // checking if Applied has been successfull
},
() => cur_frm.set_value('application_status', "Rejected"), // Rejected Status
() => frappe.tests.click_button('Update'),
() => {
testing_status = $('h1.editable-title').text();
assert.ok(testing_status.indexOf('Rejected') != -1); // checking if Rejected has been successfull
},
() => cur_frm.set_value('application_status', "Admitted"), // Admitted Status
() => frappe.tests.click_button('Update'),
() => {
testing_status = $('h1.editable-title').text();
assert.ok(testing_status.indexOf('Admitted') != -1); // checking if Admitted has been successfull
},
() => cur_frm.set_value('application_status', "Approved"), // Approved Status
() => frappe.tests.click_button('Update'),
() => {
testing_status = $('h1.editable-title').text();
assert.ok(testing_status.indexOf('Approved') != -1); // checking if Approved has been successfull
},
// Clicking on Enroll button should add the applicant's entry in Student doctype, and take you to Program Enrollment page
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Enroll'),
() => frappe.timeout(0.5),
() => {
assert.ok(frappe.get_route()[0] == 'Form'); // Checking if the current page is Program Enrollment page or not
assert.ok(frappe.get_route()[1] == 'Program Enrollment');
},
// Routing to Student List to check if the Applicant's entry has been made or not
() => frappe.timeout(0.5),
() => frappe.set_route('List', 'Student'),
() => frappe.timeout(0.5),
() => {$(`a:contains("Fname Mname Lname"):visible`)[0].click();},
() => frappe.timeout(0.5),
() => {assert.ok(($(`h1.editable-title`).text()).indexOf('Enabled') != -1, 'Student entry successfully created');}, // Checking if the Student entry has been enabled
// Enrolling the Student into a Program
() => {$('.form-documents .row:nth-child(1) .col-xs-6:nth-child(1) .octicon-plus').click();},
() => frappe.timeout(1),
() => cur_frm.set_value('program', 'Standard Test'),
() => frappe.timeout(1),
() => {
cur_frm.set_value('student_category', 'Reservation');
cur_frm.set_value('student_batch_name', 'A');
cur_frm.set_value('academic_year', '2016-17');
cur_frm.set_value('academic_term', '2016-17 (Semester 1)');
cur_frm.set_value('school_house', 'Test_house');
},
() => cur_frm.save(),
// Submitting Program Enrollment form for our Test Student
() => frappe.timeout(1),
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
() => {
assert.ok(cur_frm.doc.docstatus == 1, "Program enrollment successfully submitted");
},
() => done()
]);
});

View File

@ -1,31 +0,0 @@
// Testing Attendance Module in Education
QUnit.module('education');
QUnit.test('Test: Student Attendance', function(assert){
assert.expect(2);
let done = assert.async();
let student_code;
frappe.run_serially([
() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
(student) => {student_code = student.message.name;}, // fetching student code from db
() => {
return frappe.tests.make('Student Attendance', [
{student: student_code},
{date: frappe.datetime.nowdate()},
{student_group: "test-batch-wise-group-2"},
{status: "Absent"}
]);
},
() => frappe.timeout(0.5),
() => {assert.equal(cur_frm.doc.status, "Absent", "Attendance correctly saved");},
() => frappe.timeout(0.5),
() => cur_frm.set_value("status", "Present"),
() => {assert.equal(cur_frm.doc.status, "Present", "Attendance correctly saved");},
() => done()
]);
});

View File

@ -1,85 +0,0 @@
// Testing Attendance Module in Education
QUnit.module('education');
QUnit.test('Test: Student Attendace Tool', function(assert){
assert.expect(10);
let done = assert.async();
let i, count = 0;
frappe.run_serially([
() => frappe.timeout(0.2),
() => frappe.set_route('Form', 'Student Attendance Tool'),
() => frappe.timeout(0.5),
() => {
if(cur_frm.doc.based_on == 'Student Group' || cur_frm.doc.based_on == 'Course Schedule'){
cur_frm.doc.based_on = 'Student Group';
assert.equal(1, 1, 'Attendance basis correctly set');
cur_frm.set_value("group_based_on", 'Batch');
cur_frm.set_value("student_group", "test-batch-wise-group");
cur_frm.set_value("date", frappe.datetime.nowdate());
}
},
() => frappe.timeout(0.5),
() => {
assert.equal($('input.students-check').size(), 5, "Student list based on batch correctly fetched");
assert.equal(frappe.datetime.nowdate(), cur_frm.doc.date, 'Current date correctly set');
cur_frm.set_value("student_group", "test-batch-wise-group-2");
assert.equal($('input.students-check').size(), 5, "Student list based on batch 2 correctly fetched");
cur_frm.set_value("group_based_on", 'Course');
cur_frm.set_value("student_group", "test-course-wise-group");
assert.equal($('input.students-check').size(), 5, "Student list based on course correctly fetched");
cur_frm.set_value("student_group", "test-course-wise-group-2");
assert.equal($('input.students-check').size(), 5, "Student list based on course 2 correctly fetched");
},
() => frappe.timeout(1),
() => frappe.tests.click_button('Check all'), // Marking all Student as checked
() => {
for(i = 0; i < $('input.students-check').size(); i++){
if($('input.students-check')[i].checked == true)
count++;
}
if(count == $('input.students-check').size())
assert.equal($('input.students-check').size(), count, "All students marked checked");
},
() => frappe.timeout(1),
() => frappe.tests.click_button('Uncheck all'), // Marking all Student as unchecked
() => {
count = 0;
for(i = 0; i < $('input.students-check').size(); i++){
if(!($('input.students-check')[i].checked))
count++;
}
if(count == $('input.students-check').size())
assert.equal($('input.students-check').size(), count, "All students marked checked");
},
() => frappe.timeout(1),
() => frappe.tests.click_button('Check all'),
() => frappe.tests.click_button('Mark Attendance'),
() => frappe.timeout(1),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1),
() => {
assert.equal($('.msgprint').text(), "Attendance has been marked successfully.", "Attendance successfully marked");
frappe.tests.click_button('Close');
},
() => frappe.timeout(1),
() => frappe.set_route('List', 'Student Attendance/List'),
() => frappe.timeout(1),
() => {
assert.equal(cur_list.data.length, count, "Attendance list created");
},
() => done()
]);
});

View File

@ -1,19 +0,0 @@
// Testing Setup Module in Education
QUnit.module('education');
QUnit.test('Test: Student Batch Name', function(assert){
assert.expect(1);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Student Batch Name', [
{batch_name: 'A'}
]);
},
() => cur_frm.save(),
() => {
assert.ok(cur_frm.doc.batch_name=='A');
},
() => done()
]);
});

View File

@ -1,19 +0,0 @@
// Testing Setup Module in Education
QUnit.module('education');
QUnit.test('Test: Student Category', function(assert){
assert.expect(1);
let done = assert.async();
frappe.run_serially([
() => {
return frappe.tests.make('Student Category', [
{category: 'Reservation'}
]);
},
() => cur_frm.save(),
() => {
assert.ok(cur_frm.doc.name=='Reservation');
},
() => done()
]);
});

View File

@ -1,56 +0,0 @@
// Testing Student Module in Education
QUnit.module('education');
QUnit.test('Test: Student Group', function(assert){
assert.expect(2);
let done = assert.async();
let group_based_on = ["test-batch-wise-group", "test-course-wise-group"];
let tasks = [];
frappe.run_serially([
// Creating a Batch and Course based group
() => {
return frappe.tests.make('Student Group', [
{academic_year: '2016-17'},
{academic_term: '2016-17 (Semester 1)'},
{program: "Standard Test"},
{group_based_on: 'Batch'},
{student_group_name: group_based_on[0]},
{max_strength: 10},
{batch: 'A'}
]);
},
() => {
return frappe.tests.make('Student Group', [
{academic_year: '2016-17'},
{academic_term: '2016-17 (Semester 1)'},
{program: "Standard Test"},
{group_based_on: 'Course'},
{student_group_name: group_based_on[1]},
{max_strength: 10},
{batch: 'A'},
{course: 'Test_Sub'},
]);
},
// Populating the created group with Students
() => {
tasks = [];
group_based_on.forEach(index => {
tasks.push(
() => frappe.timeout(0.5),
() => frappe.set_route("Form", ('Student Group/' + index)),
() => frappe.timeout(0.5),
() => frappe.tests.click_button('Get Students'),
() => frappe.timeout(1),
() => {
assert.equal(cur_frm.doc.students.length, 5, 'Successfully fetched list of students');
},
);
});
return frappe.run_serially(tasks);
},
() => done()
]);
});

View File

@ -1,84 +0,0 @@
QUnit.module('education');
QUnit.test('Test: Student Group Creation Tool', function(assert){
assert.expect(5);
let done = assert.async();
let instructor_code;
frappe.run_serially([
// Saving Instructor code beforehand
() => frappe.db.get_value('Instructor', {'instructor_name': 'Instructor 1'}, 'name'),
(instructor) => {instructor_code = instructor.message.name;},
// Setting up the creation tool to generate and save Student Group
() => frappe.set_route('Form', 'Student Group Creation Tool'),
() => frappe.timeout(0.5),
() => {
cur_frm.set_value("academic_year", "2016-17");
cur_frm.set_value("academic_term", "2016-17 (Semester 1)");
cur_frm.set_value("program", "Standard Test");
frappe.tests.click_button('Get Courses');
},
() => frappe.timeout(1),
() => {
let no_of_courses = $('input.grid-row-check.pull-left').size() - 1;
assert.equal(cur_frm.doc.courses.length, no_of_courses, 'Successfully created groups using the tool');
},
() => {
let d, grid, grid_row;
for(d = 0; d < cur_frm.doc.courses.length; d++)
{
grid = cur_frm.get_field("courses").grid;
grid_row = grid.get_row(d).toggle_view(true);
if(grid_row.doc.student_group_name == 'Standard Test/A/2016-17 (Semester 1)'){
grid_row.doc.max_strength = 10;
grid_row.doc.student_group_name = "test-batch-wise-group-2";
$(`.octicon.octicon-triangle-up`).click();
continue;
}
else if(grid_row.doc.student_group_name == 'Test_Sub/Standard Test/2016-17 (Semester 1)'){
grid_row.doc.max_strength = 10;
grid_row.doc.student_group_name = "test-course-wise-group-2";
$(`.octicon.octicon-triangle-up`).click();
continue;
}
}
},
// Generating Student Group
() => frappe.timeout(0.5),
() => frappe.tests.click_button("Create Student Groups"),
() => frappe.timeout(0.5),
() => frappe.tests.click_button("Close"),
// Goin to the generated group to set up student and instructor list
() => {
let group_name = ['Student Group/test-batch-wise-group-2', 'Student Group/test-course-wise-group-2'];
let tasks = [];
group_name.forEach(index => {
tasks.push(
() => frappe.timeout(1),
() => frappe.set_route("Form", index),
() => frappe.timeout(0.5),
() => {
assert.equal(cur_frm.doc.students.length, 5, 'Successfully fetched list of students');
},
() => frappe.timeout(0.5),
() => {
d = cur_frm.add_child('instructors');
d.instructor = instructor_code;
cur_frm.save();
},
() => {
assert.equal(cur_frm.doc.instructors.length, 1, 'Instructor detail stored successfully');
},
);
});
return frappe.run_serially(tasks);
},
() => done()
]);
});

View File

@ -1,69 +0,0 @@
// Testing Attendance Module in Education
QUnit.module('education');
QUnit.test('Test: Student Leave Application', function(assert){
assert.expect(4);
let done = assert.async();
let student_code;
let leave_code;
frappe.run_serially([
() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
(student) => {student_code = student.message.name;}, // fetching student code from db
() => {
return frappe.tests.make('Student Leave Application', [
{student: student_code},
{from_date: '2017-08-02'},
{to_date: '2017-08-04'},
{mark_as_present: 0},
{reason: "Sick Leave."}
]);
},
() => frappe.tests.click_button('Submit'), // Submitting the leave application
() => frappe.timeout(0.7),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.7),
() => {
assert.equal(cur_frm.doc.docstatus, 1, "Submitted leave application");
leave_code = frappe.get_route()[2];
},
() => frappe.tests.click_button('Cancel'), // Cancelling the leave application
() => frappe.timeout(0.7),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(1),
() => {assert.equal(cur_frm.doc.docstatus, 2, "Cancelled leave application");},
() => frappe.tests.click_button('Amend'), // Amending the leave application
() => frappe.timeout(1),
() => {
cur_frm.doc.mark_as_present = 1;
cur_frm.save();
},
() => frappe.timeout(0.7),
() => frappe.tests.click_button('Submit'),
() => frappe.timeout(0.7),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.7),
() => {assert.equal(cur_frm.doc.amended_from, leave_code, "Amended successfully");},
() => frappe.timeout(0.5),
() => {
return frappe.tests.make('Student Leave Application', [
{student: student_code},
{from_date: '2017-08-07'},
{to_date: '2017-08-09'},
{mark_as_present: 0},
{reason: "Sick Leave."}
]);
},
() => frappe.tests.click_button('Submit'),
() => frappe.timeout(0.7),
() => frappe.tests.click_button('Yes'),
() => frappe.timeout(0.7),
() => {
assert.equal(cur_frm.doc.docstatus, 1, "Submitted leave application");
leave_code = frappe.get_route()[2];
},
() => done()
]);
});

View File

@ -1,35 +0,0 @@
// Testing Student Module in Education
QUnit.module('education');
QUnit.test('Test: Student Log', function(assert){
assert.expect(9);
let done = assert.async();
let student_code;
frappe.run_serially([
() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
(student) => {student_code = student.message.name;},
() => {
return frappe.tests.make("Student Log", [
{student: student_code},
{academic_year: '2016-17'},
{academic_term: '2016-17 (Semester 1)'},
{program: "Standard Test"},
{date: '2017-07-31'},
{student_batch: 'A'},
{log: 'This is Test log.'}
]);
},
() => {
assert.equal(cur_frm.doc.student, student_code, 'Student code was fetched properly');
assert.equal(cur_frm.doc.student_name, 'Fname Mname Lname', 'Student name was correctly auto-fetched');
assert.equal(cur_frm.doc.type, 'General', 'Default type selected');
assert.equal(cur_frm.doc.academic_year, '2016-17');
assert.equal(cur_frm.doc.academic_term, '2016-17 (Semester 1)');
assert.equal(cur_frm.doc.program, 'Standard Test', 'Program correctly selected');
assert.equal(cur_frm.doc.student_batch, 'A');
assert.equal(cur_frm.doc.date, '2017-07-31');
assert.equal(cur_frm.doc.log, 'This is Test log.');
},
() => done()
]);
});

View File

@ -1,78 +0,0 @@
{
"charts": [],
"content": "[{\"type\": \"header\", \"data\": {\"text\": \"Reports & Masters\", \"level\": 4, \"col\": 12}}, {\"type\": \"card\", \"data\": {\"card_name\": \"Integrations Settings\", \"col\": 4}}]",
"creation": "2020-07-31 10:38:54.021237",
"docstatus": 0,
"doctype": "Workspace",
"for_user": "",
"hide_custom": 0,
"icon": "setting",
"idx": 0,
"label": "ERPNext Integrations Settings",
"links": [
{
"hidden": 0,
"is_query_report": 0,
"label": "Integrations Settings",
"link_count": 0,
"onboard": 0,
"type": "Card Break"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Woocommerce Settings",
"link_count": 0,
"link_to": "Woocommerce Settings",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Amazon MWS Settings",
"link_count": 0,
"link_to": "Amazon MWS Settings",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Plaid Settings",
"link_count": 0,
"link_to": "Plaid Settings",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Exotel Settings",
"link_count": 0,
"link_to": "Exotel Settings",
"link_type": "DocType",
"onboard": 0,
"type": "Link"
}
],
"modified": "2021-11-23 04:30:33.106991",
"modified_by": "Administrator",
"module": "ERPNext Integrations",
"name": "ERPNext Integrations Settings",
"owner": "Administrator",
"parent_page": "",
"public": 1,
"restrict_to_domain": "",
"roles": [],
"sequence_id": 11,
"shortcuts": [],
"title": "ERPNext Integrations Settings"
}

View File

@ -374,7 +374,7 @@ scheduler_events = {
"erpnext.selling.doctype.quotation.quotation.set_expired_status",
"erpnext.buying.doctype.supplier_quotation.supplier_quotation.set_expired_status",
"erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts.send_auto_email",
"erpnext.non_profit.doctype.membership.membership.set_expired_status"
"erpnext.non_profit.doctype.membership.membership.set_expired_status",
"erpnext.hr.doctype.interview.interview.send_daily_feedback_reminder"
],
"daily_long": [

View File

@ -12,14 +12,15 @@ class AppointmentLetter(Document):
@frappe.whitelist()
def get_appointment_letter_details(template):
body = []
intro= frappe.get_list("Appointment Letter Template",
fields = ['introduction', 'closing_notes'],
filters={'name': template
})[0]
content = frappe.get_list("Appointment Letter content",
fields = ['title', 'description'],
filters={'parent': template
})
intro = frappe.get_list('Appointment Letter Template',
fields=['introduction', 'closing_notes'],
filters={'name': template}
)[0]
content = frappe.get_all('Appointment Letter content',
fields=['title', 'description'],
filters={'parent': template},
order_by='idx'
)
body.append(intro)
body.append({'description': content})
return body

View File

@ -1,57 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Expense Claim [HR]", function (assert) {
assert.expect(3);
let done = assert.async();
let employee_name;
frappe.run_serially([
// Creating Appraisal
() => frappe.set_route('List','Appraisal','List'),
() => frappe.timeout(0.3),
() => frappe.click_button('Make a new Appraisal'),
() => {
cur_frm.set_value('kra_template','Test Appraisal 1'),
cur_frm.set_value('start_date','2017-08-21'),
cur_frm.set_value('end_date','2017-09-21');
},
() => frappe.timeout(1),
() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 1','score',4),
() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 1','score_earned',2),
() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 2','score',4),
() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 2','score_earned',2),
() => frappe.timeout(1),
() => frappe.db.get_value('Employee', {'employee_name': 'Test Employee 1'}, 'name'),
(r) => {
employee_name = r.message.name;
},
() => frappe.timeout(1),
() => cur_frm.set_value('employee',employee_name),
() => cur_frm.set_value('employee_name','Test Employee 1'),
() => cur_frm.set_value('company','For Testing'),
() => frappe.click_button('Calculate Total Score'),
() => frappe.timeout(1),
() => cur_frm.save(),
() => frappe.timeout(1),
() => cur_frm.save(),
// Submitting the Appraisal
() => frappe.click_button('Submit'),
() => frappe.click_button('Yes'),
() => frappe.timeout(3),
// Checking if the appraisal is correctly set for the employee
() => {
assert.equal('Submitted',cur_frm.get_field('status').value,
'Appraisal is submitted');
assert.equal('Test Employee 1',cur_frm.get_field('employee_name').value,
'Appraisal is created for correct employee');
assert.equal(4,cur_frm.get_field('total_score').value,
'Total score is correctly calculated');
},
() => done()
]);
});

View File

@ -1,29 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Appraisal Template [HR]", function (assert) {
assert.expect(1);
let done = assert.async();
frappe.run_serially([
// Job Opening creation
() => {
frappe.tests.make('Appraisal Template', [
{ kra_title: 'Test Appraisal 1'},
{ description: 'This is just a test'},
{ goals: [
[
{ kra: 'Design'},
{ per_weightage: 50}
],
[
{ kra: 'Code creation'},
{ per_weightage: 50}
]
]},
]);
},
() => frappe.timeout(10),
() => {
assert.equal('Test Appraisal 1',cur_frm.doc.kra_title, 'Appraisal name correctly set');
},
() => done()
]);
});

View File

@ -1,39 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Attendance [HR]", function (assert) {
assert.expect(4);
let done = assert.async();
frappe.run_serially([
// test attendance creation for one employee
() => frappe.set_route("List", "Attendance", "List"),
() => frappe.timeout(0.5),
() => frappe.new_doc("Attendance"),
() => frappe.timeout(1),
() => assert.equal("Attendance", cur_frm.doctype,
"Form for new Attendance opened successfully."),
// set values in form
() => cur_frm.set_value("company", "For Testing"),
() => {
frappe.db.get_value('Employee', {'employee_name':'Test Employee 1'}, 'name', function(r) {
cur_frm.set_value("employee", r.name)
});
},
() => frappe.timeout(1),
() => cur_frm.save(),
() => frappe.timeout(1),
// check docstatus of attendance before submit [Draft]
() => assert.equal("0", cur_frm.doc.docstatus,
"attendance is currently drafted"),
// check docstatus of attendance after submit [Present]
() => cur_frm.savesubmit(),
() => frappe.timeout(0.5),
() => frappe.click_button('Yes'),
() => assert.equal("1", cur_frm.doc.docstatus,
"attendance is saved after submit"),
// check if auto filled date is present day
() => assert.equal(frappe.datetime.nowdate(), cur_frm.doc.attendance_date,
"attendance for Present day is marked"),
() => done()
]);
});

View File

@ -6,6 +6,15 @@ frappe.ui.form.on('Department', {
frm.set_query("parent_department", function(){
return {"filters": [["Department", "is_group", "=", 1]]};
});
frm.set_query("payroll_cost_center", function() {
return {
filters: {
"company": frm.doc.company,
"is_group": 0
}
};
});
},
refresh: function(frm) {
// read-only for root department

View File

@ -47,6 +47,15 @@ frappe.ui.form.on('Employee', {
}
};
});
frm.set_query("payroll_cost_center", function() {
return {
filters: {
"company": frm.doc.company,
"is_group": 0
}
};
});
},
onload: function (frm) {
frm.set_query("department", function() {

View File

@ -68,12 +68,18 @@ class Employee(NestedSet):
self.employee_name = ' '.join(filter(lambda x: x, [self.first_name, self.middle_name, self.last_name]))
def validate_user_details(self):
data = frappe.db.get_value('User',
self.user_id, ['enabled', 'user_image'], as_dict=1)
if data.get("user_image") and self.image == '':
self.image = data.get("user_image")
self.validate_for_enabled_user_id(data.get("enabled", 0))
self.validate_duplicate_user_id()
if self.user_id:
data = frappe.db.get_value('User',
self.user_id, ['enabled', 'user_image'], as_dict=1)
if not data:
self.user_id = None
return
if data.get("user_image") and self.image == '':
self.image = data.get("user_image")
self.validate_for_enabled_user_id(data.get("enabled", 0))
self.validate_duplicate_user_id()
def update_nsm_model(self):
frappe.utils.nestedset.update_nsm(self)

View File

@ -1,40 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Employee [HR]", function (assert) {
assert.expect(4);
let done = assert.async();
// let today_date = frappe.datetime.nowdate();
let employee_creation = (name, joining_date, birth_date) => {
frappe.run_serially([
// test employee creation
() => {
frappe.tests.make('Employee', [
{ employee_name: name},
{ salutation: 'Mr'},
{ company: 'For Testing'},
{ date_of_joining: joining_date},
{ date_of_birth: birth_date},
{ employment_type: 'Test Employment Type'},
{ holiday_list: 'Test Holiday List'},
{ branch: 'Test Branch'},
{ department: 'Test Department'},
{ designation: 'Test Designation'}
]);
},
() => frappe.timeout(2),
() => {
assert.ok(cur_frm.get_field('employee_name').value==name,
'Name of an Employee is correctly set');
assert.ok(cur_frm.get_field('gender').value=='Male',
'Gender of an Employee is correctly set');
},
]);
};
frappe.run_serially([
() => employee_creation('Test Employee 1','2017-04-01','1992-02-02'),
() => frappe.timeout(10),
() => employee_creation('Test Employee 3','2017-04-01','1992-02-02'),
() => frappe.timeout(10),
() => done()
]);
});

View File

@ -1,61 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Employee attendance tool [HR]", function (assert) {
assert.expect(2);
let done = assert.async();
let today_date = frappe.datetime.nowdate();
let date_of_attendance = frappe.datetime.add_days(today_date, -2); // previous day
frappe.run_serially([
// create employee
() => {
return frappe.tests.make('Employee', [
{salutation: "Mr"},
{employee_name: "Test Employee 2"},
{company: "For Testing"},
{date_of_joining: frappe.datetime.add_months(today_date, -2)}, // joined 2 month from now
{date_of_birth: frappe.datetime.add_months(today_date, -240)}, // age is 20 years
{employment_type: "Test Employment type"},
{holiday_list: "Test Holiday list"},
{branch: "Test Branch"},
{department: "Test Department"},
{designation: "Test Designation"}
]);
},
() => frappe.set_route("Form", "Employee Attendance Tool"),
() => frappe.timeout(0.5),
() => assert.equal("Employee Attendance Tool", cur_frm.doctype,
"Form for Employee Attendance Tool opened successfully."),
// set values in form
() => cur_frm.set_value("date", date_of_attendance),
() => cur_frm.set_value("branch", "Test Branch"),
() => cur_frm.set_value("department", "Test Department"),
() => cur_frm.set_value("company", "For Testing"),
() => frappe.timeout(1),
() => frappe.click_button('Check all'),
() => frappe.click_button('Mark Present'),
// check if attendance is marked
() => frappe.set_route("List", "Attendance", "List"),
() => frappe.timeout(1),
() => {
return frappe.call({
method: "frappe.client.get_list",
args: {
doctype: "Employee",
filters: {
"branch": "Test Branch",
"department": "Test Department",
"company": "For Testing",
"status": "Active"
}
},
callback: function(r) {
let marked_attendance = cur_list.data.filter(d => d.attendance_date == date_of_attendance);
assert.equal(marked_attendance.length, r.message.length,
'all the attendance are marked for correct date');
}
});
},
() => done()
]);
});

View File

@ -1,22 +0,0 @@
QUnit.module('hr');
QUnit.test("Test: Employment type [HR]", function (assert) {
assert.expect(1);
let done = assert.async();
frappe.run_serially([
// test employment type creation
() => frappe.set_route("List", "Employment Type", "List"),
() => frappe.new_doc("Employment Type"),
() => frappe.timeout(1),
() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
() => frappe.timeout(1),
() => cur_frm.set_value("employee_type_name", "Test Employment type"),
// save form
() => cur_frm.save(),
() => frappe.timeout(1),
() => assert.equal("Test Employment type", cur_frm.doc.employee_type_name,
'name of employment type correctly saved'),
() => done()
]);
});

View File

@ -171,7 +171,7 @@ frappe.ui.form.on("Expense Claim", {
['docstatus', '=', 1],
['employee', '=', frm.doc.employee],
['paid_amount', '>', 0],
['paid_amount', '>', 'claimed_amount']
['status', '!=', 'Claimed']
]
};
});

Some files were not shown because too many files have changed in this diff Show More