Пример #1
0
	def create_payment_entry(self, submit=True):
		"""create entry"""
		frappe.flags.ignore_account_permission = True

		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)

		if self.reference_doctype in ["Sales Invoice", "POS Invoice"]:
			party_account = ref_doc.debit_to
		elif self.reference_doctype == "Purchase Invoice":
			party_account = ref_doc.credit_to
		else:
			party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)

		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(
			party_account
		)

		bank_amount = self.grand_total
		if (
			party_account_currency == ref_doc.company_currency and party_account_currency != self.currency
		):
			party_amount = ref_doc.base_grand_total
		else:
			party_amount = self.grand_total

		payment_entry = get_payment_entry(
			self.reference_doctype,
			self.reference_name,
			party_amount=party_amount,
			bank_account=self.payment_account,
			bank_amount=bank_amount,
		)

		payment_entry.update(
			{
				"reference_no": self.name,
				"reference_date": nowdate(),
				"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(
					self.reference_doctype, self.reference_name, self.name
				),
			}
		)

		if payment_entry.difference_amount:
			company_details = get_company_defaults(ref_doc.company)

			payment_entry.append(
				"deductions",
				{
					"account": company_details.exchange_gain_loss_account,
					"cost_center": company_details.cost_center,
					"amount": payment_entry.difference_amount,
				},
			)

		if submit:
			payment_entry.insert(ignore_permissions=True)
			payment_entry.submit()

		return payment_entry
Пример #2
0
	def create_payment_entry(self, submit=True):
		"""create entry"""
		frappe.flags.ignore_account_permission = True

		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)

		if self.reference_doctype == "Sales Invoice":
			party_account = ref_doc.debit_to
		elif self.reference_doctype == "Purchase Invoice":
			party_account = ref_doc.credit_to
		else:
			party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)

		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(party_account)

		bank_amount = self.grand_total
		if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
			party_amount = ref_doc.base_grand_total
		else:
			party_amount = self.grand_total

		payment_entry = get_payment_entry(self.reference_doctype, self.reference_name,
			party_amount=party_amount, bank_account=self.payment_account, bank_amount=bank_amount)

		payment_entry.update({
			"reference_no": self.name,
			"reference_date": nowdate(),
			"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(self.reference_doctype,
				self.reference_name, self.name)
		})

		if payment_entry.difference_amount:
			company_details = get_company_defaults(ref_doc.company)

			payment_entry.append("deductions", {
				"account": company_details.exchange_gain_loss_account,
				"cost_center": company_details.cost_center,
				"amount": payment_entry.difference_amount
			})

		if submit:
			payment_entry.insert(ignore_permissions=True)
			payment_entry.submit()

		return payment_entry
def return_custom_payment_entry(doc,
                                submit=False,
                                party_amount=0.0,
                                bank_amount=0.0,
                                payment_request_doc=None):  #CONTEXT=INVOICE
    payment_entry = get_payment_entry(
        doc.doctype,
        doc.name,
        party_amount=party_amount,
        bank_account=payment_request_doc.payment_account,
        bank_amount=bank_amount)
    print(f"at the custom method")
    payment_entry.update({
        "reference_no":
        doc.name,
        "reference_date":
        nowdate(),
        "remarks":
        "Payment Entry against {0} {1} via Payment Request {2}".format(
            doc.doctype, doc.name, payment_request_doc.name)
    })

    if payment_entry.difference_amount:
        company_details = get_company_defaults(doc.company)

        payment_entry.append(
            "deductions", {
                "account": company_details.exchange_gain_loss_account,
                "cost_center": company_details.cost_center,
                "amount": payment_entry.difference_amount
            })

    if submit:
        payment_entry.insert(ignore_permissions=True)
        payment_entry.submit()

    return payment_entry
