Example #1
0
        public void SERIALIZE18()
        {
            iCalendar iCal = new iCalendar();

            Event evt = iCal.Create <Event>();

            evt.Summary  = "Test event title";
            evt.Start    = DateTime.Today;
            evt.End      = DateTime.Today.AddDays(1);
            evt.IsAllDay = true;

            Recur rec = new Recur("FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,FR,SU;COUNT=4");

            evt.AddRecurrence(rec);

            iCalendarSerializer serializer = new iCalendarSerializer(iCal);
            string icalString = serializer.SerializeToString();

            Assert.IsNotEmpty(icalString, "iCalendarSerializer.SerializeToString() must not be empty");

            ComponentBaseSerializer compSerializer = new ComponentBaseSerializer(evt);
            string evtString = compSerializer.SerializeToString();

            Assert.IsTrue(evtString.Equals("BEGIN:VEVENT\r\nDTEND:20070320T060000Z\r\nDTSTART;VALUE=DATE:20070319\r\nDURATION:P1D\r\nRRULE:FREQ=WEEKLY;INTERVAL=3;COUNT=4;BYDAY=TU,FR,SU\r\nSUMMARY:Test event title\r\nEND:VEVENT\r\n"), "ComponentBaseSerializer.SerializeToString() serialized incorrectly");
        }
Example #2
0
        public void SERIALIZE19()
        {
            iCalendar iCal = new iCalendar();

            Event evt = iCal.Create <Event>();

            evt.Summary  = "Test event title";
            evt.Start    = new Date_Time(2007, 4, 29);
            evt.End      = evt.Start.AddDays(1);
            evt.IsAllDay = true;

            Recur rec = new Recur("FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,FR,SU;COUNT=4");

            evt.AddRecurrence(rec);

            ComponentBaseSerializer compSerializer = new ComponentBaseSerializer(evt);

            FileStream fs = new FileStream(@"Calendars\Serialization\SERIALIZE19.ics", FileMode.Create, FileAccess.Write);

            compSerializer.Serialize(fs, Encoding.UTF8);
            fs.Close();

            iCalendar iCal1 = new iCalendar();

            fs = new FileStream(@"Calendars\Serialization\SERIALIZE19.ics", FileMode.Open, FileAccess.Read);
            Event evt1 = ComponentBase.LoadFromStream <Event>(fs, Encoding.UTF8);

            fs.Close();

            CompareComponents(evt, evt1);
        }
Example #3
0
        public void SERIALIZE18()
        {
            iCalendar iCal = new iCalendar();

            Event evt = iCal.Create <Event>();

            evt.Summary    = "Test event title";
            evt.Start      = new Date_Time(2007, 3, 19);
            evt.Start.Kind = DateTimeKind.Utc;
            evt.Duration   = new TimeSpan(24, 0, 0);
            evt.Created    = evt.Start.Copy();
            evt.DTStamp    = evt.Start.Copy();
            evt.UID        = "123456789";
            evt.IsAllDay   = true;

            Recur rec = new Recur("FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,FR,SU;COUNT=4");

            evt.AddRecurrence(rec);

            iCalendarSerializer serializer = new iCalendarSerializer(iCal);
            string icalString = serializer.SerializeToString();

            Assert.IsNotEmpty(icalString, "iCalendarSerializer.SerializeToString() must not be empty");

            ComponentBaseSerializer compSerializer = new ComponentBaseSerializer(evt);
            string evtString = compSerializer.SerializeToString();

            Assert.IsTrue(evtString.Equals("BEGIN:VEVENT\r\nCREATED:20070319T000000Z\r\nDTEND:20070320T000000Z\r\nDTSTAMP:20070319T000000Z\r\nDTSTART;VALUE=DATE:20070319\r\nDURATION:P1D\r\nRRULE:FREQ=WEEKLY;INTERVAL=3;COUNT=4;BYDAY=TU,FR,SU\r\nSUMMARY:Test event title\r\nUID:123456789\r\nEND:VEVENT\r\n"), "ComponentBaseSerializer.SerializeToString() serialized incorrectly");
        }
Example #4
0
        public void UpdateNextTime()
        {
            switch (this.Recurrence)
            {
            case "Ημερήσια":
                this.NextDate = Recur.Daily().StartingFrom(this.CurrentDate).Next();
                break;

            case "Εβδομαδιαία":
                this.NextDate = Recur.Weekly().StartingFrom(this.CurrentDate).Next();
                break;

            case "Μηνιαία":
                this.NextDate = Recur.Monthly().StartingFrom(this.CurrentDate).Next();
                break;

            case "Τριμηνιαία":
                this.NextDate = Recur.Quarterly().StartingFrom(this.CurrentDate).Next();
                break;

            case "Εξαμηνιαία":
                this.NextDate = Recur.Βiannual().StartingFrom(this.CurrentDate).Next();
                break;

            case "Ετήσια":
                this.NextDate = Recur.Yearly().StartingFrom(this.CurrentDate).Next();
                break;
            }
        }
