Exemple #1
0
def get_hijri_month_length(month, year):
    date = HijriDate(year, month, 1)
    date = HijriDate(int(date.year_gr),
                     int(date.month_gr),
                     int(date.day_gr),
                     gr=True)
    return date.month_len
Exemple #2
0
 def action_across_month(self):
     loan_id = self._context.get('active_id', False)
     loan_obj = self.env['hr.loan']
     loan_line_obj = self.env['hr.loan.line']
     action = self._context.get('action', False)
     dt = fields.Date.from_string(self.period_id.date_start)
     day = dt.day
     if loan_id:
         if action == 'across':  # تجاوز شهر
             # must delete this month add another month
             loan_lines = loan_line_obj.search([
                 ('loan_id', '=', loan_id),
                 ('date_start', '=', self.period_id.date_start),
                 ('date_stop', '=', self.period_id.date_stop)
             ])
             loan_lines.unlink()
             um = HijriDate()
             loan = loan_obj.search([('id', '=', loan_id)])
             last_date_start = fields.Date.from_string(
                 loan.line_ids[-1].date_start)
             last_date_stop = fields.Date.from_string(
                 loan.line_ids[-1].date_stop)
             temp_date_start = last_date_stop + relativedelta(days=1)
             hijri_month = get_hijri_month_by_date(HijriDate, Umalqurra,
                                                   temp_date_start)
             hijri_year = get_hijri_year_by_date(HijriDate, Umalqurra,
                                                 temp_date_start)
             new_date_start = get_hijri_month_start_by_year(
                 HijriDate, Umalqurra, hijri_year, hijri_month)
             new_date_stop = get_hijri_month_end__by_year(
                 HijriDate, Umalqurra, hijri_year, hijri_month)
             dates = str(new_date_start).split('-')
             um.set_date_from_gr(int(dates[0]), int(dates[1]), day)
             new_line_val = {
                 'loan_id': loan_id,
                 'amount': loan.monthly_amount,
                 'date_start': new_date_start,
                 'date_stop': new_date_stop,
                 'name': MONTHS[int(um.month)] + '/' + str(int(um.year)),
             }
             loan_line_obj.create(new_line_val)
         val = {
             'loan_id': loan_id,
             'reason': self.reason,
             'period_id': self.period_id.id,
             'number_decision': self.number_decision,
             'date_decision': self.date_decision,
             'action': action,
         }
         if action == 'full_amount':
             loan = self.env['hr.loan'].browse(loan_id)
             loan.write({'state': 'done', 'payment_full_amount': True})
             # make all line payed
             loan.line_ids.write({'state': 'done'})
         self.env['hr.loan.history'].create(val)
     return {'type': 'ir.actions.act_window_close'}
Exemple #3
0
def get_month(passed_date=None, passed_month=None, passed_year=None):
    if passed_date == None and passed_month == None and passed_year == None:
        current_date_object = HijriDate.today()
    else:
        current_date_object = HijriDate(passed_year,
                                        passed_month,
                                        passed_date,
                                        gr=True)

    return int(current_date_object.month)
Exemple #4
0
def genrate_dim_date(start_date, end_date):
    data = DataFrame({'gregorian_date': date_range(start_date, end_date)})
    data['gregorian_year'] = data.apply(lambda x: x.gregorian_date.year,
                                        axis=1)
    data['gregorian_month'] = data.apply(lambda x: x.gregorian_date.month,
                                         axis=1)
    data['gregorian_day'] = data.apply(lambda x: x.gregorian_date.day, axis=1)

    data['jalali_year'] = data.apply(lambda x: GregorianToJalali(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).jyear,
                                     axis=1)
    data['jalali_month'] = data.apply(lambda x: GregorianToJalali(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).jmonth,
                                      axis=1)
    data['jalali_day'] = data.apply(lambda x: GregorianToJalali(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).jday,
                                    axis=1)
    data['jalali_month_name'] = data.jalali_month.map(jalali_months_dict)
    data['week_day'] = data.apply(lambda x: datetime.datetime(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).weekday(),
                                  axis=1).map(week_days_dict)
    data['week_day_en'] = data.apply(lambda x: datetime.datetime(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).weekday(),
                                     axis=1).map(week_days_en_dict)

    data['hijri_year'] = data.apply(lambda x: int(
        HijriDate(
            x.gregorian_year, x.gregorian_month, x.gregorian_day, gr=True).year
    ),
                                    axis=1)
    data['hijri_month'] = data.apply(lambda x: int(
        HijriDate(
            x.gregorian_year, x.gregorian_month, x.gregorian_day, gr=True).
        month),
                                     axis=1)
    data['hijri_day'] = data.apply(lambda x: int(
        HijriDate(
            x.gregorian_year, x.gregorian_month, x.gregorian_day, gr=True).day
    ),
                                   axis=1)
    data['hijri_month_name'] = data.hijri_month.map(hijri_months_dict)

    data['gregorian_month_name_en'] = data.gregorian_month.map(
        gregorian_months_en_dict)
    data['gregorian_month_name_fa'] = data.gregorian_month.map(
        gregorian_months_fa_dict)
    data['gregorian_week_number'] = data.apply(lambda x: datetime.date(
        x.gregorian_year, x.gregorian_month, x.gregorian_day).isocalendar()[1],
                                               axis=1)
    data['jalali_week_number'] = data.apply(
        lambda x: jalali_week(x.jalali_year, x.jalali_month, x.jalali_day),
        axis=1)

    data.to_csv(dim_date_file, encoding='utf8')
