Merge branch 'develop' into contacts-ref
This commit is contained in:
		
						commit
						bdfd69a2fe
					
				| @ -8,7 +8,8 @@ | ||||
|   "customer", | ||||
|   "column_break_3", | ||||
|   "posting_date", | ||||
|   "outstanding_amount" | ||||
|   "outstanding_amount", | ||||
|   "debit_to" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
| @ -48,10 +49,18 @@ | ||||
|   { | ||||
|    "fieldname": "column_break_3", | ||||
|    "fieldtype": "Column Break" | ||||
|   }, | ||||
|   { | ||||
|    "fetch_from": "sales_invoice.debit_to", | ||||
|    "fieldname": "debit_to", | ||||
|    "fieldtype": "Link", | ||||
|    "label": "Debit to", | ||||
|    "options": "Account", | ||||
|    "read_only": 1 | ||||
|   } | ||||
|  ], | ||||
|  "istable": 1, | ||||
|  "modified": "2019-05-30 19:27:29.436153", | ||||
|  "modified": "2019-08-07 15:13:55.808349", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Discounted Invoice", | ||||
|  | ||||
| @ -13,41 +13,57 @@ frappe.ui.form.on('Invoice Discounting', { | ||||
| 			}; | ||||
| 		}); | ||||
| 
 | ||||
| 		frm.events.filter_accounts("bank_account", frm, {"account_type": "Bank"}); | ||||
| 		frm.events.filter_accounts("bank_charges_account", frm, {"root_type": "Expense"}); | ||||
| 		frm.events.filter_accounts("short_term_loan", frm, {"root_type": "Liability"}); | ||||
| 		frm.events.filter_accounts("accounts_receivable_credit", frm, {"account_type": "Receivable"}); | ||||
| 		frm.events.filter_accounts("accounts_receivable_discounted", frm, {"account_type": "Receivable"}); | ||||
| 		frm.events.filter_accounts("accounts_receivable_unpaid", frm, {"account_type": "Receivable"}); | ||||
| 
 | ||||
| 		frm.events.filter_accounts("bank_account", frm, [["account_type", "=", "Bank"]]); | ||||
| 		frm.events.filter_accounts("bank_charges_account", frm, [["root_type", "=", "Expense"]]); | ||||
| 		frm.events.filter_accounts("short_term_loan", frm, [["root_type", "=", "Liability"]]); | ||||
| 		frm.events.filter_accounts("accounts_receivable_discounted", frm, [["account_type", "=", "Receivable"]]); | ||||
| 		frm.events.filter_accounts("accounts_receivable_credit", frm, [["account_type", "=", "Receivable"]]); | ||||
| 		frm.events.filter_accounts("accounts_receivable_unpaid", frm, [["account_type", "=", "Receivable"]]); | ||||
| 
 | ||||
| 	}, | ||||
| 
 | ||||
| 	filter_accounts: (fieldname, frm, addl_filters) => { | ||||
| 		let filters = { | ||||
| 			"company": frm.doc.company, | ||||
| 			"is_group": 0 | ||||
| 		}; | ||||
| 		if(addl_filters) Object.assign(filters, addl_filters); | ||||
| 		let filters = [ | ||||
| 			["company", "=", frm.doc.company], | ||||
| 			["is_group", "=", 0] | ||||
| 		]; | ||||
| 		if(addl_filters){ | ||||
| 			filters = $.merge(filters , addl_filters); | ||||
| 		} | ||||
| 
 | ||||
| 		frm.set_query(fieldname, () => { return { "filters": filters }; }); | ||||
| 	}, | ||||
| 
 | ||||
| 	refresh_filters: (frm) =>{ | ||||
| 		let invoice_accounts = Object.keys(frm.doc.invoices).map(function(key) { | ||||
| 			return frm.doc.invoices[key].debit_to; | ||||
| 		}); | ||||
| 		let filters = [ | ||||
| 			["account_type", "=", "Receivable"], | ||||
| 			["name", "not in", invoice_accounts] | ||||
| 		]; | ||||
| 		frm.events.filter_accounts("accounts_receivable_credit", frm, filters); | ||||
| 		frm.events.filter_accounts("accounts_receivable_discounted", frm, filters); | ||||
| 		frm.events.filter_accounts("accounts_receivable_unpaid", frm, filters); | ||||
| 	}, | ||||
| 
 | ||||
