Coverage Report

Created: 2025-08-11 06:28

/src/quantlib/ql/time/calendars/turkey.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3
/*
4
 Copyright (C) 2005 Sercan Atalik
5
 Copyright (C) 2010 StatPro Italia srl
6
 Copyright (C) 2018 Matthias Lungwitz
7
 Copyright (C) 2022 Skandinaviska Enskilda Banken AB (publ)
8
9
 This file is part of QuantLib, a free-software/open-source library
10
 for financial quantitative analysts and developers - http://quantlib.org/
11
12
 QuantLib is free software: you can redistribute it and/or modify it
13
 under the terms of the QuantLib license.  You should have received a
14
 copy of the license along with this program; if not, please email
15
 <quantlib-dev@lists.sf.net>. The license is also available online at
16
 <http://quantlib.org/license.shtml>.
17
18
 This program is distributed in the hope that it will be useful, but WITHOUT
19
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20
 FOR A PARTICULAR PURPOSE.  See the license for more details.
21
*/
22
23
#include <ql/time/calendars/turkey.hpp>
24
25
namespace QuantLib {
26
27
0
    Turkey::Turkey() {
28
        // all calendar instances share the same implementation instance
29
0
        static ext::shared_ptr<Calendar::Impl> impl(new Turkey::Impl);
30
0
        impl_ = impl;
31
0
    }
32
33
0
    bool Turkey::Impl::isWeekend(Weekday w) const {
34
0
        return w == Saturday || w == Sunday;
35
0
    }
36
37
0
    bool Turkey::Impl::isBusinessDay(const Date& date) const {
38
0
        Weekday w = date.weekday();
39
0
        Day d = date.dayOfMonth();
40
0
        Month m = date.month();
41
0
        Year y = date.year();
42
43
0
        if (isWeekend(w)
44
            // New Year's Day
45
0
            || (d == 1 && m == January)
46
            // 23 nisan / National Holiday
47
0
            || (d == 23 && m == April)
48
            // 1 may/ National Holiday
49
0
            || (d == 1 && m == May)
50
            // 19 may/ National Holiday
51
0
            || (d == 19 && m == May)
52
            // 15 july / National Holiday (since 2017)
53
0
            || (d == 15 && m == July && y >= 2017)
54
            // 30 aug/ National Holiday
55
0
            || (d == 30 && m == August)
56
            ///29 ekim  National Holiday
57
0
            || (d == 29 && m == October))
58
0
            return false;
59
60
        // Local Holidays
61
0
        if (y == 2004) {
62
            // Kurban
63
0
            if ((m == February && d <= 4)
64
            // Ramadan
65
0
                || (m == November && d >= 14 && d <= 16))
66
0
                return false;
67
0
        } else if (y == 2005) {
68
            // Kurban
69
0
            if ((m == January && d >= 19 && d <= 21)
70
            // Ramadan
71
0
                || (m == November && d >= 2 && d <= 5))
72
0
                return false;
73
0
        } else if (y == 2006) {
74
            // Kurban
75
0
            if ((m == January && d >= 10 && d <= 13)
76
            // Ramadan
77
0
                || (m == October && d >= 23 && d <= 25)
78
            // Kurban
79
0
                || (m == December && d == 31))
80
0
                return false;
81
0
        } else if (y == 2007) {
82
            // Kurban
83
0
            if ((m == January && d <= 3)
84
            // Ramadan
85
0
                || (m == October && d >= 12 && d <= 14)
86
            // Kurban
87
0
                || (m == December && d >= 20 && d <= 23))
88
0
                return false;
89
0
        } else if (y == 2008) {
90
            // Ramadan
91
0
            if ((m == September && d == 30)
92
0
                || (m == October && d <= 2)
93
            // Kurban
94
0
                || (m == December && d >= 8 && d <= 11))
95
0
                return false;
96
0
        } else if (y == 2009) {
97
            // Ramadan
98
0
            if ((m == September && d >= 20 && d <= 22)
99
            // Kurban
100
0
                || (m == November && d >= 27 && d <= 30))
101
0
                return false;
102
0
        } else if (y == 2010) {
103
            // Ramadan
104
0
            if ((m == September && d >= 9 && d <= 11)
105
            // Kurban
106
0
                || (m == November && d >= 16 && d <= 19))
107
0
                return false;
108
0
        } else if (y == 2011) {
109
            // not clear from borsainstanbul.com
110
0
            if ((m == October && d == 1)
111
0
                || (m == November && d >= 9 && d <= 13))
112
0
                return false;
113
0
        } else if (y == 2012) {
114
            // Ramadan
115
0
            if ((m == August && d >= 18 && d <= 21)
116
            // Kurban
117
0
                || (m == October && d >= 24 && d <= 28))
118
0
                return false;
119
0
        } else if (y == 2013) {
120
            // Ramadan
121
0
            if ((m == August && d >= 7 && d <= 10)
122
            // Kurban
123
0
                || (m == October && d >= 14 && d <= 18)
124
            // additional holiday for Republic Day
125
0
                || (m == October && d == 28))
126
0
                return false;
127
0
        } else if (y == 2014) {
128
            // Ramadan
129
0
            if ((m == July && d >= 27 && d <= 30)
130
            // Kurban
131
0
                || (m == October && d >= 4 && d <= 7)
132
            // additional holiday for Republic Day
133
0
                || (m == October && d == 29))
134
0
                return false;
135
0
    } else if (y == 2015) {
136
      // Ramadan
137
0
      if ((m == July && d >= 17 && d <= 19)
138
        // Kurban
139
0
        || (m == October && d >= 24 && d <= 27))
140
0
        return false;
141
0
    } else if (y == 2016) {
142
      // Ramadan
143
0
      if ((m == July && d >= 5 && d <= 7)
144
        // Kurban
145
0
        || (m == September && d >= 12 && d <= 15))
146
0
        return false;
147
0
    } else if (y == 2017) {
148
      // Ramadan
149
0
      if ((m == June && d >= 25 && d <= 27)
150
        // Kurban
151
0
        || (m == September && d >= 1 && d <= 4))
152
0
        return false;
153
0
    } else if (y == 2018) {
154
      // Ramadan
155
0
      if ((m == June && d >= 15 && d <= 17)
156
        // Kurban
157
0
        || (m == August && d >= 21 && d <= 24))
158
0
        return false;
159
0
    } else if (y == 2019) {
160
      // Ramadan
161
0
      if ((m == June && d >= 4 && d <= 6)
162
        // Kurban
163
0
        || (m == August && d >= 11 && d <= 14))
164
0
        return false;
165
0
    } else if (y == 2020) {
166
      // Ramadan
167
0
      if ((m == May && d >= 24 && d <= 26)
168
        // Kurban
169
0
        || (m == July && d == 31) || (m == August && d >= 1 && d <= 3))
170
0
        return false;
171
0
    } else if (y == 2021) {
172
      // Ramadan
173
0
      if ((m == May && d >= 13 && d <= 15)
174
        // Kurban
175
0
        || (m == July && d >= 20 && d <= 23))
176
0
        return false;
177
0
    } else if (y == 2022) {
178
      // Ramadan
179
0
      if ((m == May && d >= 2 && d <= 4)
180
        // Kurban
181
0
        || (m == July && d >= 9 && d <= 12))
182
0
        return false;
183
0
    } else if (y == 2023) {
184
      // Ramadan
185
0
      if ((m == April && d >= 21 && d <= 23)
186
        // Kurban
187
                // July 1 is also a holiday but falls on a Saturday which is already flagged
188
0
        || (m == June && d >= 28 && d <= 30))
189
0
        return false;
190
0
    } else if (y == 2024) {
191
    // Note: Holidays >= 2024 are not yet officially anounced by borsaistanbul.com
192
    // and need further validation
193
      // Ramadan
194
0
      if ((m == April && d >= 10 && d <= 12)
195
        // Kurban
196
0
        || (m == June && d >= 17 && d <= 19))
197
0
        return false;
198
0
    } else if (y == 2025) {
199
      // Ramadan
200
0
      if ((m == March && d == 31) || (m == April && d >= 1 && d <= 2)
201
        // Kurban
202
0
        || (m == June && d >= 6 && d <= 9))
203
0
        return false;
204
0
    } else if (y == 2026) {
205
      // Ramadan
206
0
      if ((m == March && d >= 20 && d <= 22)
207
        // Kurban
208
0
        || (m == May && d >= 26 && d <= 29))
209
0
        return false;
210
0
    } else if (y == 2027) {
211
      // Ramadan
212
0
      if ((m == March && d >= 10 && d <= 12)
213
        // Kurban
214
0
        || (m == May && d >= 16 && d <= 19))
215
0
        return false;
216
0
    } else if (y == 2028) {
217
      // Ramadan
218
0
      if ((m == February && d >= 27 && d <= 29)
219
        // Kurban
220
0
        || (m == May && d >= 4 && d <= 7))
221
0
        return false;
222
0
    } else if (y == 2029) {
223
      // Ramadan
224
0
      if ((m == February && d >= 15 && d <= 17)
225
        // Kurban
226
0
        || (m == April && d >= 23 && d <= 26))
227
0
        return false;
228
0
    } else if (y == 2030) {
229
      // Ramadan
230
0
      if ((m == February && d >= 5 && d <= 7)
231
        // Kurban
232
0
        || (m == April && d >= 13 && d <= 16))
233
0
        return false;
234
0
    } else if (y == 2031) {
235
      // Ramadan
236
0
      if ((m == January && d >= 25 && d <= 27)
237
        // Kurban
238
0
        || (m == April && d >= 2 && d <= 5))
239
0
        return false;
240
0
    } else if (y == 2032) {
241
      // Ramadan
242
0
      if ((m == January && d >= 14 && d <= 16)
243
        // Kurban
244
0
        || (m == March && d >= 21 && d <= 24))
245
0
        return false;
246
0
    } else if (y == 2033) {
247
      // Ramadan
248
0
      if ((m == January && d >= 3 && d <= 5) || (m == December && d == 23)
249
        // Kurban
250
0
        || (m == March && d >= 11 && d <= 14))
251
0
        return false;
252
0
    } else if (y == 2034) {
253
      // Ramadan
254
0
      if ((m == December && d >= 12 && d <= 14) 
255
        // Kurban
256
0
        || (m == February && d == 28) || (m == March && d >= 1 && d <= 3))
257
0
        return false;
258
0
    }
259
0
        return true;
260
0
    }
261
262
}
263