Пример #4
0
    def make_sales_invoice(self):
        si_doc = frappe.new_doc('Sales Invoice')
        si_doc.company = self.company
        si_doc.currency = frappe.db.get_value("Company", self.company,
                                              "default_currency")
        si_doc.customer = self.customer_name
        si_doc.posting_date = nowdate()
        si_doc.due_date = nowdate()
        si_doc.update_stock = 1
        si_doc.x_sales_entry = self.name
        for d in self.sales_item:
            si_doc.append(
                "items", {
                    "item_code": d.item_code,
                    "qty": (d.available_qty - d.qty),
                    "rate": d.rate,
                    "cost_center": self.cost_center,
                    "warehouse": self.warehouse
                })
        si_doc.set_missing_values()
        si_doc.flags.ignore_mandatory = True
        si_doc.insert(ignore_permissions=True)
        si_doc.submit()

        if frappe.db.exists("Sales Invoice", {"name": si_doc.name}):
            apply_adjustment = False
            adj_to_be_applied = False
            company = si_doc.company
            frappe.flags.ignore_account_permission = True
            company_details = get_company_defaults(company)
            party_account = si_doc.debit_to
            party_account_currency = si_doc.get(
                "party_account_currency") or get_account_currency(
                    party_account)
            bank_amount = si_doc.grand_total

            if party_account_currency == si_doc.company_currency and party_account_currency != si_doc.currency:
                party_amount = si_doc.base_grand_total
            else:
                party_amount = si_doc.grand_total

            if self.difference_amount >= 0:
                diff_amount = self.difference_amount
            else:
                apply_adjustment = True
                adj_to_be_applied = True
                diff_amount = -1 * self.difference_amount

            for d in self.payment_entry:
                mode_of_payment = d.mode_of_payment
                if apply_adjustment:
                    if d.amount > diff_amount:
                        amount = d.amount - diff_amount
                        apply_adjustment = False
                    else:
                        amount = d.amount
                else:
                    amount = d.amount

                account = frappe.db.sql(
                    """select default_account 
						from `tabMode of Payment Account`
						where company = %s and parent = %s""", (company, mode_of_payment))
                if account:
                    payment_account = account[0][0]
                else:
                    frappe.throw(_("Please set up account in mode of payment"))

                payment_entry = get_payment_entry("Sales Invoice",
                                                  si_doc.name,
                                                  party_amount=party_amount,
                                                  bank_account=payment_account,
                                                  bank_amount=amount)

                payment_entry.update({
                    "reference_no":
                    self.name,
                    "reference_date":
                    nowdate(),
                    "remarks":
                    "Payment Entry against {0} {1} via Sales Enty {2}".format(
                        "Sales Invoice", si_doc.name, self.name),
                    "mode_of_payment":
                    mode_of_payment,
                    "base_paid_amount":
                    amount,
                    "base_received_amount":
                    amount,
                    "base_total_allocated_amount":
                    amount,
                    "paid_amount":
                    amount,
                    "received_amount":
                    amount,
                    "total_allocated_amount":
                    amount,
                    "allocate_payment_amount":
                    0,
                    "difference_amount":
                    0
                })

                payment_entry.set("references", [])
                payment_entry.append(
                    "references", {
                        "__islocal": 1,
                        "allocated_amount": amount,
                        "docstatus": 0,
                        "doctype": "Payment Entry Reference",
                        "due_date": nowdate(),
                        "exchange_rate": 1.0,
                        "idx": 1,
                        "outstanding_amount": si_doc.outstanding_amount,
                        "parentfield": "references",
                        "parenttype": "Payment Entry",
                        "reference_doctype": "Sales Invoice",
                        "reference_name": si_doc.name,
                        "total_amount": si_doc.outstanding_amount
                    })
                payment_entry.insert(ignore_permissions=True)
                payment_entry.submit()
            if apply_adjustment:
                frappe.throw(
                    _("Difference Amount cannot be adjusted as Payment Amount per Mode of Payment is less than amount to be adjusted"
                      ))
            if diff_amount > 0:
                jv = frappe.new_doc("Journal Entry")
                jv.posting_date = nowdate()
                jv.company = si_doc.company
                jv.user_remark = "Write Off Journal Entry against {0} {1} via Sales Entry {2}".format(
                    "Sales Invoice", si_doc.name, self.name)
                if adj_to_be_applied:
                    jv.set("accounts", [{
                        "party_type": "Customer",
                        "party": si_doc.customer,
                        "account": si_doc.debit_to,
                        "cost_center": self.cost_center,
                        "credit_in_account_currency": diff_amount,
                        "debit_in_account_currency": 0,
                        "exchange_rate": 1,
                        "is_advance": "Yes"
                    }, {
                        "account": company_details.write_off_account,
                        "cost_center": self.cost_center,
                        "debit_in_account_currency": diff_amount,
                        "credit_in_account_currency": 0,
                        "exchange_rate": 1
                    }])
                    adj_to_be_applied = False
                else:
                    jv.set("accounts", [{
                        "party_type": "Customer",
                        "party": si_doc.customer,
                        "account": si_doc.debit_to,
                        "reference_type": "Sales Invoice",
                        "reference_name": si_doc.name,
                        "cost_center": self.cost_center,
                        "credit_in_account_currency": diff_amount,
                        "debit_in_account_currency": 0,
                        "exchange_rate": 1
                    }, {
                        "account": company_details.write_off_account,
                        "cost_center": self.cost_center,
                        "debit_in_account_currency": diff_amount,
                        "credit_in_account_currency": 0,
                        "exchange_rate": 1
                    }])
                jv.insert(ignore_permissions=True)
                jv.submit()
