def validate_amounts(self): if not flt(self.total_amount): frappe.throw(__("Missing amount!")) if flt(self.paid_amount) > flt(self.total_amount): frappe.throw( __("Paid Amount cannot be greater than Total amount!"))
def validate_required_fields_for_repayment_amount(self): if not self.approved_net_amount: frappe.throw(__("Missing Approved Net Amount")) if not self.interest_rate: frappe.throw(__("Missing Interest Rate")) if not self.repayment_periods: frappe.throw(__("Missing Repayment Periods"))
def validate_amounts(self): if not flt(self.total_amount): frappe.throw(__("Missing amount!")) if flt(self.paid_amount, 2) > flt(self.total_amount, 2): frappe.throw( __("Paid Amount cannot be greater than Total amount!")) if flt(self.outstanding_amount) < 0.000: frappe.throw(__("Outstanding Amount cannot be less than zero!"))
def validate_approved_amounts(self): loan_type_field = self.meta.get_field("loan_type") maximum_loan_amount = frappe.get_value(loan_type_field.options, self.loan_type, "maximum_loan_amount") if self.requested_net_amount > flt(maximum_loan_amount): frappe.throw(__("Requested Net Amount can not be greater than the Maximum Loan Amount in this Loan Type")) if self.approved_gross_amount > self.requested_gross_amount: frappe.throw(__("Approved Amount can not be greater than Requested Amount"))
def update_outstanding_amount(self): if not self.docstatus == 1.000: frappe.throw( __("Please submit this Loan Charge before updating the outstanding amount!" )) outstanding_amount = flt(self.total_amount) - flt(self.paid_amount) if outstanding_amount < 0.000: frappe.throw(__("Outstanding amount cannot be negative!")) self.outstanding_amount = flt(outstanding_amount, 2)
def evaluate_loan_application(self, loan_appl): if loan_appl.docstatus == 0: frappe.throw(__("Submit this Loan Application first!")) elif loan_appl.docstatus == 2: frappe.throw(__("The selected Loan Application is already cancelled!")) if frappe.db.exists("Loan", { "loan_application": loan_appl.name , "docstatus": ["!=", "2"] }): frappe.throw(__("The selected Loan Application already has a Loan document attached to it!"))
def validate_party_account(self): if not self.party_account: frappe.throw(__("Party Account for Loan is mandatory!")) company, account_type, currency = frappe.get_value("Account", self.party_account, ["company", "account_type", "account_currency"]) if not company == self.company: frappe.throw(__("Selected party account does not belong to Loan's Company!")) if not account_type == "Receivable": frappe.throw(__("Selected party account is not Receivable!")) if not currency == self.currency: frappe.throw(__("Customer's currency and Loan's currency must be the same, you may want to create a new customer with the desired currency if necessary!"))
def get_base_amount_for(self, fieldname): if not self.meta.get_field(fieldname).fieldtype in ('Currency', 'Float'): frappe.throw( __("Field Type for {fieldname} is not aplicable to be returned\ as Base Amount".format(fieldname=fieldname))) return self.get(fieldname) * self.exchange_rate
def validate_reference_name(self): if not self.loan: frappe.throw(__("Missing Loan!")) if not self.reference_type: frappe.throw(__("Missing Repayment Type!")) if not self.reference_name: frappe.throw(__("Missing Repayment Name!")) docstatus = frappe.db.get_value(self.reference_type, self.reference_name, "docstatus") if DocStatus(docstatus) is not DocStatus.SUBMITTED: frappe.throw( __("Selected {0} is not submitted!".format( self.reference_type)))
def create_event(self): event = frappe.new_doc("Event") event.subject = __("The insurance card {} is due on {}".format(self.name, formatdate(self.end_date))) event.starts_on = self.end_date event.ends_on = "{} 23:59:59".format(cstr(self.end_date)) event.event_type = "Public" event.all_day = True event.insert(ignore_permissions=True)
def validate_customer_references(self): req_references = frappe.get_value("Custom Loan", self.loan_type, "customer_references") if self.party_type == "Customer" and \ len(frappe.get_list("Customer Reference", {"parent": self.party})) < req_references: frappe.throw( __("This loan type requires at least %d customer references") % req_references)
def validate_and_delete_loan_charge(self, doc): import fimax.utils if not doc.status in ("Overdue", "Pending"): frappe.throw(__("Could not cancel Insurance because Loan Charge {}:{} is not Pending anymore!" .format(doc.name, doc.loan_charge_type))) fimax.utils.delete_doc(doc) frappe.db.commit()
def validate(self): loan_schedule_ids = [row.name.split()[0] for row in self.loan_schedule] if __("New") in loan_schedule_ids: self.set_missing_values() self.update_repayment_schedule_dates() self.validate_company() self.validate_currency() self.validate_party_account() self.validate_exchange_rate()
def validate_party_account(self): if not self.party_account: frappe.throw(__("Party Account for Loan is mandatory!")) company, account_type, currency = frappe.get_value( "Account", self.party_account, ["company", "account_type", "account_currency"]) if not company == self.company: frappe.throw( __("Selected party account does not belong to Loan's Company!") ) if not account_type == "Receivable": frappe.throw(__("Selected party account is not Receivable!")) if not currency == self.currency: frappe.throw( __("Selected party account currency does not match with the Loan's Currency!" ))
def cancel_and_delete_loan_charge(self, child, loan_charges_type): loan_charge = child.get_loan_charge(loan_charges_type) if not loan_charge or not loan_charge.name: return doc = frappe.get_doc("Loan Charges", loan_charge.name) if not doc.is_elegible_for_deletion(): frappe.throw(__("Could not cancel this Loan because the loan charge <i>{1}</i>:<b>{0}</b> is not pending anymore!" .format(doc.name, doc.loan_charges_type))) delete_doc(doc) frappe.db.commit()
def cancel_and_delete_loan_charge(self, child, loan_charge_type): import fimax.utils loan_charge = child.get_loan_charge(loan_charge_type) if not loan_charge: return if not loan_charge.status in ("Overdue", "Pending"): frappe.throw( __("Could not cancel Loan because Loan Charge {}:{} is not Pending anymore!" .format(loan_charge.name, loan_charge.loan_charge_type))) fimax.utils.delete_doc(loan_charge) frappe.db.commit()
def set_approved_amounts(self): if frappe.session.user == self.owner: if self.docstatus == 1 and not self.approved_gross_amount == self.requested_gross_amount: frappe.msgprint(__("You won't be able to change the approved amount as you are the one requesting!")) self.approved_gross_amount = self.requested_gross_amount
def before_insert(self): if not self.loan_application: frappe.throw(__("Missing Loan Application!")) self.validate_loan_application()
def validate_exchange_rate(self): if not self.exchange_rate: frappe.throw(__("Unexpected exchange rate"))
def validate_currency(self): if not self.currency: frappe.throw(__("Currency for Loan is mandatory!"))
def validate_approved_amounts(self): if self.approved_gross_amount > self.requested_gross_amount: frappe.throw( __("Approved Amount can not be greater than Requested Amount"))
def validate_company(self): if not self.company: frappe.throw(__("Company for Loan is mandatory!"))