Пример #1
0
def set_account_heads():

    from erpnext.accounts.doctype.account.test_account import create_account

    create_account(account_name="Cess",
                   parent_account="Duties and Taxes - _GST",
                   company="_Test Company GST")

    gst_settings = frappe.get_doc("GST Settings")

    gst_account = frappe.get_all(
        "GST Account",
        fields=["cgst_account", "sgst_account", "igst_account"],
        filters={"company": "_Test Company GST"})

    if not gst_account:
        gst_settings.append(
            "gst_accounts", {
                "company": "_Test Company GST",
                "cgst_account": "CGST - _GST",
                "sgst_account": "SGST - _GST",
                "igst_account": "IGST - _GST",
                "cess_account": "Cess - _GST"
            })

        gst_settings.save()
Пример #2
0
    def setUp(self):
        frappe.set_user("Administrator")
        make_company("_Test Company SA VAT", "_TCSV")

        create_account(
            account_name="VAT - 0%",
            account_type="Tax",
            parent_account="Duties and Taxes - _TCSV",
            company="_Test Company SA VAT",
        )
        create_account(
            account_name="VAT - 15%",
            account_type="Tax",
            parent_account="Duties and Taxes - _TCSV",
            company="_Test Company SA VAT",
        )
        set_sa_vat_accounts()

        make_item("_Test SA VAT Item")
        make_item("_Test SA VAT Zero Rated Item",
                  properties={"is_zero_rated": 1})

        make_customer()
        make_supplier()

        make_sales_invoices()
        create_purchase_invoices()
