def on_submit(self): company = frappe.db.get_value("Employee", self.employee, "company") date_difference = date_diff(self.work_end_date, self.work_from_date) + 1 if self.half_day: date_difference -= 0.5 leave_period = get_leave_period(self.work_from_date, self.work_end_date, company) if leave_period: leave_allocation = self.get_existing_allocation_for_period( leave_period) if leave_allocation: leave_allocation.new_leaves_allocated += date_difference leave_allocation.validate() leave_allocation.db_set( "new_leaves_allocated", leave_allocation.total_leaves_allocated) leave_allocation.db_set( "total_leaves_allocated", leave_allocation.total_leaves_allocated) # generate additional ledger entry for the new compensatory leaves off create_additional_leave_ledger_entry( leave_allocation, date_difference, add_days(self.work_end_date, 1)) else: leave_allocation = self.create_leave_allocation( leave_period, date_difference) self.leave_allocation = leave_allocation.name else: frappe.throw( _("There is no leave period in between {0} and {1}").format( format_date(self.work_from_date), format_date(self.work_end_date)))
def validate_backdated_allocation(self): # Check if there are any future existing allocation records against the main cost center # If exists, warn the user about it future_allocation = frappe.db.get_value( "Cost Center Allocation", filters={ "main_cost_center": self.main_cost_center, "valid_from": (">=", self.valid_from), "name": ("!=", self.name), "docstatus": 1, }, fieldname=["valid_from", "name"], order_by="valid_from", as_dict=1, ) if future_allocation: frappe.msgprint( _("Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}" ).format( frappe.bold(future_allocation.name), frappe.bold(format_date(future_allocation.valid_from)), frappe.bold( format_date( add_days(future_allocation.valid_from, -1))), ), title=_("Warning!"), indicator="orange", alert=1, )
def get_context(customer, doc): template_doc = copy.deepcopy(doc) del template_doc.customers template_doc.from_date = format_date(template_doc.from_date) template_doc.to_date = format_date(template_doc.to_date) return { 'doc': template_doc, 'customer': frappe.get_doc('Customer', customer), 'frappe': frappe.utils }
def get_context(customer, doc): template_doc = copy.deepcopy(doc) del template_doc.customers template_doc.from_date = format_date(template_doc.from_date) template_doc.to_date = format_date(template_doc.to_date) return { "doc": template_doc, "customer": frappe.get_doc("Customer", customer), "frappe": frappe.utils, }
def validate_holidays(self): holidays = get_holiday_dates_for_employee(self.employee, self.work_from_date, self.work_end_date) if len(holidays) < date_diff(self.work_end_date, self.work_from_date) + 1: if date_diff(self.work_end_date, self.work_from_date): msg = _("The days between {0} to {1} are not valid holidays." ).format(frappe.bold(format_date(self.work_from_date)), frappe.bold(format_date(self.work_end_date))) else: msg = _("{0} is not a holiday.").format( frappe.bold(format_date(self.work_from_date))) frappe.throw(msg)
def validate_maintenance_date(self): if self.maintenance_type == "Scheduled" and self.maintenance_schedule_detail: item_ref = frappe.db.get_value("Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference") if item_ref: start_date, end_date = frappe.db.get_value( "Maintenance Schedule Item", item_ref, ["start_date", "end_date"]) if get_datetime(self.mntc_date) < get_datetime( start_date) or get_datetime( self.mntc_date) > get_datetime(end_date): frappe.throw( _("Date must be between {0} and {1}").format( format_date(start_date), format_date(end_date)))
def show_freq_change_warning(self, from_date, to_date): from_date = frappe.bold(format_date(from_date)) to_date = frappe.bold(format_date(to_date)) frappe.msgprint( msg=frappe. _('Employees will miss holiday reminders from {} until {}. <br> Do you want to proceed with this change?' ).format(from_date, to_date), title='Confirm change in Frequency', primary_action={ 'label': frappe._('Yes, Proceed'), 'client_action': 'erpnext.proceed_save_with_reminders_frequency_change' }, raise_exception=frappe.ValidationError)
def show_freq_change_warning(self, from_date, to_date): from_date = frappe.bold(format_date(from_date)) to_date = frappe.bold(format_date(to_date)) frappe.msgprint( msg=frappe. _("Employees will miss holiday reminders from {} until {}. <br> Do you want to proceed with this change?" ).format(from_date, to_date), title="Confirm change in Frequency", primary_action={ "label": frappe._("Yes, Proceed"), "client_action": "erpnext.proceed_save_with_reminders_frequency_change", }, raise_exception=frappe.ValidationError, )
def send_auto_email(): selected = frappe.get_list('Process Statement Of Accounts', filters={ 'to_date': format_date(today()), 'enable_auto_email': 1 }) for entry in selected: send_emails(entry.name, from_scheduler=True) return True
def send_auto_email(): selected = frappe.get_list( "Process Statement Of Accounts", filters={ "to_date": format_date(today()), "enable_auto_email": 1 }, ) for entry in selected: send_emails(entry.name, from_scheduler=True) return True
def daily(): loan_period = frappe.db.get_value("Library Management Settings", None, "loan_period") overdue = get_overdue(loan_period) for member, items in overdue.iteritems(): content = """<h2>Following Items are Overdue</h2> <p>Please return them as soon as possible</p><ol>""" for i in items: content += "<li>{0} ({1}) due on {2}</li>".format(i.article_name, i.article, format_date(add_days(i.transaction_date, loan_period))) content += "</ol>" frappe.send(recipients=[frappe.db.get_value("Library Member", member, "email_id")], sender="*****@*****.**", subject="Library Articles Overdue", msg=content, bulk=True)
def daily(): loan_period = frappe.db.get_value("Library Management Settings", None, "loan_period") overdue = get_overdue(loan_period) for member, items in overdue.iteritems(): content = """<h2>Following Items are Overdue</h2> <p>Please return them as soon as possible</p><ol>""" for i in items: content += "<li>{0} ({1}) due on {2}</li>".format(i.article_name, i.article, format_date(add_days(i.transaction_date, loan_period))) content += "</ol>" recipient = frappe.db.get_value("Library Member", member, "email_id") frappe.sendmail(recipients=[recipient], sender="*****@*****.**" subject="Library Articles Overdue", content=content, bulk=True)
def all(): print("All task running") loan_period = 2 overdue = get_overdue(loan_period) for member, items in overdue.iteritems(): content = """<h2>Following Items are Overdue</h2> <p>Please return them as soon as possible</p><ol>""" # BUG: format_date not working for i in items: content += "<li>{0} ({1}) due on {2}</li>".format( i.article_name, i.article, format_date(add_days(i.transaction_date, loan_period))) content += "</ol>" # TODO: sending mail recipient = frappe.db.get_value("Library Member", member, "email_id") # frappe.sendmail(recipients=[recipient], # sender="[email protected], # subject="Library Articles Overdue", content=content, bulk=True) print("Mail send")
def test_make_schedule(self): ms = make_maintenance_schedule() ms.save() i = ms.items[0] expected_dates = [] expected_end_date = add_days(i.start_date, i.no_of_visits * 7) self.assertEqual(i.end_date, expected_end_date) i.no_of_visits = 2 ms.save() expected_end_date = add_days(i.start_date, i.no_of_visits * 7) self.assertEqual(i.end_date, expected_end_date) items = ms.get_pending_data(data_type="items") items = items.split("\n") items.pop(0) expected_items = ["_Test Item"] self.assertTrue(items, expected_items) # "dates" contains all generated schedule dates dates = ms.get_pending_data(data_type="date", item_name=i.item_name) dates = dates.split("\n") dates.pop(0) expected_dates.append( formatdate(add_days(i.start_date, 7), "dd-MM-yyyy")) expected_dates.append( formatdate(add_days(i.start_date, 14), "dd-MM-yyyy")) # test for generated schedule dates self.assertEqual(dates, expected_dates) ms.submit() s_id = ms.get_pending_data(data_type="id", item_name=i.item_name, s_date=expected_dates[1]) # Check if item is mapped in visit. test_map_visit = make_maintenance_visit(source_name=ms.name, item_name="_Test Item", s_id=s_id) self.assertEqual(len(test_map_visit.purposes), 1) self.assertEqual(test_map_visit.purposes[0].item_name, "_Test Item") visit = frappe.new_doc("Maintenance Visit") visit = test_map_visit visit.maintenance_schedule = ms.name visit.maintenance_schedule_detail = s_id visit.completion_status = "Partially Completed" visit.set( "purposes", [{ "item_code": i.item_code, "description": "test", "work_done": "test", "service_person": "Sales Team", }], ) visit.save() visit.submit() ms = frappe.get_doc("Maintenance Schedule", ms.name) # checks if visit status is back updated in schedule self.assertTrue(ms.schedules[1].completion_status, "Partially Completed") self.assertEqual(format_date(visit.mntc_date), format_date(ms.schedules[1].actual_date)) # checks if visit status is updated on cancel visit.cancel() ms.reload() self.assertTrue(ms.schedules[1].completion_status, "Pending") self.assertEqual(ms.schedules[1].actual_date, None)