Exemple #5
0
    def _onchange_date(self):
        # لا يمكن أن يكون القسط  أكبر من ثلث الراتب
        grid_id, basic_salary = self.employee_id.get_salary_grid_id(False)
        if not grid_id:
            return
        if self.monthly_amount > basic_salary / 3.0:
            warning = {
                'title':
                _('تحذير!'),
                'message':
                _(u'لا يمكن أن يكون القسط (%s) أكبر من ثلث الراتب (%s)' %
                  (self.monthly_amount, basic_salary / 3.0))
            }
            self.monthly_amount = False
            return {'warning': warning}

        if self.date_from and self.amount and self.monthly_amount:
            # get lines
            dt = fields.Date.from_string(self.date_from)
            months = []
            amount = 0.0
            diff = self.amount - amount
            installment_number = 0
            final_amount = self.monthly_amount
            while diff > 0:
                um = HijriDate()
                dates = str(dt).split('-')
                um.set_date_from_gr(int(dates[0]), int(dates[1]),
                                    int(dates[2]))
                date_start = get_hijri_month_start_by_year(
                    HijriDate, Umalqurra, int(um.year), int(um.month))
                date_stop = get_hijri_month_end__by_year(
                    HijriDate, Umalqurra, int(um.year), int(um.month))
                month_val = {
                    'loan_id': self.id,
                    'amount': final_amount,
                    'date_start': date_start,
                    'date_stop': date_stop,
                    'name': MONTHS[int(um.month)] + '/' + str(int(um.year)),
                    'state': 'progress'
                }
                months.append(month_val)
                dt = fields.Date.from_string(str(dt)) + relativedelta(days=30)
                installment_number += 1
                amount += self.monthly_amount
                diff = self.amount - amount
                if diff >= self.monthly_amount:
                    final_amount = self.monthly_amount
                else:
                    final_amount = diff
            self.installment_number = installment_number
            self.line_ids = months
            self.date_to = date_stop
 def _hijri_day_of_year(date):
     date_um = gregorian_to_hijri(date)
     first_day_of_year_um = HijriDate(date_um.year, 1, 1)
     first_day_of_year_gr = hijri_to_gregorian(first_day_of_year_um)
     tdiff = date - first_day_of_year_gr
     day_of_year = tdiff.days + 1
     return day_of_year
Exemple #7
0
    def _get_years(self, date, separator):

        if date:
            date = fields.Date.from_string(date)
            hijri_date = HijriDate(date.year, date.month, date.day, gr=True)
            return str(int(hijri_date.year))
        return None
Exemple #8
0
 def _get_hijra(self):
     um = HijriDate(datetime.now().year,
                    datetime.now().month,
                    datetime.now().day,
                    gr=True)
     self.hijri_date = str(int(um.day)) + "/" + str(int(
         um.month)) + "/" + str(int(um.year))
Exemple #9
0
 def get_ummqura(self, g_date):
     try:
         g_date = fields.Date.from_string(g_date)
         hijri_date = HijriDate(g_date.year, g_date.month, g_date.day, gr=True)
         hijri_date_str = "{0}/{1}/{2}".format(int(hijri_date.year), int(hijri_date.month), int(hijri_date.day))
         return self.num2hindi(hijri_date_str)
     except Exception:
         return False
Exemple #10
0
 def _hijri_to_gregorian(year, month, day, date_obj=None):
     hd = HijriDate(year=year, month=month, day=day)
     year_gr = int(hd.year_gr)
     month_gr = int(hd.month_gr)
     day_gr = int(hd.day_gr)
     if date_obj:
         return date_obj.replace(year=year_gr, month=month_gr, day=day_gr)
     else:
         return datetime(year=year_gr, month=month_gr, day=day_gr)
Exemple #11
0
def hijri_year_range(min_date, max_date):
    """Get an array of start and end dates for each year in the given gregorian date ranges

    There is no periodic year range

    Args:
        min_date (date): gregorian date to start the date range at
        max_date (date): gregorian date to end the date range at

    Returns:
        {'type': 'years', 'bounds': bounds, 'date_sets': days, 'periodic': periodic}
             bounds: bounding DateRange which the date sets contain
             days: array of HijriDateSets
    """
    min_date = datetime.combine(min_date, datetime.min.time())
    max_date = datetime.combine(max_date, datetime.min.time())
    min_date_um = gregorian_to_hijri(min_date)
    max_date_um = gregorian_to_hijri(max_date)
    bounds = DateRange(start=min_date, end=max_date)
    hijri_years = xrange(int(min_date_um.year), int(max_date_um.year) + 1)
    years = []
    for year in hijri_years:
        start_date_um = HijriDate(year, 1, 1)
        start_date_gr = hijri_to_gregorian(start_date_um)

        end_date_um = HijriDate(year + 1, 1, 1)
        end_date_gr = hijri_to_gregorian(end_date_um)

        years.append(
            HijriDateSet(key=str(year),
                         label=[{
                             'text': str(year),
                             'translate': False
                         }],
                         ranges=[
                             DateRange(start=local_tz.localize(start_date_gr),
                                       end=local_tz.localize(end_date_gr))
                         ]))
    return {
        'type': 'years',
        'bounds': bounds,
        'date_sets': years,
        'periodic': False
    }
