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)))
Beispiel #2
0
    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,
            )
Beispiel #3
0
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)))
Beispiel #7
0
 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)
Beispiel #8
0
 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,
     )
Beispiel #9
0
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)
Beispiel #12
0
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)
Beispiel #13
0
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")
Beispiel #14
0
    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)