| 	refresh: (frm) => { | ||||
| 		frm.events.show_general_ledger(frm); | ||||
| 
 | ||||
| 		if(frm.doc.docstatus === 0) { | ||||
| 		if (frm.doc.docstatus === 0) { | ||||
| 			frm.add_custom_button(__('Get Invoices'), function() { | ||||
| 				frm.events.get_invoices(frm); | ||||
| 			}); | ||||
| 		} | ||||
| 
 | ||||
| 		if(frm.doc.docstatus === 1 && frm.doc.status !== "Settled") { | ||||
| 			if(frm.doc.status == "Sanctioned") { | ||||
| 		if (frm.doc.docstatus === 1 && frm.doc.status !== "Settled") { | ||||
| 			if (frm.doc.status == "Sanctioned") { | ||||
| 				frm.add_custom_button(__('Disburse Loan'), function() { | ||||
| 					frm.events.create_disbursement_entry(frm); | ||||
| 				}).addClass("btn-primary"); | ||||
| 			} | ||||
| 			if(frm.doc.status == "Disbursed") { | ||||
| 			if (frm.doc.status == "Disbursed") { | ||||
| 				frm.add_custom_button(__('Close Loan'), function() { | ||||
| 					frm.events.close_loan(frm); | ||||
| 				}).addClass("btn-primary"); | ||||
| @ -64,7 +80,7 @@ frappe.ui.form.on('Invoice Discounting', { | ||||
| 	}, | ||||
| 
 | ||||
| 	set_end_date: (frm) => { | ||||
| 		if(frm.doc.loan_start_date && frm.doc.loan_period) { | ||||
| 		if (frm.doc.loan_start_date && frm.doc.loan_period) { | ||||
| 			let end_date = frappe.datetime.add_days(frm.doc.loan_start_date, frm.doc.loan_period); | ||||
| 			frm.set_value("loan_end_date", end_date); | ||||
| 		} | ||||
| @ -132,6 +148,7 @@ frappe.ui.form.on('Invoice Discounting', { | ||||
| 								frm.doc.invoices = frm.doc.invoices.filter(row => row.sales_invoice); | ||||
| 								let row = frm.add_child("invoices"); | ||||
| 								$.extend(row, v); | ||||
| 								frm.events.refresh_filters(frm); | ||||
| 							}); | ||||
| 							refresh_field("invoices"); | ||||
| 						} | ||||
| @ -190,8 +207,10 @@ frappe.ui.form.on('Invoice Discounting', { | ||||
| frappe.ui.form.on('Discounted Invoice', { | ||||
| 	sales_invoice: (frm) => { | ||||
| 		frm.events.calculate_total_amount(frm); | ||||
| 		frm.events.refresh_filters(frm); | ||||
| 	}, | ||||
| 	invoices_remove: (frm) => { | ||||
| 		frm.events.calculate_total_amount(frm); | ||||
| 		frm.events.refresh_filters(frm); | ||||
| 	} | ||||
| }); | ||||
| }); | ||||
|  | ||||
| @ -12,6 +12,7 @@ from erpnext.accounts.general_ledger import make_gl_entries | ||||
| class InvoiceDiscounting(AccountsController): | ||||
| 	def validate(self): | ||||
| 		self.validate_mandatory() | ||||
| 		self.validate_invoices() | ||||
| 		self.calculate_total_amount() | ||||
| 		self.set_status() | ||||
| 		self.set_end_date() | ||||
| @ -24,6 +25,15 @@ class InvoiceDiscounting(AccountsController): | ||||
| 		if self.docstatus == 1 and not (self.loan_start_date and self.loan_period): | ||||
| 			frappe.throw(_("Loan Start Date and Loan Period are mandatory to save the Invoice Discounting")) | ||||
| 
 | ||||
| 	def validate_invoices(self): | ||||
| 		discounted_invoices = [record.sales_invoice for record in  | ||||
| 			frappe.get_all("Discounted Invoice",fields = ["sales_invoice"], filters= {"docstatus":1})] | ||||
| 
 | ||||
| 		for record in self.invoices: | ||||
| 			if record.sales_invoice in discounted_invoices: | ||||
| 				frappe.throw("Row({0}): {1} is already discounted in {2}" | ||||
| 					.format(record.idx, frappe.bold(record.sales_invoice), frappe.bold(record.parent))) | ||||
| 
 | ||||
| 	def calculate_total_amount(self): | ||||
| 		self.total_amount = sum([flt(d.outstanding_amount) for d in self.invoices]) | ||||
| 
 | ||||
| @ -212,7 +222,8 @@ def get_invoices(filters): | ||||
| 			name as sales_invoice, | ||||
| 			customer, | ||||
| 			posting_date, | ||||
| 			outstanding_amount | ||||
| 			outstanding_amount, | ||||
| 			debit_to | ||||
| 		from `tabSales Invoice` si | ||||
| 		where | ||||
| 			docstatus = 1 | ||||
|  | ||||
| @ -432,7 +432,6 @@ def get_customer_id(doc, customer=None): | ||||
| 
 | ||||
| 	return cust_id | ||||
| 
 | ||||
| 
 | ||||
| def make_customer_and_address(customers): | ||||
| 	customers_list = [] | ||||
| 	for customer, data in iteritems(customers): | ||||
| @ -449,7 +448,6 @@ def make_customer_and_address(customers): | ||||
| 	frappe.db.commit() | ||||
| 	return customers_list | ||||
| 
 | ||||
| 
 | ||||
| def add_customer(data): | ||||
| 	customer = data.get('full_name') or data.get('customer') | ||||
| 	if frappe.db.exists("Customer", customer.strip()): | ||||
| @ -466,21 +464,18 @@ def add_customer(data): | ||||
| 	frappe.db.commit() | ||||
| 	return customer_doc.name | ||||
| 
 | ||||
| 
 | ||||
| def get_territory(data): | ||||
| 	if data.get('territory'): | ||||
| 		return data.get('territory') | ||||
| 
 | ||||
| 	return frappe.db.get_single_value('Selling Settings','territory') or _('All Territories') | ||||
| 
 | ||||
| 
 | ||||
| def get_customer_group(data): | ||||
| 	if data.get('customer_group'): | ||||
| 		return data.get('customer_group') | ||||
| 
 | ||||
| 	return frappe.db.get_single_value('Selling Settings', 'customer_group') or frappe.db.get_value('Customer Group', {'is_group': 0}, 'name') | ||||
| 
 | ||||
| 
 | ||||
| def make_contact(args, customer): | ||||
| 	if args.get('email_id') or args.get('phone'): | ||||
| 		name = frappe.db.get_value('Dynamic Link', | ||||
| @ -506,7 +501,6 @@ def make_contact(args, customer): | ||||
| 		doc.flags.ignore_mandatory = True | ||||
| 		doc.save(ignore_permissions=True) | ||||
| 
 | ||||
| 
 | ||||
| def make_address(args, customer): | ||||
| 	if not args.get('address_line1'): | ||||
| 		return | ||||
| @ -521,7 +515,10 @@ def make_address(args, customer): | ||||
| 		address = frappe.get_doc('Address', name) | ||||
| 	else: | ||||
| 		address = frappe.new_doc('Address') | ||||
| 		address.country = frappe.get_cached_value('Company',  args.get('company'),  'country') | ||||
| 		if args.get('company'): | ||||
| 			address.country = frappe.get_cached_value('Company', | ||||
| 				args.get('company'),  'country') | ||||
| 
 | ||||
| 		address.append('links', { | ||||
| 			'link_doctype': 'Customer', | ||||
| 			'link_name': customer | ||||
| @ -533,7 +530,6 @@ def make_address(args, customer): | ||||
| 	address.flags.ignore_mandatory = True | ||||
| 	address.save(ignore_permissions=True) | ||||
| 
 | ||||
| 
 | ||||
| def make_email_queue(email_queue): | ||||
| 	name_list = [] | ||||
| 	for key, data in iteritems(email_queue): | ||||
| @ -550,7 +546,6 @@ def make_email_queue(email_queue): | ||||
| 
 | ||||
| 	return name_list | ||||
| 
 | ||||
| 
 | ||||
| def validate_item(doc): | ||||
| 	for item in doc.get('items'): | ||||
| 		if not frappe.db.exists('Item', item.get('item_code')): | ||||
| @ -569,7 +564,6 @@ def validate_item(doc): | ||||
| 			item_doc.save(ignore_permissions=True) | ||||
| 			frappe.db.commit() | ||||
| 
 | ||||
| 
 | ||||
| def submit_invoice(si_doc, name, doc, name_list): | ||||
| 	try: | ||||
| 		si_doc.insert() | ||||
| @ -585,7 +579,6 @@ def submit_invoice(si_doc, name, doc, name_list): | ||||
| 
 | ||||
| 	return name_list | ||||
| 
 | ||||
| 
 | ||||
| def save_invoice(doc, name, name_list): | ||||
| 	try: | ||||
| 		if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}): | ||||
|  | ||||
| @ -1762,18 +1762,11 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ | ||||
| 		this.si_docs = this.get_submitted_invoice() || []; | ||||
| 		this.email_queue_list = this.get_email_queue() || {}; | ||||
| 		this.customers_list = this.get_customers_details() || {}; | ||||
| 		if(this.customer_doc) { | ||||
| 			this.freeze = this.customer_doc.display | ||||
| 		} | ||||
| 
 | ||||
| 		freeze_screen = this.freeze_screen || false; | ||||
| 
 | ||||
| 		if ((this.si_docs.length || this.email_queue_list || this.customers_list) && !this.freeze) { | ||||
| 			this.freeze = true; | ||||
| 
 | ||||
| 		if (this.si_docs.length || this.email_queue_list || this.customers_list) { | ||||
| 			frappe.call({ | ||||
| 				method: "erpnext.accounts.doctype.sales_invoice.pos.make_invoice", | ||||
| 				freeze: freeze_screen, | ||||
| 				freeze: true, | ||||
| 				args: { | ||||
| 					doc_list: me.si_docs, | ||||
| 					email_queue_list: me.email_queue_list, | ||||
|  | ||||
| @ -255,9 +255,15 @@ class Asset(AccountsController): | ||||
| 		precision = self.precision("gross_purchase_amount") | ||||
| 
 | ||||
| 		if row.depreciation_method in ("Straight Line", "Manual"): | ||||
| 			depreciation_left = (cint(row.total_number_of_depreciations) - cint(self.number_of_depreciations_booked)) | ||||
| 
 | ||||
| 			if not depreciation_left: | ||||
| 				frappe.msgprint(_("All the depreciations has been booked")) | ||||
| 				depreciation_amount = flt(row.expected_value_after_useful_life) | ||||
| 				return depreciation_amount | ||||
| 
 | ||||
| 			depreciation_amount = (flt(row.value_after_depreciation) - | ||||
| 				flt(row.expected_value_after_useful_life)) / (cint(row.total_number_of_depreciations) - | ||||
| 				cint(self.number_of_depreciations_booked)) | ||||
| 				flt(row.expected_value_after_useful_life)) / depreciation_left | ||||
| 		else: | ||||
| 			depreciation_amount = flt(depreciable_value * (flt(row.rate_of_depreciation) / 100), precision) | ||||
| 
 | ||||
| @ -275,7 +281,7 @@ class Asset(AccountsController): | ||||
| 					flt(accumulated_depreciation_after_full_schedule), | ||||
| 					self.precision('gross_purchase_amount')) | ||||
| 
 | ||||
| 				if (row.expected_value_after_useful_life and  | ||||
| 				if (row.expected_value_after_useful_life and | ||||
| 					row.expected_value_after_useful_life < asset_value_after_full_schedule): | ||||
| 					frappe.throw(_("Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}") | ||||
| 						.format(row.idx, asset_value_after_full_schedule)) | ||||
|  | ||||
| @ -41,6 +41,11 @@ def get_data(): | ||||
| 					"name": "Lead Source", | ||||
| 					"description": _("Track Leads by Lead Source.") | ||||
| 				}, | ||||
| 				{ | ||||
| 					"type": "doctype", | ||||
| 					"name": "Contract", | ||||
| 					"description": _("Helps you keep tracks of Contracts based on Supplier, Customer and Employee"), | ||||
| 				}, | ||||
| 			] | ||||
| 		}, | ||||
| 		{ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user