Пример #3
0
	def test_deferred_expense_via_journal_entry(self):
		deferred_account = create_account(account_name="Deferred Expense",
			parent_account="Current Assets - _TC", company="_Test Company")

		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
		acc_settings.book_deferred_entries_via_journal_entry = 1
		acc_settings.submit_journal_entries = 1
		acc_settings.save()

		item = create_item("_Test Item for Deferred Accounting", is_purchase_item=True)
		item.enable_deferred_expense = 1
		item.deferred_expense_account = deferred_account
		item.save()

		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.items[0].enable_deferred_expense = 1
		pi.items[0].service_start_date = "2019-01-10"
		pi.items[0].service_end_date = "2019-03-15"
		pi.items[0].deferred_expense_account = deferred_account
		pi.save()
		pi.submit()

		pda1 = frappe.get_doc(dict(
			doctype='Process Deferred Accounting',
			posting_date=nowdate(),
			start_date="2019-01-01",
			end_date="2019-03-31",
			type="Expense",
			company="_Test Company"
		))

		pda1.insert()
		pda1.submit()

		expected_gle = [
			["_Test Account Cost for Goods Sold - _TC", 0.0, 33.85, "2019-01-31"],
			[deferred_account, 33.85, 0.0, "2019-01-31"],
			["_Test Account Cost for Goods Sold - _TC", 0.0, 43.08, "2019-02-28"],
			[deferred_account, 43.08, 0.0, "2019-02-28"],
			["_Test Account Cost for Goods Sold - _TC", 0.0, 23.07, "2019-03-15"],
			[deferred_account, 23.07, 0.0, "2019-03-15"]
		]

		gl_entries = gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
			from `tabGL Entry`
			where voucher_type='Journal Entry' and voucher_detail_no=%s and posting_date <= %s
			order by posting_date asc, account asc""", (pi.items[0].name, pi.posting_date), as_dict=1)

		for i, gle in enumerate(gl_entries):
			self.assertEqual(expected_gle[i][0], gle.account)
			self.assertEqual(expected_gle[i][1], gle.credit)
			self.assertEqual(expected_gle[i][2], gle.debit)
			self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)

		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
		acc_settings.book_deferred_entries_via_journal_entry = 0
		acc_settings.submit_journal_entriessubmit_journal_entries = 0
		acc_settings.save()
Пример #4
0
	def tearDown(self):
		target_warehouse = "_Test Warehouse 1 - _TC"
		company = "_Test Company"
		if not frappe.db.exists("Account", target_warehouse):
			parent_account = frappe.db.get_value('Account',
				{'company': company, 'is_group':1, 'account_type': 'Stock'},'name')
			account = create_account(account_name="_Test Warehouse 1", \
				account_type="Stock", parent_account= parent_account, company=company)
			frappe.db.set_value('Warehouse', target_warehouse, 'account', account)
Пример #5
0
	def tearDown(self):
		target_warehouse = "_Test Warehouse 1 - _TC"
		company = "_Test Company"
		if not frappe.db.exists("Account", target_warehouse):
			parent_account = frappe.db.get_value('Account',
				{'company': company, 'is_group':1, 'account_type': 'Stock'},'name')
			account = create_account(account_name="_Test Warehouse 1", \
				account_type="Stock", parent_account= parent_account, company=company)
			frappe.db.set_value('Warehouse', target_warehouse, 'account', account)
Пример #6
0
    def test_multi_currency_lcv(self):
        ## Create USD Shipping charges_account
        usd_shipping = create_account(
            account_name="Shipping Charges USD",
            parent_account="Duties and Taxes - TCP1",
            company="_Test Company with perpetual inventory",
            account_currency="USD")

        pr = make_purchase_receipt(
            company="_Test Company with perpetual inventory",
            warehouse="Stores - TCP1",
            supplier_warehouse="Stores - TCP1")
        pr.submit()

        lcv = make_landed_cost_voucher(
            company=pr.company,
            receipt_document_type="Purchase Receipt",
            receipt_document=pr.name,
            charges=100,
            do_not_save=True)

        lcv.append(
            "taxes", {
                "description": "Shipping Charges",
                "expense_account": usd_shipping,
                "amount": 10
            })

        lcv.save()
        lcv.submit()
        pr.load_from_db()

        # Considering exchange rate from USD to INR as 62.9
        self.assertEqual(lcv.total_taxes_and_charges, 729)
        self.assertEqual(pr.items[0].landed_cost_voucher_amount, 729)

        gl_entries = frappe.get_all(
            "GL Entry",
            fields=["account", "credit", "credit_in_account_currency"],
            filters={
                "voucher_no":
                pr.name,
                "account": ("in", [
                    "Shipping Charges USD - TCP1",
                    "Expenses Included In Valuation - TCP1"
                ])
            })

        expected_gl_entries = {
            "Shipping Charges USD - TCP1": [629, 10],
            "Expenses Included In Valuation - TCP1": [100, 100]
        }

        for entry in gl_entries:
            amounts = expected_gl_entries.get(entry.account)
            self.assertEqual(entry.credit, amounts[0])
            self.assertEqual(entry.credit_in_account_currency, amounts[1])
Пример #7
0
def make_account_for_warehouse(warehouse_name, warehouse_obj):
    if not frappe.db.exists("Account", warehouse_name + " - _TC"):
        parent_account = frappe.db.get_value(
            'Account', {
                'company': warehouse_obj.company,
                'is_group': 1,
                'account_type': 'Stock'
            }, 'name')
        account = create_account(account_name=warehouse_name, \
          account_type="Stock", parent_account= parent_account, company=warehouse_obj.company)
Пример #8
0
def get_warehouse_account(warehouse_name, company, company_abbr=None):
    if not company_abbr:
        company_abbr = frappe.get_cached_value("Company", company, 'abbr')

    if not frappe.db.exists("Account", warehouse_name + " - " + company_abbr):
        return create_account(account_name=warehouse_name,
                              parent_account=get_group_stock_account(
                                  company, company_abbr),
                              account_type='Stock',
                              company=company)
    else:
        return warehouse_name + " - " + company_abbr
Пример #9
0
def generate_taxes():
	parent_account = frappe.db.get_value('Account',
		{'company': company_name, 'is_group':1, 'account_type': 'Tax'},
		'name')
	account = create_account(company=company_name, account_name="CGST", account_type="Tax", parent_account=parent_account)
	return {'taxes':[{
		"account_head": account,
		"rate": 0,
		"description": "CGST",
		"tax_amount": 10,
		"total": 210
	}]}
Пример #10
0
 def setUp(self):
     self.ar_credit = create_account(
         account_name="_Test Accounts Receivable Credit",
         parent_account="Accounts Receivable - _TC",
         company="_Test Company")
     self.ar_discounted = create_account(
         account_name="_Test Accounts Receivable Discounted",
         parent_account="Accounts Receivable - _TC",
         company="_Test Company")
     self.ar_unpaid = create_account(
         account_name="_Test Accounts Receivable Unpaid",
         parent_account="Accounts Receivable - _TC",
         company="_Test Company")
     self.short_term_loan = create_account(
         account_name="_Test Short Term Loan",
         parent_account="Source of Funds (Liabilities) - _TC",
         company="_Test Company")
     self.bank_account = create_account(
         account_name="_Test Bank 2",
         parent_account="Bank Accounts - _TC",
         company="_Test Company")
     self.bank_charges_account = create_account(
         account_name="_Test Bank Charges Account",
         parent_account="Expenses - _TC",
         company="_Test Company")
     frappe.db.set_value("Company", "_Test Company", "default_bank_account",
                         self.bank_account)
	def test_creation_of_ledger_entry_on_submit(self):
		"""test creation of gl entries on submission of document"""
		deferred_account = create_account(
			account_name="Deferred Revenue",
			parent_account="Current Liabilities - _TC",
			company="_Test Company",
		)

		item = create_item("_Test Item for Deferred Accounting")
		item.enable_deferred_revenue = 1
		item.deferred_revenue_account = deferred_account
		item.no_of_months = 12
		item.save()

		si = create_sales_invoice(
			item=item.name, update_stock=0, posting_date="2019-01-10", do_not_submit=True
		)
		si.items[0].enable_deferred_revenue = 1
		si.items[0].service_start_date = "2019-01-10"
		si.items[0].service_end_date = "2019-03-15"
		si.items[0].deferred_revenue_account = deferred_account
		si.save()
		si.submit()

		process_deferred_accounting = doc = frappe.get_doc(
			dict(
				doctype="Process Deferred Accounting",
				posting_date="2019-01-01",
				start_date="2019-01-01",
				end_date="2019-01-31",
				type="Income",
			)
		)

		process_deferred_accounting.insert()
		process_deferred_accounting.submit()

		expected_gle = [
			[deferred_account, 33.85, 0.0, "2019-01-31"],
			["Sales - _TC", 0.0, 33.85, "2019-01-31"],
		]

		check_gl_entries(self, si.name, expected_gle, "2019-01-10")
Пример #12
0
def generate_taxes():
    parent_account = frappe.db.get_value("Account", {
        "company": company_name,
        "is_group": 1,
        "account_type": "Tax"
    }, "name")
    account = create_account(
        company=company_name,
        account_name="Output Tax CGST",
        account_type="Tax",
        parent_account=parent_account,
    )
    return {
        "taxes": [{
            "account_head": account,
            "rate": 9,
            "description": "CGST",
            "tax_amount": 10,
            "total": 210
        }]
    }
Пример #13
0
def execute():

	# Create a penalty account for loan types

	frappe.reload_doc('loan_management', 'doctype', 'loan_type')
	frappe.reload_doc('loan_management', 'doctype', 'loan')
	frappe.reload_doc('loan_management', 'doctype', 'repayment_schedule')
	frappe.reload_doc('loan_management', 'doctype', 'process_loan_interest_accrual')
	frappe.reload_doc('loan_management', 'doctype', 'loan_repayment')
	frappe.reload_doc('loan_management', 'doctype', 'loan_repayment_detail')
	frappe.reload_doc('loan_management', 'doctype', 'loan_interest_accrual')
	frappe.reload_doc('accounts', 'doctype', 'gl_entry')
	frappe.reload_doc('accounts', 'doctype', 'journal_entry_account')

	updated_loan_types = []
	loans_to_close = []

	# Update old loan status as closed
	if frappe.db.has_column('Repayment Schedule', 'paid'):
		loans_list = frappe.db.sql("""SELECT distinct parent from `tabRepayment Schedule`
			where paid = 0 and docstatus = 1""", as_dict=1)

		loans_to_close = [d.parent for d in loans_list]

	if loans_to_close:
		frappe.db.sql("UPDATE `tabLoan` set status = 'Closed' where name not in (%s)" % (', '.join(['%s'] * len(loans_to_close))), tuple(loans_to_close))

	loans = frappe.get_all('Loan', fields=['name', 'loan_type', 'company', 'status', 'mode_of_payment',
		'applicant_type', 'applicant', 'loan_account', 'payment_account', 'interest_income_account'],
		filters={'docstatus': 1, 'status': ('!=', 'Closed')})

	for loan in loans:
		# Update details in Loan Types and Loan
		loan_type_company = frappe.db.get_value('Loan Type', loan.loan_type, 'company')
		loan_type = loan.loan_type

		group_income_account = frappe.get_value('Account', {'company': loan.company,
			'is_group': 1, 'root_type': 'Income', 'account_name': _('Indirect Income')})

		if not group_income_account:
			group_income_account = frappe.get_value('Account', {'company': loan.company,
				'is_group': 1, 'root_type': 'Income'})

		penalty_account = create_account(company=loan.company, account_type='Income Account',
			account_name='Penalty Account', parent_account=group_income_account)

		# Same loan type used for multiple companies
		if loan_type_company and loan_type_company != loan.company:
			# get loan type for appropriate company
			loan_type_name = frappe.get_value('Loan Type', {'company': loan.company,
				'mode_of_payment': loan.mode_of_payment, 'loan_account': loan.loan_account,
				'payment_account': loan.payment_account, 'interest_income_account': loan.interest_income_account,
				'penalty_income_account': loan.penalty_income_account}, 'name')

			if not loan_type_name:
				loan_type_name = create_loan_type(loan, loan_type_name, penalty_account)

			# update loan type in loan
			frappe.db.sql("UPDATE `tabLoan` set loan_type = %s where name = %s", (loan_type_name,
				loan.name))

			loan_type = loan_type_name
			if loan_type_name not in updated_loan_types:
				updated_loan_types.append(loan_type_name)

		elif not loan_type_company:
			loan_type_doc = frappe.get_doc('Loan Type', loan.loan_type)
			loan_type_doc.is_term_loan = 1
			loan_type_doc.company = loan.company
			loan_type_doc.mode_of_payment = loan.mode_of_payment
			loan_type_doc.payment_account = loan.payment_account
			loan_type_doc.loan_account = loan.loan_account
			loan_type_doc.interest_income_account = loan.interest_income_account
			loan_type_doc.penalty_income_account = penalty_account
			loan_type_doc.submit()
			updated_loan_types.append(loan.loan_type)
			loan_type = loan.loan_type

		if loan_type in updated_loan_types:
			if loan.status == 'Fully Disbursed':
				status = 'Disbursed'
			elif loan.status == 'Repaid/Closed':
				status = 'Closed'
			else:
				status = loan.status

			frappe.db.set_value('Loan', loan.name, {
				'is_term_loan': 1,
				'penalty_income_account': penalty_account,
				'status': status
			})

			process_loan_interest_accrual_for_term_loans(posting_date=nowdate(), loan_type=loan_type,
				loan=loan.name)


			if frappe.db.has_column('Repayment Schedule', 'paid'):
				total_principal, total_interest = frappe.db.get_value('Repayment Schedule', {'paid': 1, 'parent': loan.name},
					['sum(principal_amount) as total_principal', 'sum(interest_amount) as total_interest'])

				accrued_entries = get_accrued_interest_entries(loan.name)
				for entry in accrued_entries:
					interest_paid = 0
					principal_paid = 0

					if flt(total_interest) > flt(entry.interest_amount):
						interest_paid = flt(entry.interest_amount)
					else:
						interest_paid = flt(total_interest)

					if flt(total_principal) > flt(entry.payable_principal_amount):
						principal_paid = flt(entry.payable_principal_amount)
					else:
						principal_paid = flt(total_principal)

					frappe.db.sql(""" UPDATE `tabLoan Interest Accrual`
						SET paid_principal_amount = `paid_principal_amount` + %s,
							paid_interest_amount = `paid_interest_amount` + %s
						WHERE name = %s""",
						(principal_paid, interest_paid, entry.name))

					total_principal = flt(total_principal) - principal_paid
					total_interest = flt(total_interest) - interest_paid
Пример #14
0
def execute():

	# Create a penalty account for loan types

	frappe.reload_doc("loan_management", "doctype", "loan_type")
	frappe.reload_doc("loan_management", "doctype", "loan")
	frappe.reload_doc("loan_management", "doctype", "repayment_schedule")
	frappe.reload_doc("loan_management", "doctype", "process_loan_interest_accrual")
	frappe.reload_doc("loan_management", "doctype", "loan_repayment")
	frappe.reload_doc("loan_management", "doctype", "loan_repayment_detail")
	frappe.reload_doc("loan_management", "doctype", "loan_interest_accrual")
	frappe.reload_doc("accounts", "doctype", "gl_entry")
	frappe.reload_doc("accounts", "doctype", "journal_entry_account")

	updated_loan_types = []
	loans_to_close = []

	# Update old loan status as closed
	if frappe.db.has_column("Repayment Schedule", "paid"):
		loans_list = frappe.db.sql(
			"""SELECT distinct parent from `tabRepayment Schedule`
			where paid = 0 and docstatus = 1""",
			as_dict=1,
		)

		loans_to_close = [d.parent for d in loans_list]

	if loans_to_close:
		frappe.db.sql(
			"UPDATE `tabLoan` set status = 'Closed' where name not in (%s)"
			% (", ".join(["%s"] * len(loans_to_close))),
			tuple(loans_to_close),
		)

	loans = frappe.get_all(
		"Loan",
		fields=[
			"name",
			"loan_type",
			"company",
			"status",
			"mode_of_payment",
			"applicant_type",
			"applicant",
			"loan_account",
			"payment_account",
			"interest_income_account",
		],
		filters={"docstatus": 1, "status": ("!=", "Closed")},
	)

	for loan in loans:
		# Update details in Loan Types and Loan
		loan_type_company = frappe.db.get_value("Loan Type", loan.loan_type, "company")
		loan_type = loan.loan_type

		group_income_account = frappe.get_value(
			"Account",
			{
				"company": loan.company,
				"is_group": 1,
				"root_type": "Income",
				"account_name": _("Indirect Income"),
			},
		)

		if not group_income_account:
			group_income_account = frappe.get_value(
				"Account", {"company": loan.company, "is_group": 1, "root_type": "Income"}
			)

		penalty_account = create_account(
			company=loan.company,
			account_type="Income Account",
			account_name="Penalty Account",
			parent_account=group_income_account,
		)

		# Same loan type used for multiple companies
		if loan_type_company and loan_type_company != loan.company:
			# get loan type for appropriate company
			loan_type_name = frappe.get_value(
				"Loan Type",
				{
					"company": loan.company,
					"mode_of_payment": loan.mode_of_payment,
					"loan_account": loan.loan_account,
					"payment_account": loan.payment_account,
					"interest_income_account": loan.interest_income_account,
					"penalty_income_account": loan.penalty_income_account,
				},
				"name",
			)

			if not loan_type_name:
				loan_type_name = create_loan_type(loan, loan_type_name, penalty_account)

			# update loan type in loan
			frappe.db.sql(
				"UPDATE `tabLoan` set loan_type = %s where name = %s", (loan_type_name, loan.name)
			)

			loan_type = loan_type_name
			if loan_type_name not in updated_loan_types:
				updated_loan_types.append(loan_type_name)

		elif not loan_type_company:
			loan_type_doc = frappe.get_doc("Loan Type", loan.loan_type)
			loan_type_doc.is_term_loan = 1
			loan_type_doc.company = loan.company
			loan_type_doc.mode_of_payment = loan.mode_of_payment
			loan_type_doc.payment_account = loan.payment_account
			loan_type_doc.loan_account = loan.loan_account
			loan_type_doc.interest_income_account = loan.interest_income_account
			loan_type_doc.penalty_income_account = penalty_account
			loan_type_doc.submit()
			updated_loan_types.append(loan.loan_type)
			loan_type = loan.loan_type

		if loan_type in updated_loan_types:
			if loan.status == "Fully Disbursed":
				status = "Disbursed"
			elif loan.status == "Repaid/Closed":
				status = "Closed"
			else:
				status = loan.status

			frappe.db.set_value(
				"Loan",
				loan.name,
				{"is_term_loan": 1, "penalty_income_account": penalty_account, "status": status},
			)

			process_loan_interest_accrual_for_term_loans(
				posting_date=nowdate(), loan_type=loan_type, loan=loan.name
			)

			if frappe.db.has_column("Repayment Schedule", "paid"):
				total_principal, total_interest = frappe.db.get_value(
					"Repayment Schedule",
					{"paid": 1, "parent": loan.name},
					["sum(principal_amount) as total_principal", "sum(interest_amount) as total_interest"],
				)

				accrued_entries = get_accrued_interest_entries(loan.name)
				for entry in accrued_entries:
					interest_paid = 0
					principal_paid = 0

					if flt(total_interest) > flt(entry.interest_amount):
						interest_paid = flt(entry.interest_amount)
					else:
						interest_paid = flt(total_interest)

					if flt(total_principal) > flt(entry.payable_principal_amount):
						principal_paid = flt(entry.payable_principal_amount)
					else:
						principal_paid = flt(total_principal)

					frappe.db.sql(
						""" UPDATE `tabLoan Interest Accrual`
						SET paid_principal_amount = `paid_principal_amount` + %s,
							paid_interest_amount = `paid_interest_amount` + %s
						WHERE name = %s""",
						(principal_paid, interest_paid, entry.name),
					)

					total_principal = flt(total_principal) - principal_paid
					total_interest = flt(total_interest) - interest_paid
Пример #15
0
def execute():

    # Create a penalty account for loan types

    frappe.reload_doc('loan_management', 'doctype', 'loan_type')
    frappe.reload_doc('loan_management', 'doctype', 'loan')
    frappe.reload_doc('loan_management', 'doctype', 'repayment_schedule')
    frappe.reload_doc('loan_management', 'doctype',
                      'process_loan_interest_accrual')
    frappe.reload_doc('loan_management', 'doctype', 'loan_repayment')
    frappe.reload_doc('loan_management', 'doctype', 'loan_repayment_detail')
    frappe.reload_doc('loan_management', 'doctype', 'loan_interest_accrual')
    frappe.reload_doc('accounts', 'doctype', 'gl_entry')

    updated_loan_types = []

    loans = frappe.get_all('Loan',
                           fields=[
                               'name', 'loan_type', 'company', 'status',
                               'mode_of_payment', 'applicant_type',
                               'applicant', 'loan_account', 'payment_account',
                               'interest_income_account'
                           ])

    for loan in loans:
        # Update details in Loan Types and Loan
        loan_type_company = frappe.db.get_value('Loan Type', loan.loan_type,
                                                'company')

        group_income_account = frappe.get_value(
            'Account', {
                'company': loan.company,
                'is_group': 1,
                'root_type': 'Income',
                'account_name': _('Indirect Income')
            })

        if not group_income_account:
            group_income_account = frappe.get_value('Account', {
                'company': loan.company,
                'is_group': 1,
                'root_type': 'Income'
            })

        penalty_account = create_account(company=loan.company,
                                         account_type='Income Account',
                                         account_name='Penalty Account',
                                         parent_account=group_income_account)

        if not loan_type_company:
            loan_type_doc = frappe.get_doc('Loan Type', loan.loan_type)
            loan_type_doc.is_term_loan = 1
            loan_type_doc.company = loan.company
            loan_type_doc.mode_of_payment = loan.mode_of_payment
            loan_type_doc.payment_account = loan.payment_account
            loan_type_doc.loan_account = loan.loan_account
            loan_type_doc.interest_income_account = loan.interest_income_account
            loan_type_doc.penalty_income_account = penalty_account
            loan_type_doc.submit()
            updated_loan_types.append(loan.loan_type)

        if loan.loan_type in updated_loan_types:
            if loan.status == 'Fully Disbursed':
                status = 'Disbursed'
            elif loan.status == 'Repaid/Closed':
                status = 'Closed'
            else:
                status = loan.status

            frappe.db.set_value(
                'Loan', loan.name, {
                    'is_term_loan': 1,
                    'penalty_income_account': penalty_account,
                    'status': status
                })

            process_loan_interest_accrual_for_term_loans(
                posting_date=nowdate(),
                loan_type=loan.loan_type,
                loan=loan.name)

            payments = frappe.db.sql(
                ''' SELECT j.name, a.debit, a.debit_in_account_currency, j.posting_date
				FROM `tabJournal Entry` j, `tabJournal Entry Account` a
				WHERE a.parent = j.name and a.reference_type='Loan' and a.reference_name = %s
				and account = %s
			''', (loan.name, loan.loan_account),
                as_dict=1)

            for payment in payments:
                repayment_entry = make_repayment_entry(
                    loan.name, loan.loan_applicant_type, loan.applicant,
                    loan.loan_type, loan.company)

                repayment_entry.amount_paid = payment.debit_in_account_currency
                repayment_entry.posting_date = payment.posting_date
                repayment_entry.save()
                repayment_entry.submit()

                jv = frappe.get_doc('Journal Entry', payment.name)
                jv.flags.ignore_links = True
                jv.cancel()
Пример #16
0
def make_account_for_warehouse(warehouse_name, warehouse_obj):
	if not frappe.db.exists("Account", warehouse_name + " - _TC"):
		parent_account = frappe.db.get_value('Account',
			{'company': warehouse_obj.company, 'is_group':1, 'account_type': 'Stock'},'name')
		account = create_account(account_name=warehouse_name, \
				account_type="Stock", parent_account= parent_account, company=warehouse_obj.company)
    def test_deferred_revenue(self):
        self.clear_old_entries()

        # created deferred expense accounts, if not found
        deferred_revenue_account = create_account(
            account_name="Deferred Revenue",
            parent_account="Current Liabilities - _CD",
            company="_Test Company DR",
        )

        acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
        acc_settings.book_deferred_entries_based_on = "Months"
        acc_settings.save()

        customer = frappe.new_doc("Customer")
        customer.customer_name = "_Test Customer DR"
        customer.type = "Individual"
        customer.insert()

        item = create_item(
            "_Test Internet Subscription",
            is_stock_item=0,
            warehouse="All Warehouses - _CD",
            company="_Test Company DR",
        )
        item.enable_deferred_revenue = 1
        item.deferred_revenue_account = deferred_revenue_account
        item.no_of_months = 3
        item.save()

        si = create_sales_invoice(
            item=item.name,
            company="_Test Company DR",
            customer="_Test Customer DR",
            debit_to="Debtors - _CD",
            posting_date="2021-05-01",
            parent_cost_center="Main - _CD",
            cost_center="Main - _CD",
            do_not_save=True,
            rate=300,
            price_list_rate=300,
        )

        si.items[0].income_account = "Sales - _CD"
        si.items[0].enable_deferred_revenue = 1
        si.items[0].service_start_date = "2021-05-01"
        si.items[0].service_end_date = "2021-08-01"
        si.items[0].deferred_revenue_account = deferred_revenue_account
        si.items[0].income_account = "Sales - _CD"
        si.save()
        si.submit()

        pda = frappe.get_doc(
            dict(
                doctype="Process Deferred Accounting",
                posting_date=nowdate(),
                start_date="2021-05-01",
                end_date="2021-08-01",
                type="Income",
                company="_Test Company DR",
            ))
        pda.insert()
        pda.submit()

        # execute report
        fiscal_year = frappe.get_doc(
            "Fiscal Year", frappe.defaults.get_user_default("fiscal_year"))
        self.filters = frappe._dict({
            "company":
            frappe.defaults.get_user_default("Company"),
            "filter_based_on":
            "Date Range",
            "period_start_date":
            "2021-05-01",
            "period_end_date":
            "2021-08-01",
            "from_fiscal_year":
            fiscal_year.year,
            "to_fiscal_year":
            fiscal_year.year,
            "periodicity":
            "Monthly",
            "type":
            "Revenue",
            "with_upcoming_postings":
            False,
        })

        report = Deferred_Revenue_and_Expense_Report(filters=self.filters)
        report.run()
        expected = [
            {
                "key": "may_2021",
                "total": 100.0,
                "actual": 100.0
            },
            {
                "key": "jun_2021",
                "total": 100.0,
                "actual": 100.0
            },
            {
                "key": "jul_2021",
                "total": 100.0,
                "actual": 100.0
            },
            {
                "key": "aug_2021",
                "total": 0,
                "actual": 0
            },
        ]
        self.assertEqual(report.period_total, expected)
    def test_deferred_expense(self):
        self.clear_old_entries()

        # created deferred expense accounts, if not found
        deferred_expense_account = create_account(
            account_name="Deferred Expense",
            parent_account="Current Assets - _CD",
            company="_Test Company DR",
        )

        acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
        acc_settings.book_deferred_entries_based_on = "Months"
        acc_settings.save()

        supplier = create_supplier(supplier_name="_Test Furniture Supplier",
                                   supplier_group="Local",
                                   supplier_type="Company")
        supplier.save()

        item = create_item(
            "_Test Office Desk",
            is_stock_item=0,
            warehouse="All Warehouses - _CD",
            company="_Test Company DR",
        )
        item.enable_deferred_expense = 1
        item.deferred_expense_account = deferred_expense_account
        item.no_of_months_exp = 3
        item.save()

        pi = make_purchase_invoice(
            item=item.name,
            company="_Test Company DR",
            supplier="_Test Furniture Supplier",
            is_return=False,
            update_stock=False,
            posting_date=frappe.utils.datetime.date(2021, 5, 1),
            parent_cost_center="Main - _CD",
            cost_center="Main - _CD",
            do_not_save=True,
            rate=300,
            price_list_rate=300,
            warehouse="All Warehouses - _CD",
            qty=1,
        )
        pi.set_posting_time = True
        pi.items[0].enable_deferred_expense = 1
        pi.items[0].service_start_date = "2021-05-01"
        pi.items[0].service_end_date = "2021-08-01"
        pi.items[0].deferred_expense_account = deferred_expense_account
        pi.items[0].expense_account = "Office Maintenance Expenses - _CD"
        pi.save()
        pi.submit()

        pda = frappe.get_doc(
            dict(
                doctype="Process Deferred Accounting",
                posting_date=nowdate(),
                start_date="2021-05-01",
                end_date="2021-08-01",
                type="Expense",
                company="_Test Company DR",
            ))
        pda.insert()
        pda.submit()

        # execute report
        fiscal_year = frappe.get_doc(
            "Fiscal Year", frappe.defaults.get_user_default("fiscal_year"))
        self.filters = frappe._dict({
            "company":
            frappe.defaults.get_user_default("Company"),
            "filter_based_on":
            "Date Range",
            "period_start_date":
            "2021-05-01",
            "period_end_date":
            "2021-08-01",
            "from_fiscal_year":
            fiscal_year.year,
            "to_fiscal_year":
            fiscal_year.year,
            "periodicity":
            "Monthly",
            "type":
            "Expense",
            "with_upcoming_postings":
            False,
        })

        report = Deferred_Revenue_and_Expense_Report(filters=self.filters)
        report.run()
        expected = [
            {
                "key": "may_2021",
                "total": -100.0,
                "actual": -100.0
            },
            {
                "key": "jun_2021",
                "total": -100.0,
                "actual": -100.0
            },
            {
                "key": "jul_2021",
                "total": -100.0,
                "actual": -100.0
            },
            {
                "key": "aug_2021",
                "total": 0,
                "actual": 0
            },
        ]
        self.assertEqual(report.period_total, expected)