Exemple #12
0
 def _get_hijri_date(self, date, separator):
     '''
     convert georging date to hijri date
     :return hijri date as a string value
     '''
     if date:
         date = fields.Date.from_string(date)
         hijri_date = HijriDate(date.year, date.month, date.day, gr=True)
         return str(int(hijri_date.day)).zfill(2) + separator + str(int(hijri_date.month)).zfill(2) + separator + str(int(hijri_date.year))
     return None
Exemple #13
0
 def _get_recrute_employee(self, data, date, separator):
     employee_id = data['employee_id'] and data['employee_id'][0] or False
     emp_obj = self.pool.get('hr.employee').browse(self.cr, self.uid,
                                                   employee_id)
     if emp_obj.recruiter_date:
         date = fields.Date.from_string(emp_obj.recruiter_date)
         hijri_date = HijriDate(date.year, date.month, date.day, gr=True)
         return str(int(hijri_date.year)) + separator + str(
             int(hijri_date.month)) + separator + str(int(hijri_date.day))
     return None
Exemple #14
0
    def compute_age_display(self):
        for rec in self:
            today_date = date(int(HijriDate.today().year),
                              int(HijriDate.today().month),
                              int(HijriDate.today().day))
            gr_birthday = fields.Date.from_string(rec.birthday)
            hijri_birthday = HijriDate(gr_birthday.year,
                                       gr_birthday.month,
                                       gr_birthday.day,
                                       gr=True)
            birthday = date(int(hijri_birthday.year),
                            int(hijri_birthday.month), int(hijri_birthday.day))
            born = birthday.replace(year=today_date.year)
            if born > today_date:
                years = today_date.year - birthday.year - 1
            else:
                years = today_date.year - birthday.year
            if today_date.month < birthday.month:
                if today_date.day < birthday.day:
                    months = 12 - (birthday.month - today_date.month) - 1
                else:
                    months = 12 - (birthday.month - today_date.month)
            else:
                if today_date.day < birthday.day and today_date.month != birthday.month:
                    months = today_date.month - birthday.month - 1
                else:
                    months = today_date.month - birthday.month
            if today_date.month == birthday.month:
                if today_date.day >= birthday.day:
                    days = today_date.day - birthday.day
                else:
                    days = birthday.day - today_date.day
            else:

                if today_date.day >= birthday.day:
                    days = today_date.day - birthday.day
                else:
                    days = (30 - birthday.day) + today_date.day

            res = str(years) + " سنة و" + str(months) + " شهر و " + str(
                days) + "يوم"
            rec.age_display = res
Exemple #15
0
def get_date(passed_date=None,
             passed_month=None,
             passed_year=None,
             en=False,
             arabic=False):
    if passed_date == None and passed_month == None and passed_year == None:
        current_date_object = HijriDate.today()
    else:
        current_date_object = HijriDate(passed_year,
                                        passed_month,
                                        passed_date,
                                        gr=True)

    passed_year = int(current_date_object.year)
    passed_month = int(current_date_object.month)

    if arabic == 1:
        passed_date = int(current_date_object.day)
    else:
        passed_date = int(current_date_object.day) - int(1)

    passed_week = current_date_object.day_name_en

    hijri_date_month_year_bn = {
        'date': bangla.convert_english_digit_to_bangla_digit(passed_date),
        'month': bangla.convert_english_digit_to_bangla_digit(passed_month),
        'year': bangla.convert_english_digit_to_bangla_digit(passed_year),
        'weekday': weekdays_dict[passed_week],
    }

    hijri_date_month_year_en = {
        'date': passed_date,
        'month': passed_month,
        'year': passed_year,
        'weekday': passed_week,
    }

    if en == 1:
        return hijri_date_month_year_en
    else:
        return hijri_date_month_year_bn
Exemple #16
0
 def _hijri_week_of_year(date):
     date_um = gregorian_to_hijri(date)
     first_day_of_year_um = HijriDate(date_um.year, 1, 1)
     first_day_of_year_gr = hijri_to_gregorian(first_day_of_year_um)
     tdiff = date - first_day_of_year_gr
     day_of_year = tdiff.days + 1
     date_dow = date.isoweekday()
     first_day_dow = first_day_of_year_gr.isoweekday()
     weeknum = ((day_of_year + 6) / 7)
     if date_dow < first_day_dow:
         weeknum += 1
     return weeknum
Exemple #17
0
def gregorian_to_hijri(gregorian_date):
    """Convert a python datetime to a HijriDate

    Args:
        gregorian_date (datetime): date to convert
    Returns:
        ummalqurra.hijri_date.HijriDate
    """
    day = gregorian_date.day
    month = gregorian_date.month
    year = gregorian_date.year
    umalqurra_date = HijriDate(year, month, day, gr=True)
    return umalqurra_date
Exemple #18
0
    def test_get_date_when_en_is_true(self):
        today = HijriDate.today()
        date = int(today.day) - int(1)
        year = int(today.year)
        month = int(today.month)
        weekday = today.day_name_en

        result = hijricalendar.get_date(en=True)
        expect = {
            'date': date,
            'year': year,
            'weekday': weekday,
            'month': month
        }
        self.assertEquals(result, expect)