Example #5
0
 private void DetermineStartingRecurrence(Recur recur, ref Date_Time dt)
 {
     if (recur.Count != int.MinValue)
     {
         dt = DTStart.Copy();
     }
     else
     {
         recur.IncrementDate(ref dt, -recur.Interval);
     }
 }
        public HostedActionRequest Recur(Recur recur)
        {
            var xml = string.Format(@"<?xml version=""1.0"" encoding=""UTF-8""?>
                <recur>
                <customerrefno>{0}</customerrefno>
                <subscriptionid>{1}</subscriptionid>
                <currency>{2}</currency>
                <amount>{3}</amount>
                </recur >", recur.CustomerRefNo, recur.SubscriptionId, recur.Currency, recur.Amount);

            return(new HostedActionRequest(xml, CountryCode, MerchantId, ConfigurationProvider, "/recur"));
        }
        // FIXME: add similar methods for RDATE and EXDATE

        /// <summary>
        /// Adds a recurrence rule to the recurring component
        /// </summary>
        /// <param name="recur">The recurrence rule to add</param>
        public void AddRecurrence(Recur recur)
        {
            if (RRule != null)
            {
                Recur[] rules = new Recur[RRule.Length + 1];
                RRule.CopyTo(rules, 0);
                rules[rules.Length - 1] = recur;
                RRule = rules;
            }
            else
            {
                RRule = new Recur[] { recur }
            };
        }
 /// <summary>
 /// Adds an exception recurrence rule to the recurring component
 /// </summary>
 /// <param name="recur">The recurrence rule to add</param>
 public void AddException(Recur recur)
 {
     if (ExRule != null)
     {
         Recur[] rules = new Recur[ExRule.Length + 1];
         ExRule.CopyTo(rules, 0);
         rules[rules.Length - 1] = recur;
         ExRule = rules;
     }
     else
     {
         ExRule = new Recur[] { recur }
     };
 }
        public void TestRecurResponseFailure()
        {
            var responseXml = new XmlDocument();

            responseXml.LoadXml(@"<?xml version='1.0' encoding='UTF-8'?>
                        <response>
                            <statuscode>107</statuscode>
                        </response>");
            RecurResponse response = Recur.Response(responseXml);

            Assert.That(response.TransactionId, Is.Null);
            Assert.That(response.CustomerRefNo, Is.Null);
            Assert.That(response.ClientOrderNumber, Is.Null);
            Assert.That(response.StatusCode, Is.EqualTo(107));
            Assert.That(response.Accepted, Is.False);
            Assert.That(response.ErrorMessage, Is.EqualTo("Transaction rejected by bank."));
        }
        /// <summary>
        /// Adds an exception recurrence rule to the recurring component
        /// </summary>
        /// <param name="recur">The recurrence rule to add</param>
        public void AddException(Recur recur)
        {
            if (string.IsNullOrEmpty(recur.Name))
            {
                recur.Name = "EXRULE";
            }

            if (ExRule != null)
            {
                Recur[] rules = new Recur[ExRule.Length + 1];
                ExRule.CopyTo(rules, 0);
                rules[rules.Length - 1] = recur;
                ExRule = rules;
            }
            else
            {
                ExRule = new Recur[] { recur }
            };
        }
        // FIXME: add similar methods for RDATE and EXDATE

        /// <summary>
        /// Adds a recurrence rule to the recurring component
        /// </summary>
        /// <param name="recur">The recurrence rule to add</param>
        public void AddRecurrence(Recur recur)
        {
            if (string.IsNullOrEmpty(recur.Name))
            {
                recur.Name = "RRULE";
            }

            if (RRule != null)
            {
                Recur[] rules = new Recur[RRule.Length + 1];
                RRule.CopyTo(rules, 0);
                rules[rules.Length - 1] = recur;
                RRule = rules;
            }
            else
            {
                RRule = new Recur[] { recur }
            };
        }
        /// <summary>
        ///     Return all the days of the month that its
        ///     DayOfWeek is contained in the BYDAY attribute.
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> SpecialExpandMonth(this DateTime dt, Recur rule)
        {
            var cal         = CultureInfo.InvariantCulture.Calendar;
            var daysOfMonth = cal.GetDaysInMonth(dt.Year, dt.Month);
            var daysOfWeek  = rule.ByDays.Select(day => day.DayOfWeek);

            var output = new List <DateTime>(daysOfMonth);

            for (var day = 1; day <= daysOfMonth; day++)
            {
                //construct the datetime and check if the day of the week of one
                //of the specified in the BYDAY property
                var dateToAdd = new DateTime(dt.Year, dt.Month, day, dt.Hour, dt.Minute, dt.Second);
                if (daysOfWeek.Contains(dateToAdd.DayOfWeek))
                {
                    output.Add(dateToAdd);
                }
            }
            return(output);
        }
Example #13
0
        //[Test, Category("Serialization")]
        public void XCAL1()
        {
            iCalendar iCal = new iCalendar();

            Event evt = iCal.Create <Event>();

            evt.Summary  = "Test event title";
            evt.Start    = new Date_Time(2007, 4, 29);
            evt.End      = evt.Start.AddDays(1);
            evt.IsAllDay = true;

            Recur rec = new Recur("FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,FR,SU;COUNT=4");

            evt.AddRecurrence(rec);

            xCalSerializer serializer = new xCalSerializer(iCal);

            serializer.Serialize(@"Calendars\Serialization\XCAL1.xcal");

            SerializeTest("XCAL1.xcal", typeof(xCalSerializer));
        }
        public void TestRecurResponse()
        {
            var responseXml = new XmlDocument();

            responseXml.LoadXml(@"<?xml version='1.0' encoding='UTF-8'?>
                        <response>
                            <transaction id=""598972"">
                                <customerrefno>1ba66a0d653ca4cf3a5bc3eeb9ed1a2b4</customerrefno>
                                <paymentmethod>KORTCERT</paymentmethod>
                                <merchantid>1130</merchantid>
                                <amount>66600</amount>
                                <currency>SEK</currency>
                                <cardtype>VISA</cardtype>
                                <maskedcardno>12345***********1234</maskedcardno>
                                <expirymonth>07</expirymonth>
                                <expiryyear>2099</expiryyear>
                                <authcode>authcode</authcode>
                                <subscriptionid>subscriptionid</subscriptionid>
                            </transaction>
                            <statuscode>0</statuscode>
                        </response>");
            RecurResponse response = Recur.Response(responseXml);

            Assert.That(response.TransactionId, Is.EqualTo(598972));
            Assert.That(response.CustomerRefNo, Is.EqualTo("1ba66a0d653ca4cf3a5bc3eeb9ed1a2b4"));
            Assert.That(response.ClientOrderNumber, Is.EqualTo("1ba66a0d653ca4cf3a5bc3eeb9ed1a2b4"));
            Assert.That(response.PaymentMethod, Is.EqualTo("KORTCERT"));
            Assert.That(response.MerchantId, Is.EqualTo(1130));
            Assert.That(response.Amount, Is.EqualTo(666.00M));
            Assert.That(response.Currency, Is.EqualTo("SEK"));
            Assert.That(response.CardType, Is.EqualTo("VISA"));
            Assert.That(response.MaskedCardNo, Is.EqualTo("12345***********1234"));
            Assert.That(response.ExpiryMonth, Is.EqualTo("07"));
            Assert.That(response.ExpiryYear, Is.EqualTo("2099"));
            Assert.That(response.AuthCode, Is.EqualTo("authcode"));
            Assert.That(response.SubscriptionId, Is.EqualTo("subscriptionid"));
            Assert.That(response.StatusCode, Is.EqualTo(0));
            Assert.That(response.Accepted, Is.True);
            Assert.That(response.ErrorMessage, Is.Empty);
        }
Example #15
0
        public static void Main(string[] args)
        {
            string host      = "esplusqa.moneris.com";
            string store_id  = "monusqa002";
            string api_token = "qatoken";

            string data_key            = "211mA69735Un2k3AD58d9Ia";
            string order_id            = "res_purchase_7";
            string amount              = "1.00";
            string cust_id             = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be used
            string crypt_type          = "2";
            string commcard_invoice    = "invoice";
            string commcard_tax_amount = "1.00";

            USResPurchaseCC usResPurchaseCC = new USResPurchaseCC(data_key, order_id, cust_id, amount, crypt_type);

            /**********************   OPTIONAL VARIABLES  ************************/
            usResPurchaseCC.SetCommcardInvoice(commcard_invoice);
            usResPurchaseCC.SetCommcardTaxAmount(commcard_tax_amount);

            //usResPurchaseCC.SetExpdate("1601"); //must be YYMM format

            /************************* Recur Variables **********************************/

            string recur_unit   = "month";
            string start_now    = "true";
            string start_date   = "2008/12/01";
            string num_recurs   = "12";
            string period       = "1";
            string recur_amount = "30.00";

            /************************* Recur Object Option1 ******************************/

            Recur recurring_cycle = new Recur(recur_unit, start_now, start_date,
                                              num_recurs, period, recur_amount);

            usResPurchaseCC.SetRecur(recurring_cycle);

            /**********************   REQUEST  ************************/
            HttpsPostRequest mpgReq = new HttpsPostRequest(host, store_id, api_token, usResPurchaseCC);

            try
            {
                Receipt receipt = mpgReq.GetReceipt();

                Console.WriteLine("DataKey = " + receipt.GetDataKey());
                Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
                Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
                Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
                Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
                Console.WriteLine("Message = " + receipt.GetMessage());
                Console.WriteLine("TransDate = " + receipt.GetTransDate());
                Console.WriteLine("TransTime = " + receipt.GetTransTime());
                Console.WriteLine("TransType = " + receipt.GetTransType());
                Console.WriteLine("Complete = " + receipt.GetComplete());
                Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
                Console.WriteLine("CardType = " + receipt.GetCardType());
                Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
                Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
                Console.WriteLine("AVSResponse = " + receipt.GetAvsResultCode());
                Console.WriteLine("CVDResponse = " + receipt.GetCvdResultCode());
                Console.WriteLine("RecurSuccess = " + receipt.GetRecurSuccess());
                Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
                Console.WriteLine("PaymentType = " + receipt.GetPaymentType());

                //ResolveData
                Console.WriteLine("\nCust ID = " + receipt.GetResDataCustId());
                Console.WriteLine("Phone = " + receipt.GetResDataPhone());
                Console.WriteLine("Email = " + receipt.GetResDataEmail());
                Console.WriteLine("Note = " + receipt.GetResDataNote());
                Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
                Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
                Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
                Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
                Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
                Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        /// <summary>
        ///     Expand the dates to the given BYWEEKNO if FREQ=YEARLY;
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByWeekNo(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByWeekNo == null)
            {
                return(dateTimes.ApplyByYearDay(rule));
            }
            //if the FREQ is other than YEARLY then do nothing
            if (rule.Frequency != null && rule.Frequency.Value != RecurValues.Frequencies.YEARLY)
            {
                return(dateTimes.ApplyByYearDay(rule));
            }
            var cal = CultureInfo.InvariantCulture.Calendar;

            //just return the dates whos week of the year is one
            //of the specified
            var output = new List <DateTime>();

            foreach (var weekNo in rule.ByWeekNo)
            {
                output.AddRange(dateTimes.SelectMany(x => x.GenerateDayOfWeek(weekNo, rule.Wkst)));
            }

            return(output.Where(x => rule.ByWeekNo.
                                Contains(cal.GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, rule.Wkst)))
                   .ApplyByYearDay(rule));
        }
        /// <summary>
        ///     Expand the dates if FREQ=YEARLY.
        ///     Limit the dates if FREQ=SECONDLY, MINUTELY or HOURLY.
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByYearDay(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByYearDay == null ||
                rule.Frequency.Value == RecurValues.Frequencies.DAILY ||
                rule.Frequency.Value == RecurValues.Frequencies.WEEKLY ||
                rule.Frequency.Value == RecurValues.Frequencies.MONTHLY)
            {
                return(dateTimes.ApplyByMonthDay(rule));
            }

            //limit the dateTImes if the FREQ is set to SECONDLY, MINUTELY or HOURLY
            if (rule.Frequency.Value == RecurValues.Frequencies.MINUTELY ||
                rule.Frequency.Value == RecurValues.Frequencies.HOURLY ||
                rule.Frequency.Value == RecurValues.Frequencies.SECONDLY) //TODO:NEAGATIVE number
            {
                return(dateTimes.Where(x => rule.ByYearDay.Contains(x.DayOfYear)).ApplyByMonthDay(rule));
            }

            //expand the datetimes if the FREQ is set to YEARLY
            var output = new List <DateTime>();

            foreach (var dateTime in dateTimes)
            {
                foreach (var day in rule.ByYearDay)
                {
                    //if the day is negative then create the ref date the the last day of the year,
                    //otherwise create it to the first day
                    var refDate = day > 0
                        ? new DateTime(dateTime.Year, 1, 1, dateTime.Hour, dateTime.Minute, dateTime.Second)
                        : new DateTime(dateTime.Year, 12, 31, dateTime.Hour, dateTime.Minute, dateTime.Second);
                    output.Add(refDate.AddDays(day - 1));
                }
            }


            return(output.ApplyByMonthDay(rule));
        }
        public static void Main(string[] args)
        {
            string host      = "esplusqa.moneris.com";
            string order_id  = "dotnetachdebitrecurtest12323";
            string store_id  = "monusqa002";
            string api_token = "qatoken";
            string amount    = "1.00";

            //ACHInfo Variables
            string sec             = "pop";
            string cust_first_name = "Bob";
            string cust_last_name  = "Smith";
            string cust_address1   = "3300 Bloor St W";
            string cust_address2   = "4th floor west tower";
            string cust_city       = "Toronto";
            string cust_state      = "ON";
            string cust_zip        = "M1M1M1";
            string routing_num     = "490000018";
            string account_num     = "222222";
            string check_num       = "11";
            string account_type    = "checking";
            string micr            = "t071000013t742941347o128";
            string dl_num          = "CO-12312312";
            string magstripe       = "no";
            string image_front     = "";
            string image_back      = "";


            ACHInfo achinfo = new ACHInfo(sec, cust_first_name, cust_last_name,
                                          cust_address1, cust_address2, cust_city, cust_state, cust_zip,
                                          routing_num, account_num, check_num, account_type, micr);


            achinfo.SetImgFront(image_front);
            achinfo.SetImgBack(image_back);
            achinfo.SetDlNum(dl_num);
            achinfo.SetMagstripe(magstripe);

            ACHDebit achdebit = new ACHDebit(order_id, amount, achinfo);

            //************************OPTIONAL VARIABLES***************************

            //Cust_id Variable
            string cust_id = "customer1";

            achdebit.SetCustId(cust_id);

            //Recur Variables
            //hard coded values for testing
            string recur_unit   = "month"; //valid values are (day,week,month)
            string start_now    = "true";  //valid values are (true,false)
            string start_date   = "2008/10/01";
            string num_recurs   = "12";
            string period       = "1";
            string recur_amount = "1.01";

            Recur recurInfo = new Recur(recur_unit, start_now, start_date, num_recurs, period, recur_amount);

            achdebit.SetRecur(recurInfo);

            ACHHttpsPostRequest mpgReq = new ACHHttpsPostRequest(host, store_id, api_token, achdebit);

            /**********************   REQUEST  ************************/

            try
            {
                Receipt receipt = mpgReq.GetReceipt();

                Console.WriteLine("CardType = " + receipt.GetCardType());
                Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
                Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
                Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
                Console.WriteLine("TransType = " + receipt.GetTransType());
                Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
                Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
                Console.WriteLine("Message = " + receipt.GetMessage());
                Console.WriteLine("Complete = " + receipt.GetComplete());
                Console.WriteLine("TransDate = " + receipt.GetTransDate());
                Console.WriteLine("TransTime = " + receipt.GetTransTime());
                Console.WriteLine("Ticket = " + receipt.GetTicket());
                Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        /// <summary>
        ///     This is the most complicated method.
        ///     Refer to RFC 5545, pg. 41.
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByDay(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByDays == null)
            {
                return(dateTimes.ApplyByHour(rule));
            }


            var daysOfWeek = rule.ByDays.Select(day => day.DayOfWeek).ToArray();

            //limit the dateTImes if the FREQ is set to SECONDLY, MINUTELY or HOURLY
            if (rule.Frequency.Value == RecurValues.Frequencies.MINUTELY ||
                rule.Frequency.Value == RecurValues.Frequencies.HOURLY ||
                rule.Frequency.Value == RecurValues.Frequencies.SECONDLY ||
                rule.Frequency.Value == RecurValues.Frequencies.DAILY)
            {
                return(dateTimes.Where(dateTime =>
                                       daysOfWeek.Contains(dateTime.DayOfWeek)).
                       ApplyByHour(rule));
            }

            //Limit if BYYEARDAY or BYMONTHDAY is present; otherwise
            if (rule.Frequency.Value == RecurValues.Frequencies.YEARLY)
            {
                if (rule.ByYearDay != null || rule.ByMonthDay != null)
                {
                    return(dateTimes.Where(x => daysOfWeek.Contains(x.DayOfWeek))
                           .ApplyByHour(rule));
                }
                //special expand for WEEKLY if BYWEEKNO present;
                else if (rule.ByWeekNo != null)
                {
                    return(dateTimes.Where(x => daysOfWeek.Contains(x.DayOfWeek))
                           .ApplyByHour(rule));
                }
            }
            //special expand for MONTHLY if BYMONTH present;
            //else if (rule.ByMonth != null)
            //    return dateTimes.Where(x => daysOfWeek.Contains(x.DayOfWeek))
            //       .ApplyByHour(rule);

            //expand the dts to the given days of the week
            var output = new List <DateTime>();
            var cal    = CultureInfo.InvariantCulture.Calendar;

            foreach (var dt in dateTimes)
            {
                switch (rule.Frequency.Value)
                {
                case RecurValues.Frequencies.WEEKLY:
                    var weekNum = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, rule.Wkst);
                    var result  = dt.GenerateDayOfWeek(weekNum, rule.Wkst);
                    output.AddRange(result.Where(r => daysOfWeek.Contains(r.DayOfWeek)));
                    break;

                case RecurValues.Frequencies.YEARLY:

                    //corresponds to an offset within the year when the
                    //BYWEEKNO or BYMONTH rule parts are present.
                    if (rule.ByWeekNo != null)
                    {
                        output.AddRange(dt.ExpandYearByDay(rule));
                    }
                    //corresponds to an offset within the
                    //month when the BYMONTH rule part is present
                    if (rule.ByMonth != null)
                    {
                        if (rule.ByDays.Any(x => x.OrdDay != null))
                        {
                            output.AddRange(dt.SpecialExpandMonthDayWithInt(rule));
                        }
                        else
                        {
                            output.AddRange(dt.SpecialExpandMonth(rule));
                        }
                    }
                    else
                    {
                        output.AddRange(dt.ExpandYearByDay(rule));
                    }
                    break;

                case RecurValues.Frequencies.MONTHLY:
                    //Limit if BYMONTHDAY is present;
                    if (rule.ByMonthDay != null)
                    {
                        if (daysOfWeek.Contains(dt.DayOfWeek))
                        {
                            output.Add(dt);
                        }
                        continue;
                    }
                    //if the BYDAYS contains integers then
                    if (rule.ByDays.Any(x => x.OrdDay != null))
                    {
                        output.AddRange(dt.SpecialExpandMonthDayWithInt(rule));
                    }
                    else
                    {
                        output.AddRange(dt.SpecialExpandMonth(rule));
                    }
                    break;
                }
            }

            return(output.ApplyByHour(rule));
        }
        public static void Main(string[] args)
        {
            string host      = "esplusqa.moneris.com";
            string store_id  = "monusqa002";
            string api_token = "qatoken";

            string data_key         = "1X07zf118J5g7QESF421G27";
            string order_id         = "res_purchase_pinless_4";
            string amount           = "1.00";
            string cust_id          = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be used
            string intended_use     = "1";
            string p_account_number = "23456789";

            USResPurchasePinless usResPurchasePinless = new USResPurchasePinless(data_key, order_id, cust_id, amount,
                                                                                 intended_use);

            usResPurchasePinless.SetPAccountNumber(p_account_number);

            /************************* Recur Variables **********************************/

            string recur_unit   = "month";
            string start_now    = "true";
            string start_date   = "2008/12/01";
            string num_recurs   = "12";
            string period       = "1";
            string recur_amount = "30.00";

            /************************* Recur Object Option1 ******************************/

            Recur recurring_cycle = new Recur(recur_unit, start_now, start_date,
                                              num_recurs, period, recur_amount);

            usResPurchasePinless.SetRecur(recurring_cycle);

            HttpsPostRequest mpgReq = new HttpsPostRequest(host, store_id, api_token, usResPurchasePinless);

            /**********************   REQUEST  ************************/

            try
            {
                Receipt receipt = mpgReq.GetReceipt();

                Console.WriteLine("DataKey = " + receipt.GetDataKey());
                Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
                Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
                Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
                Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
                Console.WriteLine("Message = " + receipt.GetMessage());
                Console.WriteLine("TransDate = " + receipt.GetTransDate());
                Console.WriteLine("TransTime = " + receipt.GetTransTime());
                Console.WriteLine("TransType = " + receipt.GetTransType());
                Console.WriteLine("Complete = " + receipt.GetComplete());
                Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
                Console.WriteLine("CardType = " + receipt.GetCardType());
                Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
                Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
                Console.WriteLine("RecurSuccess = " + receipt.GetRecurSuccess());
                Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
                Console.WriteLine("PaymentType = " + receipt.GetPaymentType());

                //ResolveData
                Console.WriteLine("\nCust ID = " + receipt.GetResDataCustId());
                Console.WriteLine("Phone = " + receipt.GetResDataPhone());
                Console.WriteLine("Email = " + receipt.GetResDataEmail());
                Console.WriteLine("Note = " + receipt.GetResDataNote());
                Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
                Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
                Console.WriteLine("Presentation Type = " + receipt.GetResDataPresentationType());
                Console.WriteLine("P Account Number = " + receipt.GetResDataPAccountNumber());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
Example #21
0
        /// <summary>
        ///     Try to parse an string into a Recur valueType.
        ///     In case of return false it mitgh be that it does not contain Frequency
        ///     but the rest of proerties would be asignated to the out value;
        /// </summary>
        /// <param name="stringRecut"></param>
        /// <param name="resRecur"></param>
        /// <returns></returns>
        public static bool ToRecur(this string stringRecut, out Recur resRecur)
        {
            resRecur = new Recur();
            //when the user calls this method directly it comes
            //with the name of the property (RRULE)
            if (stringRecut.Contains(":"))
            {
                stringRecut = stringRecut.ValuesSubString().Replace(":", "");
            }
            var value = stringRecut.Split(';').ToList();

            #region ForeachRegion

            foreach (var nameValue in value.Select(recurValue => recurValue.Split('=')))
            {
                switch (nameValue[0])
                {
                case "FREQ":
                    resRecur.Frequency = RecurValues.ParseValue(nameValue[1]);
                    break;

                case "UNTIL":
                    DateTime?untilDate;
                    resRecur.Until = nameValue[1].ToDateTime(out untilDate) && resRecur.Count == null
                            ? untilDate
                            : null;
                    break;

                case "COUNT":
                    resRecur.Count = resRecur.Until == null ? nameValue[1].ToInt() : null;
                    break;

                case "INTERVAL":
                    resRecur.Interval = nameValue[1].ToInt();
                    break;

                case "BYSECOND":
                    var seconds = ToIntArray(nameValue[1].Split(','));
                    if (seconds.Length > 0)
                    {
                        resRecur.BySeconds = seconds;
                    }
                    break;

                case "BYMINUTE":
                    var minutes = ToIntArray(nameValue[1].Split(','));
                    if (minutes.Length > 0)
                    {
                        resRecur.ByMinutes = minutes;
                    }
                    break;

                case "BYHOUR":
                    var hours = ToIntArray(nameValue[1].Split(','));
                    if (hours.Length > 0)
                    {
                        resRecur.ByHours = hours;
                    }
                    break;

                case "BYDAY":

                    var temp     = nameValue[1].Split(',');
                    var wekkDays = new List <WeekDayType>();
                    foreach (var val in temp)
                    {
                        var match = RxWeekDayType.Match(val);
                        if (match.Success)
                        {
                            var signInt = 1;
                            if (match.Groups[1].Value == "-")
                            {
                                signInt = -1;
                            }

                            int?resInt = match.Groups[2].Value.ToInt();
                            resInt = resInt != null ? resInt * signInt : null;
                            DayOfWeek day;
                            if (RecurValues.TryParseValue(match.Groups[3].Value, out day))
                            {
                                wekkDays.Add(new WeekDayType(resInt, day));
                            }
                        }
                    }
                    if (wekkDays != null && wekkDays.Count > 0)
                    {
                        resRecur.ByDays = wekkDays.ToArray();
                    }

                    break;

                case "BYMONTHDAY":
                    var monthDay = ToIntArray(nameValue[1].Split(','));
                    if (monthDay.Length > 0)
                    {
                        resRecur.ByMonthDay = monthDay;
                    }
                    break;

                case "BYYEARDAY":
                    var yearDay = ToIntArray(nameValue[1].Split(','));
                    if (yearDay.Length > 0)
                    {
                        resRecur.ByYearDay = yearDay;
                    }
                    break;

                case "BYWEEKNO":
                    var weekNo = ToIntArray(nameValue[1].Split(','));
                    if (weekNo.Length > 0)
                    {
                        resRecur.ByWeekNo = weekNo;
                    }
                    break;

                case "BYMONTH":
                    var month = ToIntArray(nameValue[1].Split(','));
                    if (month.Length > 0)
                    {
                        resRecur.ByMonth = month;
                    }
                    break;

                case "BYSETPOS":
                    var setpos = ToIntArray(nameValue[1].Split(','));
                    if (setpos.Length > 0)
                    {
                        resRecur.BySetPos = setpos;
                    }
                    break;

                case "WKST":
                    resRecur.Wkst = RecurValues.ParseValues(nameValue[1]);
                    break;

                default:
                    continue;
                }
            }

            #endregion ForeachRegion

            return(resRecur.Frequency != null);
        }
        /// <summary>
        ///     Limit if FREQ=SECONDLY
        ///     Expand to the given seconds otherwise.
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyBySecond(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.BySeconds == null)
            {
                return(dateTimes.ApplyBySetPos(rule));
            }

            // TODO: add the SECONDLY
            if (rule.Frequency.Value == RecurValues.Frequencies.SECONDLY)
            {
                return(dateTimes.Where(dt => rule.ByMinutes.Contains(dt.Minute)).ApplyBySecond(rule));
            }

            var output = new List <DateTime>();

            foreach (var dt in dateTimes)
            {
                //generate a dt per each dt and each given hour
                output.AddRange(rule.BySeconds
                                .Select(second => new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, second)));
            }

            return(output.ApplyBySetPos(rule));
        }
        /// <summary>
        ///     Expand to the given minutes if FREQ=HOUTLY..YEARLY
        ///     Limit otherwise.
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByMinute(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByMinutes == null)
            {
                return(dateTimes.ApplyBySecond(rule));
            }

            //limit the dateTImes if the FREQ is set to SECONDLY or MINUTELY //TODO: add the SECONDLY condition
            if (rule.Frequency.Value == RecurValues.Frequencies.MINUTELY)
            {
                return(dateTimes.Where(dt => rule.ByMinutes.Contains(dt.Minute)).ApplyBySecond(rule));
            }


            //expand
            var output = new List <DateTime>();

            foreach (var dt in dateTimes)
            {
                //generate a dt per each dt and each given hour
                output.AddRange(rule.ByMinutes
                                .Select(minute => new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, minute, dt.Second)));
            }

            return(output.ApplyBySecond(rule));
        }
        //TODO: Ver Adriano
        /// <summary>
        ///     Expand the dates dependending on the FREQ and the INTERVAL
        ///     of the property.
        /// </summary>
        /// <param name="dateTime"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyFrequency(this DateTime dateTime, Recur rule)
        {
            //limit the COunt and Ultil if are not specified
            var count = rule.Count ?? 1000;
            var until = rule.Until ?? dateTime.AddYears(10);

            var output = new List <DateTime> {
                dateTime
            };
            var genDTs   = new List <DateTime>();
            var freq     = rule.Frequency.Value;
            var interval = rule.Interval ?? 1;

            //gonna create as dates as the count specify
            for (var i = 0; i < count - 1; i++)
            {
                //take the last added item and work with it
                var lastestDate = output.Last();
                //if reach the max date the return
                if (lastestDate >= until)
                {
                    output.RemoveAt(output.Count - 1);
                    break;
                }

                switch (freq)
                {
                case RecurValues.Frequencies.DAILY:
                    output.Add(lastestDate.AddDays(interval));
                    break;

                case RecurValues.Frequencies.WEEKLY:
                    output.Add(lastestDate.AddDays(7 * interval));
                    break;

                case RecurValues.Frequencies.MONTHLY:
                    output.Add(lastestDate.AddMonths(interval));
                    break;

                case RecurValues.Frequencies.YEARLY:
                    output.Add(lastestDate.AddYears(interval));
                    break;

                case RecurValues.Frequencies.HOURLY:
                    output.Add(lastestDate.AddHours(interval));
                    break;

                case RecurValues.Frequencies.MINUTELY:
                    output.Add(lastestDate.AddMinutes(interval));
                    break;

                case RecurValues.Frequencies.SECONDLY:
                    output.Add(lastestDate.AddSeconds(interval));
                    break;
                }
            }
            var result = output.ApplyByMonth(rule);

            //remove the datetimes before the DTSTART
            result = result.Where(x => x >= dateTime);
            //apply the last evaluations
            //the number of item have to be the first COUNT item
            result = result.Take(count);

            //the dts have to be less than the UNTIL value
            return(result.Where(x => x <= until));
        }
        public static void Main(string[] args)
        {
            /********************* Post Request Variables ********************************/

            string host = "esqa.moneris.com";
            string store_id = "store5";
            string api_token = "yesguy";

            /********************* Transactional Variables *******************************/

            string order_id = "Need_Unique_Order_ID";
            string amount = "10.00";
            string pan = "4242424242424242";
            string expiry_date = "0812";
            string crypt = "7";

            /************************* Recur Variables **********************************/

            string recur_unit = "month"; //eom = end of month
            string start_now = "true";
            string start_date = "2006/07/28";
            string num_recurs = "12";
            string period = "1";
            string recur_amount = "30.00";

            /************************* Recur Object Option1 ******************************/

            Recur recurring_cycle = new Recur (recur_unit, start_now, start_date,
                               num_recurs, period, recur_amount);

            /************************* Recur Object Option2 ******************************/

            Hashtable recur_hash = new Hashtable();

            recur_hash.Add ("recur_unit", recur_unit);
            recur_hash.Add ("start_now", start_now);
            recur_hash.Add ("start_date", start_date);
            recur_hash.Add ("num_recurs", num_recurs);
            recur_hash.Add ("period", period);
            recur_hash.Add ("recur_amount", recur_amount);

            Recur recurring_cycle2 = new Recur (recur_hash);

            /************************ Transactional Object *******************************/

            Purchase purchase = new Purchase (order_id, amount, pan, expiry_date, crypt);

            /******************************* Set Recur ***********************************/

            purchase.SetRecur (recurring_cycle);

            /**************************** Https Post Request ***************************/

            HttpsPostRequest mpgReq =
                new HttpsPostRequest(host, store_id, api_token, purchase);

            /******************************* Receipt ***********************************/

            try
            {
                Receipt receipt = mpgReq.GetReceipt();

             	Console.WriteLine("CardType = " + receipt.GetCardType());
                Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
                Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
                Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
                Console.WriteLine("TransType = " + receipt.GetTransType());
                Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
                Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
                Console.WriteLine("ISO = " + receipt.GetISO());
                Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
                Console.WriteLine("Message = " + receipt.GetMessage());
                Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
                Console.WriteLine("Complete = " + receipt.GetComplete());
                Console.WriteLine("TransDate = " + receipt.GetTransDate());
                Console.WriteLine("TransTime = " + receipt.GetTransTime());
                Console.WriteLine("Ticket = " + receipt.GetTicket());
                Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
                Console.WriteLine("Recur Success = " + receipt.GetRecurSuccess());
                Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        /// <summary>
        ///     Expand the dates to the given months
        ///     in BYMONTH if FREQ=YEARLY, otherwise
        ///     limit the dates to the given months
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByMonth(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByMonth == null)
            {
                return(dateTimes.ApplyByWeekNo(rule));
            }

            /* List<DateTime> daysOfMonths = new List<DateTime>();
             */
            var cal    = CultureInfo.InvariantCulture.Calendar;
            var output = new List <DateTime>();

            //generate all the days for the given months
            //if the FREQ rule is YEARLY
            if (rule.Frequency.Value == RecurValues.Frequencies.YEARLY)
            {
                foreach (var dt in dateTimes)
                {
                    foreach (var month in rule.ByMonth)
                    {
                        var dateToAdd = new DateTime(dt.Year, month, dt.Day, dt.Hour, dt.Minute, dt.Second);
                        output.Add(dateToAdd);
                    }
                }
                return(output.ApplyByWeekNo(rule));
            }
            //limit the dateTimes to those that have the month
            //equal to any of the given months if the FREQ is not YEARLY
            return(dateTimes.Where(x => rule.ByMonth.Contains(x.Month)).ApplyByWeekNo(rule));
        }
Example #27
0
        public static void Main(string[] args)
        {
            string host      = "esplusqa.moneris.com";
            string store_id  = "monusqa002";
            string api_token = "qatoken";

            string data_key = "1sZH2p215HdQV6l6909x217";
            string order_id = "res_puchase_ach_3";
            string amount   = "1.00";
            string cust_id  = "customer1";

            USResPurchaseAch usResPurchaseAch = new USResPurchaseAch(data_key, order_id, cust_id, amount);

            /************************* Recur Variables **********************************/

            string recur_unit   = "month";
            string start_now    = "true";
            string start_date   = "2008/12/01";
            string num_recurs   = "12";
            string period       = "1";
            string recur_amount = "30.00";

            /************************* Recur Object Option1 ******************************/

            Recur recurring_cycle = new Recur(recur_unit, start_now, start_date,
                                              num_recurs, period, recur_amount);

            usResPurchaseAch.SetRecur(recurring_cycle);

            HttpsPostRequest mpgReq = new HttpsPostRequest(host, store_id, api_token, usResPurchaseAch);

            /**********************   REQUEST  ************************/

            try
            {
                Receipt receipt = mpgReq.GetReceipt();

                Console.WriteLine("DataKey = " + receipt.GetDataKey());
                Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
                Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
                Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
                Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
                Console.WriteLine("Message = " + receipt.GetMessage());
                Console.WriteLine("TransDate = " + receipt.GetTransDate());
                Console.WriteLine("TransTime = " + receipt.GetTransTime());
                Console.WriteLine("TransType = " + receipt.GetTransType());
                Console.WriteLine("Complete = " + receipt.GetComplete());
                Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
                Console.WriteLine("CardType = " + receipt.GetCardType());
                Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
                Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
                Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
                Console.WriteLine("PaymentType = " + receipt.GetPaymentType());

                //ResolveData
                Console.WriteLine("\nCust ID = " + receipt.GetResDataCustId());
                Console.WriteLine("Phone = " + receipt.GetResDataPhone());
                Console.WriteLine("Email = " + receipt.GetResDataEmail());
                Console.WriteLine("Note = " + receipt.GetResDataNote());
                Console.WriteLine("Sec = " + receipt.GetResDataSec());
                Console.WriteLine("Cust First Name = " + receipt.GetResDataCustFirstName());
                Console.WriteLine("Cust Last Name = " + receipt.GetResDataCustLastName());
                Console.WriteLine("Cust Address 1 = " + receipt.GetResDataCustAddress1());
                Console.WriteLine("Cust Address 2 = " + receipt.GetResDataCustAddress2());
                Console.WriteLine("Cust City = " + receipt.GetResDataCustCity());
                Console.WriteLine("Cust State = " + receipt.GetResDataCustState());
                Console.WriteLine("Cust Zip = " + receipt.GetResDataCustZip());
                Console.WriteLine("Routing Num = " + receipt.GetResDataRoutingNum());
                Console.WriteLine("Masked Account Num = " + receipt.GetResDataMaskedAccountNum());
                Console.WriteLine("Check Num = " + receipt.GetResDataCheckNum());
                Console.WriteLine("Account Type = " + receipt.GetResDataAccountType());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        /// <summary>
        ///     Return all days in the month that its
        ///     DayOfWeek is contained in the  BYDAY attribute and
        ///     its number os ocurrence in the month is the especified
        ///     in the values(i.e: BYDAY=1MO,-1MO).
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> SpecialExpandMonthDayWithInt(this DateTime dt, Recur rule)
        {
            var cal         = CultureInfo.InvariantCulture.Calendar;
            var daysOfMonth = cal.GetDaysInMonth(dt.Year, dt.Month);
            var daysOfWeek  = rule.ByDays;

            var output = new List <DateTime>(daysOfMonth);

            //Contains the ocurrence number of the DayOfWeek of the especific datetime
            var dayOfWeekOcurrence = new Dictionary <DateTime, int>();

            //Contains the count of ocurrences in the month of the DayOfWeek key
            var daysOfWeekCount = new Dictionary <DayOfWeek, int>(7)
            {
                { DayOfWeek.Sunday, 0 },
                { DayOfWeek.Monday, 0 },
                { DayOfWeek.Tuesday, 0 },
                { DayOfWeek.Wednesday, 0 },
                { DayOfWeek.Thursday, 0 },
                { DayOfWeek.Friday, 0 },
                { DayOfWeek.Saturday, 0 }
            };


            for (var day = 1; day <= daysOfMonth; day++)
            {
                //initialize the dict that contains the DayOfWeeks count
                //and the ocurrence number in the month of that value
                var dtToAdd = new DateTime(dt.Year, dt.Month, day, dt.Hour, dt.Minute, dt.Second);
                dayOfWeekOcurrence.Add(dtToAdd, daysOfWeekCount[dtToAdd.DayOfWeek] + 1);
                daysOfWeekCount[dtToAdd.DayOfWeek] += 1;
            }

            //iterate over the datetimes and see if its DayOfWeek
            //is one of the given in the rule.BYDAY
            foreach (var dateTime in dayOfWeekOcurrence.Keys)
            {
                foreach (var wDay in daysOfWeek)
                {
                    //if the wDay integer is positive and is the same of the current dateTime
                    //and its DayOfWeek is the same of wDay then add it
                    if (wDay.OrdDay.Value > 0)
                    {
                        if (dateTime.DayOfWeek == wDay.DayOfWeek &&
                            dayOfWeekOcurrence[dateTime] == wDay.OrdDay.Value)
                        {
                            output.Add(dateTime);
                        }
                    }


                    //if is negative and the occurrence of the DayOfWeek value
                    //match with one of the specified in BYDAY
                    else if (dateTime.DayOfWeek == wDay.DayOfWeek &&
                             daysOfWeekCount[dateTime.DayOfWeek] - dayOfWeekOcurrence[dateTime] + 1 ==
                             wDay.OrdDay.Value * -1)
                    {
                        output.Add(dateTime);
                    }
                }
            }

            return(output);
        }
        /// <summary>
        ///     /Expand the dates if FREQ=YEARLY or MONTHLY.
        ///     Do nothing if FREQ=WEEKLY
        ///     Limit otherwise.
        /// </summary>
        /// <param name="dateTimes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ApplyByMonthDay(this IEnumerable <DateTime> dateTimes, Recur rule)
        {
            if (rule.ByMonthDay == null || rule.Frequency.Value == RecurValues.Frequencies.WEEKLY)
            {
                return(dateTimes.ApplyByDay(rule));
            }
            var cal = CultureInfo.InvariantCulture.Calendar;

            //limit the dateTImes if the FREQ is set to SECONDLY, MINUTELY or HOURLY or DAYLY
            if (rule.Frequency.Value != RecurValues.Frequencies.MONTHLY &&
                rule.Frequency.Value != RecurValues.Frequencies.YEARLY)
            {
                return(dateTimes.Where(dateTime =>
                {
                    //if the givens ByMonthDay are negative then
                    //subtract it to the total days of the month
                    var tempDays = rule.ByMonthDay.Select(dayOfMonth =>
                    {
                        //if the day is positive dont do nothing
                        if (dayOfMonth > 0)
                        {
                            return dayOfMonth;
                        }
                        //if the day is negative then substract it to the
                        //count of days in the month
                        var daysInMonth = cal.GetDaysInMonth(dateTime.Year, dateTime.Month);
                        var day = daysInMonth + dayOfMonth;
                        //if the result day is not in the range of the month then dismiss it
                        if (day < 0 || day > daysInMonth)
                        {
                            return -1;
                        }
                        return day;
                    });
                    return tempDays.Contains(dateTime.Day);
                }).ApplyByDay(rule));
            }

            //if the FREQ is MONTHLY or YEARLY then expand
            var output = new List <DateTime>();

            foreach (var dateTime in dateTimes)
            {
                var daysInMonth = cal.GetDaysInMonth(dateTime.Year, dateTime.Month);
                //if the givens ByMonthDay are negative then
                //subtract it to the total days of the month
                var tempDays = rule.ByMonthDay.Select(dayOfMonth =>
                {
                    //if the day is positive dont do nothing
                    if (dayOfMonth > 0)
                    {
                        return(dayOfMonth);
                    }
                    //if the day is negative then substract it to the
                    //count of days in the month
                    var day = daysInMonth + dayOfMonth + 1;
                    //if the result day is not in the range of the month then dismiss it
                    if (day < 0)
                    {
                        return(-1);
                    }
                    return(day);
                }).Where(x => x >= 0 && x < daysInMonth);
                output.AddRange(tempDays.Select(day => new DateTime(dateTime.Year, dateTime.Month, day,
                                                                    dateTime.Hour, dateTime.Minute, dateTime.Second)));
            }
            return(output.ApplyByDay(rule));
        }
 //TODO:IMplement this!!!
 /// <summary>
 ///     Limit the recurrence number specified in the BYSETPOS attribute.
 ///     Isnt implemented yet till I know more about it.
 /// </summary>
 /// <param name="dateTimes"></param>
 /// <param name="rule"></param>
 /// <returns></returns>
 private static IEnumerable <DateTime> ApplyBySetPos(this IEnumerable <DateTime> dateTimes, Recur rule)
 {
     if (rule.BySetPos == null)
     {
         return(dateTimes);
     }
     throw new NotImplementedException("THe rule isnt implemented yet :(.");
 }
        /// <summary>
        ///     Return all the days of the month that its
        ///     DayOfWeek is contained in the specified BYDAY when these contains
        ///     ordinary values (i.e: BYDAY=1MO,-1MO).
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="rule"></param>
        /// <returns></returns>
        private static IEnumerable <DateTime> ExpandYearByDay(this DateTime dt, Recur rule)
        {
            var cal        = CultureInfo.InvariantCulture.Calendar;
            var daysOfYear = cal.GetDaysInYear(dt.Year);
            var daysOfWeek = rule.ByDays;

            var output = new List <DateTime>();

            //Contains the ocurrence number of the DayOfWeek of the especific datetime
            var dayOfWeekOcurrence = new Dictionary <DateTime, int>();

            //Contains the count of ocurrence of the DayOfWeek
            var daysOfWeekCount = new Dictionary <DayOfWeek, int>(7)
            {
                { DayOfWeek.Sunday, 0 },
                { DayOfWeek.Monday, 0 },
                { DayOfWeek.Tuesday, 0 },
                { DayOfWeek.Wednesday, 0 },
                { DayOfWeek.Thursday, 0 },
                { DayOfWeek.Friday, 0 },
                { DayOfWeek.Saturday, 0 }
            };

            var yearStartDate = new DateTime(dt.Year, 1, 1, dt.Hour, dt.Minute, dt.Second);
            var currentDate   = yearStartDate;

            for (var days = 0; days < daysOfYear; days++)
            {
                //construct the datetime and check if the day of the week of one
                //of the specified in the BYDAY property
                currentDate = yearStartDate.AddDays(days);
                dayOfWeekOcurrence.Add(currentDate, daysOfWeekCount[currentDate.DayOfWeek] + 1);
                daysOfWeekCount[currentDate.DayOfWeek] += 1;
            }

            //iterate over the datetimes and see if its DayOfWeek
            //is one of the given in the rule.BYDAY
            foreach (var dateTime in dayOfWeekOcurrence.Keys)
            {
                foreach (var wDay in daysOfWeek)
                {
                    //if the wDay integer is positive and is the same of the current dateTime
                    //and its DayOfWeek is the same of wDay then add it
                    if (wDay.OrdDay.Value > 0)
                    {
                        if (dateTime.DayOfWeek == wDay.DayOfWeek &&
                            dayOfWeekOcurrence[dateTime] == wDay.OrdDay.Value)
                        {
                            output.Add(dateTime);
                        }
                        else
                        {
                            continue;
                        }
                    }

                    //if is negative and the total count of datetime.DayOfWeek
                    else if (dateTime.DayOfWeek == wDay.DayOfWeek &&
                             daysOfWeekCount[dateTime.DayOfWeek] - dayOfWeekOcurrence[dateTime] + 1 ==
                             wDay.OrdDay.Value * -1)
                    {
                        output.Add(dateTime);
                    }
                }
            }

            return(output);
        }