Пример #5
0
    def create_payment_entry(self, submit=True):
        """Generate a payment entry against a quotation or sales order"""

        frappe.flags.ignore_account_permission = True
        ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)

        #select debit_to or credit_to account depending on sales order or purchase order
        if self.reference_doctype == "Sales Invoice":
            party_account = ref_doc.debit_to
        elif self.reference_doctype == "Purchase Invoice":
            party_account = ref_doc.credit_to
        else:
            party_account = get_party_account("Customer",
                                              ref_doc.get("customer"),
                                              ref_doc.company)

        party_account_currency = ref_doc.get(
            "party_account_currency") or get_account_currency(party_account)

        #get payment amount from the payment request document
        bank_amount = self.grand_total

        #If the currency of the customer matches with the currency of the quotation but not of the payment request
        if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
            party_amount = ref_doc.base_grand_total
        else:
            party_amount = self.grand_total

        #create a sales order if the payment request has been made against a quotation from a shopping cart
        if self.reference_doctype == "Quotation" and (
                hasattr(ref_doc, "order_type")
                and getattr(ref_doc, "order_type") == "Shopping Cart"):

            #we save with ignore_permissions and submit the quotation
            ref_doc.save(ignore_permissions=True)
            ref_doc.submit()
            frappe.db.commit()

            #convert the quotation to a sales order
            from erpnext.selling.doctype.quotation.quotation import _make_sales_order
            sales_order = frappe.get_doc(
                _make_sales_order(self.reference_name,
                                  ignore_permissions=True))
            sales_order.payment_schedule = []
            sales_order.flags.ignore_permissions = True
            sales_order.insert()
            sales_order.submit()

            #emptying out the cart
            if hasattr(frappe.local, "cookie_manager"):
                frappe.local.cookie_manager.delete_cookie("cart_count")

            #make a payment entry against the newly created sales order
            payment_entry = get_payment_entry(
                "Sales Order",
                sales_order.name,
                party_amount=party_amount,
                bank_account=self.payment_account,
                bank_amount=bank_amount)

        else:
            #reference document is the sales order in the payment request that was passed
            payment_entry = get_payment_entry(
                self.reference_doctype,
                self.reference_name,
                party_amount=party_amount,
                bank_account=self.payment_account,
                bank_amount=bank_amount)

        #updating details about the payment request in the payment entry
        payment_entry.update({
            "reference_no":
            self.name,
            "reference_date":
            nowdate(),
            "remarks":
            "Payment Entry against {0} {1} via Payment Request {2}".format(
                self.reference_doctype, self.reference_name, self.name)
        })

        if payment_entry.difference_amount:
            company_details = get_company_defaults(ref_doc.company)

            payment_entry.append(
                "deductions", {
                    "account": company_details.exchange_gain_loss_account,
                    "cost_center": company_details.cost_center,
                    "amount": payment_entry.difference_amount
                })

        #submit the payment entry and return the document
        if submit:
            payment_entry.insert(ignore_permissions=True)
            payment_entry.submit()

        #creating a sales invoice once the payment entry is submitted
        if submit and self.reference_doctype == "Quotation":
            from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice
            si = make_sales_invoice(sales_order.name, ignore_permissions=True)
            si.allocate_advances_automatically = True
            si = si.insert(ignore_permissions=True)
            si.submit()

        return payment_entry
Пример #6
0
	def create_payment_entry(self,paid, submit=True):
		bank_account = frappe.db.get_value("MRS Settings", None, "bank_account")
		isum= 0
		order_items= self.get_items()
		for i in order_items: 
			isum += i['amount']

		if not paid:
			to_pay_amount= isum
		else:
			to_pay_amount= paid
			if self.prepaid: to_pay_amount= paid + self.prepaid

		"""create entry"""
		frappe.flags.ignore_account_permission = True

		ref_doc = frappe.get_doc("Sales Invoice", self.invoice)

		party_account = ref_doc.debit_to

		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(party_account)

		bank_amount = to_pay_amount
		#if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
		#	party_amount = ref_doc.base_grand_total
		#else:
		party_amount = to_pay_amount

		payment_entry = get_payment_entry("Sales Invoice", self.invoice,
			party_amount=party_amount, bank_account=bank_account, bank_amount=bank_amount)

		payment_entry.update({
			"reference_no": self.name,
			"reference_date": nowdate(),
			"maintenance_order":self.name,
			"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format("Sales Invoice",
				self.invoice, self.name)
		})

		if payment_entry.difference_amount:
			company_details = get_company_defaults(ref_doc.company)

			payment_entry.append("deductions", {
				"account": company_details.exchange_gain_loss_account,
				"cost_center": company_details.cost_center,
				"amount": payment_entry.difference_amount
			})

		if submit:
			payment_entry.insert(ignore_permissions=True)
			payment_entry.submit()

			payment_schedule = frappe.get_doc('Payment Schedule',{'parent':self.invoice} )
			payment_schedule.invoice_portion=100
			payment_schedule.flags.ignore_validate_update_after_submit = True
			payment_schedule.save(ignore_permissions = True)
			frappe.db.commit()

			for i in order_items: 
				frappe.db.sql('update `tabDelivery Note Item` set billed_amt=%s where parent=%s',(i['amount'],self.delivery_note))

			frappe.db.sql('update `tabDelivery Note` set per_billed=%s, status="Completed" where name=%s',(100,self.delivery_note))

		frappe.msgprint(_("Payment Entry {0} created as paid".format(payment_entry.name)), alert=True)
		return payment_entry