Exemple #19
0
    def test_get_date(self):
        today = HijriDate.today()
        date = bangla.convert_english_digit_to_bangla_digit(
            int(today.day) - int(1))
        year = bangla.convert_english_digit_to_bangla_digit(int(today.year))
        month = bangla.convert_english_digit_to_bangla_digit(int(today.month))
        weekday = hijricalendar.weekdays_dict[today.day_name_en]

        result = hijricalendar.get_date()
        expect = {
            'date': date,
            'year': year,
            'weekday': weekday,
            'month': month
        }
        self.assertEquals(result, expect)
def getAribaTime(t):
    """将日期字符串转换成阿拉伯日期"""
    # print t
    if t == 'Not recorded':
        return 'None'
    else:
        date_time = datetime.datetime.strptime(t, '%d %B %Y')
        w = date_time.weekday()
        m = date_time.month
        d = date_time.day
        y = date_time.year
        # print w,m,t
        ld = HijriDate(y, m, d, gr=True)
        # print ld,ld.month,m
        return ld.month
    pass
Exemple #21
0
def middle_east_parsed_date(text_date, kwargs):
    """
    :param text_date:
    :param kwargs: format : %d-%m-%Y for 12-7-1397.
    :return:
    """
    dict_month_numeric = dict(
        (v, k) for k, v in enumerate(calendar.month_name))
    dict_month_abbr_numeric = dict(
        (v, k) for k, v in enumerate(calendar.month_abbr))

    day = -1
    month = -1
    year = -1
    default_format = ["%d", "%m", "%Y"]
    tsplit = split_non_alpha(text_date)
    if "format" in kwargs:
        format = kwargs["format"]
    else:
        format = default_format
    if len(tsplit) != len(default_format):
        #TODO: likely split characters next to each other 29101394
        return None
    for idx in range(0, len(tsplit)):
        item = tsplit[idx]
        if not isinstance(item, int) and not isinstance(item, float):
            item = item.capitalize().strip()
            if item in dict_month_numeric:
                item = dict_month_numeric[item]
            elif item in dict_month_abbr_numeric:
                item = dict_month_abbr_numeric[item]
        f_value = format[idx]
        if f_value == "%d":
            day = int(item)
        elif f_value == "%m":
            month = int(item)
        elif f_value == "%Y":
            year = int(item)

    if month > 0 and day > 0 and year > 0:
        if year < 1410:
            jd = jdatetime.datetime(year, month, day)
            return jd.togregorian()
        if year < 1500:
            um = HijriDate(year, month, day)
            return datetime(um.year_gr, um.month_gr, um.day_gr)
    return None
Exemple #22
0
from umalqurra.hijri_date import HijriDate
#create the object with Gregorian date
um = HijriDate()
#to see the day in Hijri
print um.day  # result : 3.0
print um.month
#to see the month in Hijri
# um.month #result is 6.0
# #year
# um.year #1409
# #day name in arabic
# #day in english
# um.day_name_en #Tuesday
# #month in Hijri Arabic
# print um.month_name
# #month in Gregorian English
# um.month_name_gr #January
# #year in Gregorian
# um.year_gr #1989
# #month in Gregorian
# um.month_gr # 1
# #day in Gregorian
# um.day_gr # 10
Exemple #23
0
 def generate_file(self):
     # TODO: must check all fields
     fp = TemporaryFile()
     header_key = '000000000000'
     calendar_type = 'H'
     current_date = HijriDate.today()
     year = str(int(current_date.year)).zfill(4)
     month = str(int(current_date.month)).zfill(2)
     day = str(int(current_date.day)).zfill(2)
     send_date = year + month + day
     today = fields.Date.from_string(fields.Date.today())
     value_date_g = today + relativedelta(days=14)
     hijri_date = HijriDate(value_date_g.year,
                            value_date_g.month,
                            value_date_g.day,
                            gr=True)
     value_date = str(int(hijri_date.year)).zfill(4) + str(
         int(hijri_date.month)).zfill(2) + str(int(hijri_date.day)).zfill(2)
     total_amount = str(self.amount_total).replace('.',
                                                   '').replace(',',
                                                               '').zfill(15)
     total_employees = str(len(self.slip_ids)).zfill(8)
     account_number = str(self.env.user.company_id.vat or '').zfill(13)
     file_parameter = '1'
     file_sequence = '01'
     filler = ''.rjust(65, ' ')
     file_dec = ''
     file_dec += u'%s%s%s%s%s%s%s%s%s%s\n' % (
         header_key, calendar_type, send_date, value_date, total_amount,
         total_employees, account_number, file_parameter, file_sequence,
         filler)
     for playslip in self.slip_no_zero_ids:
         employee = playslip.employee_id
         # add line for each playslip
         employee_number = employee.number.ljust(12, ' ')
         # search account bank for this employee
         banks = self.env['res.partner.bank'].search([
             ('employee_id', '=', employee.id), ('is_deposit', '=', True)
         ])
         if not banks:
             raise UserError(u"يجب إنشاء حساب بنكي للإيداع  للموظف  %s " %
                             employee.display_name)
         employee_bank = banks[0]
         employee_bank_id = employee_bank.bank_id.bic.ljust(4, ' ')
         employee_account_number = employee_bank.acc_number.ljust(24, ' ')
         employee_name = '*****'.ljust(50, ' ')
         employee_amount = str(playslip.salary_net).replace(
             '.', '').replace(',', '').zfill(15)
         civilian_id = employee.identification_id and employee.identification_id.zfill(
             15) or ''.zfill(15)
         employee_id_type = '0'
         process_flag = ' '
         block_amount = ' '
         kawadar_flag = ' '
         filler = ''.rjust(11, ' ')
         file_dec += u'%s%s%s%s%s%s%s%s%s%s%s\n' % (
             employee_number, employee_bank_id, employee_account_number,
             employee_name, employee_amount, civilian_id, employee_id_type,
             process_flag, block_amount, kawadar_flag, filler)
     # remove the \n
     file_dec = file_dec[0:len(file_dec) - 1]
     fp.write(file_dec.encode('utf-8'))
     fp.seek(0)
     bank_file_name = u'مسير جماعي  شهر %s.%s' % (self.period_id.name,
                                                  'txt')
     self.bank_file = base64.encodestring(fp.read())
     self.bank_file_name = bank_file_name
     fp.close()
     return True
Exemple #24
0
def convert_hijri_to_greg(day, month, year):
    date = HijriDate(year, month, day)
    return date
Exemple #25
0
def get_today_date():
    date = HijriDate.today()
    return date
Exemple #26
0
def prayertime(lv_zones): 
    doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}})
    lv_ftzone = doc_czones_qry.get('ftzone')
    lv_txzone = ' '
    
    if lv_ftzone == 7:
        lv_txzone = 'WIB'
    elif lv_ftzone == 8:
        lv_txzone = 'WITA'
    elif lv_ftzone == 9:
        lv_txzone = 'WIT'

    utctime = datetime.datetime.utcnow()
    utctime = utctime.replace(minute=0, second=0, microsecond=0)
    localtime = utctime + datetime.timedelta(hours = lv_ftzone)

    #Getting midnight of localtime
    localtime = localtime.replace(hour=0)

    #Getting utctime for midnight of localtime
    utcbegtime = localtime + datetime.timedelta(hours = -1*lv_ftzone)
    utcendtime = utcbegtime + datetime.timedelta(hours = 24)

    #Hijri function
    hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True)

    doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)})
    lv_orihijriday = hijritime.day
    hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst')
    if int(hijritime.day) == 30:
        if doc_chijri_qry.get('f29flg') == True:
            hijritime.day = 1
            if hijritime.month == 12:
                hijritime.month = 1
                hijritime.year = hijritime.year + 1
            else:
                hijritime.month = hijritime.month + 1
    elif int(lv_orihijriday) == 1:
        if int(hijritime.month) == 1:
            doc_chijri_qry = db.chijri.find_one({"_id": 12})
        else:
            doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1})

        if doc_chijri_qry.get('f30flg') == True:
            hijritime.day = 30
            if int(hijritime.month) == 1:
                hijritime.month = 12
                hijritime.year = hijritime.year - 1
            else:
                hijritime.month = hijritime.month - 1
    #End of Hijri function

    msg = '*[Waktu Salat Hari Ini]*\n'
    msg = '{}_{}, {} {} {} | '.format(msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year)
    msg = '{}{} {} {}\n'.format(msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year))
    msg = '{}{} - {}_\n\n'.format(msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate'))
    msg = '{}```'.format(msg)

    csched_qry = db.csched.find({"_id": {"$gt": utcbegtime, "$lt": utcendtime}, "fazfor.czones_id": lv_zones}).sort("_id", 1)
    
    for doc_csched_qry in csched_qry:
        for lv_fazfor in doc_csched_qry['fazfor']:
            if lv_fazfor.get('czones_id') == lv_zones:
                localtime = doc_csched_qry.get('_id') + datetime.timedelta(hours = lv_ftzone)
                msg = '{}\n'.format(msg)
                msg = '{}{:<6} - {} {}'.format(msg, lv_fazfor.get('ftypes'), localtime.strftime('%H:%M'), lv_txzone)

    msg = '{}```\n\n'.format(msg)
    msg = '{}[https://t.me/ID_AzanBot](https://t.me/ID_AzanBot)'.format(msg)

    return msg
Exemple #27
0
def get_azan(bot, job):
    global add_job

    # Latency monitoring 1
    d1 = datetime.datetime.utcnow()

    #Manipulate UTCTime to consider lead time of data fetching
    utctime = datetime.datetime.utcnow() + datetime.timedelta(minutes = LEADTIME)
    #Testing purpose
    #utctime = datetime.datetime(2017, 7, 12, 4, 58)
    utctime = utctime.replace(second=0, microsecond=0)

    lv_mindt = job.context
    utcadjtime = utctime + datetime.timedelta(minutes = lv_mindt)

    doc_csched_qry = db.csched.find_one({"_id": utcadjtime})

    if doc_csched_qry is not None:
        for lv_fazfor in doc_csched_qry['fazfor']:
            lv_zones = lv_fazfor.get('czones_id')
            lv_ftypes = lv_fazfor.get('ftypes')
            doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}})

            lv_ftzone = doc_czones_qry.get('ftzone')
            lv_txzone = ' '

            if lv_ftzone == 7:
                lv_txzone = 'WIB'
            elif lv_ftzone == 8:
                lv_txzone = 'WITA'
            elif lv_ftzone == 9:
                lv_txzone = 'WIT'

            cusers_qry = db.cusers.find({"czones_id": lv_zones, "fdsble": False, "fblock": False})

            if cusers_qry.count() > 0:
                localtime = utcadjtime + datetime.timedelta(hours = lv_ftzone)

                #Hijri function
                hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True)

                doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)})
                lv_orihijriday = hijritime.day
                hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst')
                if int(hijritime.day) == 30:
                    if doc_chijri_qry.get('f29flg') == True:
                        hijritime.day = 1
                        if hijritime.month == 12:
                            hijritime.month = 1
                            hijritime.year = hijritime.year + 1
                        else:
                            hijritime.month = hijritime.month + 1
                elif int(lv_orihijriday) == 1:
                    if int(hijritime.month) == 1:
                        doc_chijri_qry = db.chijri.find_one({"_id": 12})
                    else:
                        doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1})

                    if doc_chijri_qry.get('f30flg') == True:
                        hijritime.day = 30
                        if int(hijritime.month) == 1:
                            hijritime.month = 12
                            hijritime.year = hijritime.year - 1
                        else:
                            hijritime.month = hijritime.month - 1
                #End of Hijri function
           
                lv_msg = ''

                if lv_ftypes != 'Imsak' and lv_ftypes != 'Terbit':
                    lv_msg = '{}*[Azan]* '.format(lv_msg)

                lv_msg = '{}`{} - {} {}`\n\n'.format(lv_msg, lv_ftypes, localtime.strftime('%H:%M'), lv_txzone)
                lv_msg = '{}_{}, {} {} {} | '.format(lv_msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year)
                lv_msg = '{}{} {} {}\n'.format(lv_msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year))
                lv_msg = '{}{} - {}_'.format(lv_msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate'))

                lv_counter = 0
                lv_second = 0

                for doc_cusers_qry in cusers_qry:
                    lv_frmndr = doc_cusers_qry.get('frmndr')
                    msgtype = 0
                    msg = ''
                    utcrmndr = utctime + datetime.timedelta(minutes = lv_frmndr)
                    if utcadjtime == utctime:
                        msgtype = 1         # Notif
                        msg = lv_msg

                    elif utcadjtime == utcrmndr and lv_frmndr > 0:
                        msgtype = 2         # Reminder
                        msg = '*[Reminder]* `{} menit menuju waktu `{}'.format(lv_frmndr, lv_msg.replace('*[Azan]* ',''))

                    if msgtype > 0:
                        chat_id = doc_cusers_qry.get('_id')
                        #Testing purpose
                        #chat_id = xxxxxxxx

                        jobtime = utctime + datetime.timedelta(seconds = lv_second)
                        
                        lv_context = []
                        lv_context.append(chat_id)
                        lv_context.append(msg)
                        lv_context.append(job.name)
                        lv_context.append(utctime)
                        lv_context.append(lv_zones)
                        
                        if lv_ftypes == 'Imsak':
                            if doc_cusers_qry.get('fimsak') == True:
                                add_job.run_once(set_azan, jobtime, context=lv_context)
                                lv_counter += 1

                        elif lv_ftypes == 'Terbit':
                            if doc_cusers_qry.get('fsyurk') == True:
                                add_job.run_once(set_azan, jobtime, context=lv_context)
                                lv_counter += 1

                        else:    
                            add_job.run_once(set_azan, jobtime, context=lv_context)
                            lv_counter += 1

                        if lv_counter%MAX_MESSAGE == 0:
                            lv_second += 1

                        # Job limit monitoring
                        #Testing purpose
                        #JOB_LIMIT = -1
                        if lv_second > JOB_LIMIT:
                            logger.error('[JOB LIMIT] Processing on {} exceeds the {}th second limit: {} seconds!'.format(utctime, JOB_LIMIT, lv_second))
                            try:
                                bot.send_message(chat_id=LOG_CHATID, text='[JOB LIMIT] Processing on {} exceeds the {}th second limit: {} seconds!'.format(utctime, JOB_LIMIT, lv_second))
                            
                            except TelegramError as e:
                                logger.error('[JOB LIMIT NOTIFICATION] Failed to send job limit notification error: {}'.format(e.message))


                        
            else:
                logger.info('No message to be sent on {} job {:<11} zone {:<4}'.format(utctime, job.name, lv_zones))
                           
    else:
        logger.info('No message to be sent on {} job {:<11}'.format(utctime, job.name))
               
    # Latency monitoring 2
    d2 = datetime.datetime.utcnow()
    lv_latency = (d2 - d1).total_seconds()
    
    #Testing purpose
    #LATENCY_LIMIT = 0
    if lv_latency > LATENCY_LIMIT:
        logger.error('[LATENCY] Processing on {} job {:<11} exceeds {} seconds limit: {} seconds!'.format(utctime, job.name, LATENCY_LIMIT, lv_latency))
        try:
            bot.send_message(chat_id=LOG_CHATID, text='[LATENCY] Processing on {} job {:<11} exceeds {} seconds limit: {} seconds!'.format(utctime, job.name, LATENCY_LIMIT, lv_latency))
        
        except TelegramError as e:
            logger.error('[LATENCY NOTIFICATION] Failed to send latency notification error: {}'.format(e.message))
Exemple #28
0
def next(bot, update):
    chat_id = update.message.chat_id
    doc_cusers_qry = db.cusers.find_one({"_id": chat_id})
    if doc_cusers_qry is not None:
        lv_zones = doc_cusers_qry.get('czones_id')
        if lv_zones is not None:
            doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}})
            lv_ftzone = doc_czones_qry.get('ftzone')
            lv_txzone = ' '
            
            if lv_ftzone == 7:
                lv_txzone = 'WIB'
            elif lv_ftzone == 8:
                lv_txzone = 'WITA'
            elif lv_ftzone == 9:
                lv_txzone = 'WIT'

            utctime = datetime.datetime.utcnow()
            localtime = utctime + datetime.timedelta(hours = lv_ftzone)
            localtime = localtime.replace(hour=0, minute=0, second=0, microsecond=0)

            #Getting midnight of localtime
#            localtime = localtime.replace(hour=0)

            #Getting utctime for midnight of localtime
#            utcbegtime = localtime + datetime.timedelta(hours = -1*lv_ftzone)
#            utcendtime = utcbegtime + datetime.timedelta(hours = 24)

            csched_qry = db.csched.find({"_id": {"$gt": utctime}, "fazfor.czones_id": lv_zones}).sort("_id", 1)
            
            msg = ''

            for doc_csched_qry in csched_qry:
                for lv_fazfor in doc_csched_qry['fazfor']:
                    if lv_fazfor.get('czones_id') == lv_zones:
                        localtime = doc_csched_qry.get('_id')
                        lv_diffs = (localtime - utctime).total_seconds()
                        localtime = localtime + datetime.timedelta(hours = lv_ftzone)                      
                        msg = '{}`{} - {} {}`\n\n'.format(msg, lv_fazfor.get('ftypes'), localtime.strftime('%H:%M'), lv_txzone)
                        break
                break

            #Hijri function
            hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True)

            doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)})
            lv_orihijriday = hijritime.day
            hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst')
            if int(hijritime.day) == 30:
                if doc_chijri_qry.get('f29flg') == True:
                    hijritime.day = 1
                    if hijritime.month == 12:
                        hijritime.month = 1
                        hijritime.year = hijritime.year + 1
                    else:
                        hijritime.month = hijritime.month + 1
            elif int(lv_orihijriday) == 1:
                if int(hijritime.month) == 1:
                    doc_chijri_qry = db.chijri.find_one({"_id": 12})
                else:
                    doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1})

                if doc_chijri_qry.get('f30flg') == True:
                    hijritime.day = 30
                    if int(hijritime.month) == 1:
                        hijritime.month = 12
                        hijritime.year = hijritime.year - 1
                    else:
                        hijritime.month = hijritime.month - 1
            #End of Hijri function

            msg = '{}_{}, {} {} {} | '.format(msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year)
            msg = '{}{} {} {}\n'.format(msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year))
            msg = '{}{} - {}_'.format(msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate'))
            
            lv_diffh = int(lv_diffs / 3600)
            lv_diffm = int((lv_diffs % 3600) / 60) + ((lv_diffs % 3600) % 60 > 0)
            if lv_diffm == 60:
                lv_diffm = 0
                lv_diffh += 1

            if lv_diffh == 0 and lv_diffm > 0:
                msg = '`{} menit menuju waktu `{}'.format(lv_diffm, msg)
            elif lv_diffh == 0 and lv_diffm == 0:
                msg = '`Tepat saat waktu `{}'.format(msg)
            elif lv_diffh > 0 and lv_diffm == 0:
                msg = '`{} jam menuju waktu `{}'.format(lv_diffh, msg)
            elif lv_diffh > 0 and lv_diffm > 0:    
                msg = '`{} jam dan {} menit menuju waktu `{}'.format(lv_diffh, lv_diffm, msg)

            update.message.reply_text(msg, parse_mode='Markdown')
        else:
            update.message.reply_text('Setting Zona belum dilakukan.\nGunakan perintah  /setting  untuk melakukan setting Zona.')   

    else:
        update.message.reply_text('Setting Zona belum dilakukan.\nGunakan perintah  /setting  untuk melakukan setting Zona.')

    if not 'test' in DBNAME:
        Botan(BOTAN_TOKEN).track(update.message, event_name='next')
Exemple #29
0
def hijri_day_range(min_date, max_date, periodic=False):
    """
    Returns one set for each day in the range
    If periodic is set to True, then it uses the day of month (31 days)

    Args:
        min_date (date): gregorian date to start the date range at
        max_date (date): gregorian date to end the date range at
        periodic (boolean): whether the date range should be periodic over the month
                            (day of week aggregation isn't handled in hijri since it
                             is the same in both calendars)
    Returns:
        {'type': 'days', 'bounds': bounds, 'date_sets': days, 'periodic': periodic}
             bounds: bounding DateRange which the date sets contain
             days: array of HijriDateSets
    """
    min_date_gr = datetime.combine(min_date, datetime.min.time())
    max_date_gr = datetime.combine(max_date, datetime.min.time())
    min_date_um = gregorian_to_hijri(min_date_gr)
    max_date_um = gregorian_to_hijri(max_date_gr)
    bounds = DateRange(start=min_date_gr, end=max_date_gr)
    years = xrange(int(min_date_um.year), int(max_date_um.year) + 1)
    days = []
    if periodic:
        days = [
            HijriDateSet(key=str(day),
                         label=[{
                             'text': str(day),
                             'translate': False
                         }],
                         ranges=[]) for day in xrange(1, 31)
        ]

    for year in years:
        max_month = 12
        if max_date_um.year == year:
            max_month = int(max_date_um.month)
        for month in xrange(int(min_date_um.month), max_month + 1):
            start_date_um = HijriDate(year, month, 1)
            if hijri_to_gregorian(min_date_um) > hijri_to_gregorian(
                    start_date_um):
                start_date_um = min_date_um

            end_year = year
            end_month = month + 1
            if end_month >= 12:
                end_year = year + 1
                end_month = 1

            end_date_um = HijriDate(end_year, end_month, 1)
            end_date_gr = hijri_to_gregorian(end_date_um)

            delta = timedelta(days=1)

            last_date_gr = end_date_gr - delta
            last_date_um = HijriDate(last_date_gr.year,
                                     last_date_gr.month,
                                     last_date_gr.day,
                                     gr=True)
            if hijri_to_gregorian(max_date_um) < hijri_to_gregorian(
                    last_date_um):
                last_date_um = max_date_um

            for day in xrange(int(start_date_um.day),
                              int(last_date_um.day) + 1):
                day_um = HijriDate(year, month, day)
                day_gr = hijri_to_gregorian(day_um)
                next_greg_day = day_gr + delta

                day_range = DateRange(start=local_tz.localize(day_gr),
                                      end=local_tz.localize(next_greg_day))
                if periodic:
                    days[day - 1].ranges.append(day_range)
                else:
                    days.append(
                        HijriDateSet(
                            key='{}/{}/{}'.format(int(day_um.day),
                                                  int(day_um.month),
                                                  int(day_um.year)),
                            label=[{
                                'text':
                                u'{} {}\u060c {}'.format(  # arabic comma
                                    int(day_um.day),
                                    day_um.month_name.decode('utf-8'),
                                    int(day_um.year)),
                                'translate':
                                False
                            }],
                            ranges=[day_range]))

    return {
        'type': 'days',
        'bounds': bounds,
        'date_sets': days,
        'periodic': periodic
    }
Exemple #30
0
def hijri_month_range(min_date, max_date, periodic=False):
    """Get an array of start and end dates for each month in the given gregorian date range.

    Date ranges have an inclusive start and exclusive end date.

    Note:
    calculate start of month as the first day of the month, converted to gregorian
    calculate end of month as the first day of the next month, converted to gregorian
    Any ranges should use GTE start, LT end

    Returns all 12 months for periodic, even if they don't have a date range

    Args:
        min_date (date): gregorian date to start the date range at
        max_date (date): gregorian date to end the date range at
        periodic (boolean): whether the date range should be periodic over the year

    Returns:
        {'type': 'months', 'bounds': bounds, 'date_sets': days, 'periodic': periodic}
             bounds: bounding DateRange which the date sets contain
             days: array of HijriDateSets
    """
    min_date = datetime.combine(min_date, datetime.min.time())
    max_date = datetime.combine(max_date, datetime.min.time())
    min_date_um = gregorian_to_hijri(min_date)
    max_date_um = gregorian_to_hijri(max_date)
    bounds = DateRange(start=min_date, end=max_date)
    years = xrange(int(min_date_um.year), int(max_date_um.year) + 1)
    months = []

    min_month = int(min_date_um.month)

    if periodic:
        months = [
            HijriDateSet(key=month_num,
                         label=[{
                             'text': month,
                             'translate': False
                         }],
                         ranges=[])
            for month, month_num in [(
                HijriDate(1437, x, 1).month_name.decode('utf-8'), x)
                                     for x in xrange(1, 13)]
        ]
        min_month = 1

    for year in years:
        for month in xrange(min_month, 13):
            start_date_um = HijriDate(year, month, 1)
            start_date_gr = hijri_to_gregorian(start_date_um)

            end_year = year
            end_month = month + 1
            if end_month > 12:
                end_year = year + 1
                end_month = 1

            end_date_um = HijriDate(end_year, end_month, 1)
            end_date_gr = hijri_to_gregorian(end_date_um)

            month_range = DateRange(start=local_tz.localize(start_date_gr),
                                    end=local_tz.localize(end_date_gr))
            if periodic:
                months[month - 1].ranges.append(month_range)
            else:
                if max_date < hijri_to_gregorian(HijriDate(year, month, 1)):
                    break
                months.append(
                    HijriDateSet(
                        key=month,
                        label=[{
                            'text':
                            u'{} {}'.format(
                                start_date_um.month_name.decode('utf-8'),
                                int(start_date_um.year)),
                            'translate':
                            False
                        }],
                        ranges=[month_range]))
        min_month = 1  # reset min_month to 1, it should only limit the first year
    return {
        'type': 'months',
        'bounds': bounds,
        'date_sets': months,
        'periodic': periodic
    }