borsajs 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,12 @@ import { TTL } from '../cache.js';
7
7
  import { APIError } from '../exceptions.js';
8
8
  export class KapProvider extends BaseProvider {
9
9
  static BASE_URL = 'https://www.kap.org.tr';
10
+ static DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
11
+ static CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
12
+ static COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
13
+ oidMap = null;
14
+ oidCacheTime = 0;
15
+ CACHE_DURATION = 86400000; // 24 hours in ms
10
16
  constructor(options) { super(options); }
11
17
  async getCompanies() {
12
18
  const cacheKey = 'kap:companies';
@@ -14,14 +20,28 @@ export class KapProvider extends BaseProvider {
14
20
  if (cached)
15
21
  return cached;
16
22
  try {
17
- const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketleri`, { responseType: 'text' });
18
- const $ = cheerio.load(response.data);
23
+ const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
24
+ // Parse from Next.js embedded JSON data
25
+ // Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
26
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
19
27
  const companies = [];
20
- $('table.dataTable tbody tr').each((_, row) => {
21
- const cells = $(row).find('td');
22
- if (cells.length >= 3)
23
- companies.push({ ticker: $(cells[0]).text().trim(), name: $(cells[1]).text().trim(), city: $(cells[2]).text().trim() });
24
- });
28
+ const matches = response.data.matchAll(pattern);
29
+ for (const match of matches) {
30
+ const name = match[2];
31
+ const stockCodes = match[3];
32
+ // Handle multiple tickers (e.g., "GARAN, TGB")
33
+ if (stockCodes.includes(',')) {
34
+ const tickers = stockCodes.split(',').map(t => t.trim());
35
+ for (const ticker of tickers) {
36
+ if (ticker) {
37
+ companies.push({ ticker, name, city: '' });
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ companies.push({ ticker: stockCodes, name, city: '' });
43
+ }
44
+ }
25
45
  this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
26
46
  return companies;
27
47
  }
@@ -34,6 +54,159 @@ export class KapProvider extends BaseProvider {
34
54
  const q = query.toLowerCase();
35
55
  return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
36
56
  }
57
+ async getMemberOid(symbol) {
58
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
59
+ const currentTime = Date.now();
60
+ // Check cache
61
+ if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
62
+ return this.oidMap.get(symbol) || null;
63
+ }
64
+ // Fetch BIST companies list from KAP
65
+ try {
66
+ const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
67
+ // Parse mkkMemberOid and stockCode pairs from Next.js data
68
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
69
+ const matches = response.data.matchAll(pattern);
70
+ // Build mapping: stockCode -> mkkMemberOid
71
+ this.oidMap = new Map();
72
+ for (const match of matches) {
73
+ const oid = match[1];
74
+ const codesStr = match[2];
75
+ // Handle multiple codes per company (e.g., "GARAN, TGB")
76
+ for (const code of codesStr.split(',')) {
77
+ const trimmedCode = code.trim();
78
+ if (trimmedCode) {
79
+ this.oidMap.set(trimmedCode, oid);
80
+ }
81
+ }
82
+ }
83
+ this.oidCacheTime = currentTime;
84
+ return this.oidMap.get(symbol) || null;
85
+ }
86
+ catch (error) {
87
+ return null;
88
+ }
89
+ }
90
+ async getDisclosures(symbol, limit = 20) {
91
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
92
+ // Get KAP member OID for the symbol
93
+ const memberOid = await this.getMemberOid(symbol);
94
+ if (!memberOid) {
95
+ return [];
96
+ }
97
+ // Fetch disclosures from KAP
98
+ const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
99
+ try {
100
+ const response = await this.get(discUrl, { responseType: 'text' });
101
+ // Parse disclosures from Next.js embedded data
102
+ // Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
103
+ const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
104
+ const matches = Array.from(response.data.matchAll(pattern));
105
+ const disclosures = [];
106
+ for (let i = 0; i < Math.min(matches.length, limit); i++) {
107
+ const match = matches[i];
108
+ const date = match[1];
109
+ const idx = parseInt(match[2]);
110
+ const title = match[3];
111
+ disclosures.push({
112
+ date,
113
+ title,
114
+ disclosureIndex: idx,
115
+ url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
116
+ });
117
+ }
118
+ return disclosures;
119
+ }
120
+ catch (error) {
121
+ throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
122
+ }
123
+ }
124
+ async getCalendar(symbol) {
125
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
126
+ // Get KAP member OID for the symbol
127
+ const memberOid = await this.getMemberOid(symbol);
128
+ if (!memberOid) {
129
+ return [];
130
+ }
131
+ // Calculate date range: today to 6 months from now
132
+ const now = new Date();
133
+ const startDate = now.toISOString().split('T')[0];
134
+ const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
135
+ // Fetch expected disclosures from KAP API
136
+ const headers = {
137
+ 'Accept': '*/*',
138
+ 'Content-Type': 'application/json',
139
+ 'Origin': 'https://kap.org.tr',
140
+ 'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
141
+ };
142
+ const payload = {
143
+ startDate,
144
+ endDate,
145
+ memberTypes: ['IGS'],
146
+ mkkMemberOidList: [memberOid],
147
+ disclosureClass: '',
148
+ subjects: [],
149
+ mainSector: '',
150
+ sector: '',
151
+ subSector: '',
152
+ market: '',
153
+ index: '',
154
+ year: '',
155
+ term: '',
156
+ ruleType: ''
157
+ };
158
+ try {
159
+ const response = await this.post(KapProvider.CALENDAR_API_URL, payload, { headers });
160
+ const events = [];
161
+ for (const item of response.data) {
162
+ events.push({
163
+ startDate: item.startDate || '',
164
+ endDate: item.endDate || '',
165
+ subject: item.subject || '',
166
+ period: item.ruleTypeTerm || '',
167
+ year: item.year || ''
168
+ });
169
+ }
170
+ return events;
171
+ }
172
+ catch (error) {
173
+ throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
174
+ }
175
+ }
176
+ async getCompanyDetails(symbol) {
177
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
178
+ // Get KAP member OID for the symbol
179
+ const memberOid = await this.getMemberOid(symbol);
180
+ if (!memberOid) {
181
+ return {};
182
+ }
183
+ // Fetch company info page
184
+ const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
185
+ try {
186
+ const response = await this.get(url, { responseType: 'text' });
187
+ const html = response.data;
188
+ const result = {};
189
+ // Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
190
+ const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
191
+ if (sectorMatch) {
192
+ result.sector = sectorMatch[1].trim();
193
+ }
194
+ // Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
195
+ const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
196
+ if (marketMatch) {
197
+ result.market = marketMatch[1].trim();
198
+ }
199
+ // Extract website: after "İnternet Adresi" label
200
+ const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
201
+ if (websiteMatch) {
202
+ result.website = websiteMatch[1].trim();
203
+ }
204
+ return result;
205
+ }
206
+ catch (error) {
207
+ return {};
208
+ }
209
+ }
37
210
  }
38
211
  export class ViopProvider extends BaseProvider {
39
212
  static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
@@ -1 +1 @@
1
- {"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "borsajs",
3
- "version": "0.1.1",
4
- "description": "Turkish financial markets data library - yfinance-like API for BIST stocks, forex, crypto, and more",
3
+ "version": "0.1.4",
4
+ "description": "Turkey financial markets data library, BIST stocks, KAP, forex, crypto, investment funds, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -24,8 +24,11 @@
24
24
  "turkey",
25
25
  "forex",
26
26
  "crypto",
27
- "market-data",
28
- "yfinance"
27
+ "investment-funds",
28
+ "economic-indicators",
29
+ "macroeconomic-indicators",
30
+ "türkiye",
31
+ "market-data"
29
32
  ],
30
33
  "author": "Mesut Piskin",
31
34
  "license": "Apache-2.0",
package/src/index.ts CHANGED
@@ -22,7 +22,8 @@ export { Inflation } from './inflation.js';
22
22
 
23
23
  export { VIOP } from './viop.js';
24
24
 
25
- export { companies, searchCompanies } from './market.js';
25
+ export { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from './market.js';
26
+ export type { FXSymbol, IndexSymbol, StockSymbol, Company } from './market.js';
26
27
 
27
28
  export { BorsajsError, TickerNotFoundError, DataNotAvailableError, APIError, AuthenticationError, RateLimitError, InvalidPeriodError, InvalidIntervalError } from './exceptions.js';
28
29
 
@@ -33,6 +34,6 @@ export type { TickerData } from './providers/btcturk.js';
33
34
  export type { FXCurrentData, FXHistoryData } from './providers/dovizcom.js';
34
35
  export type { FundInfo, FundHistoryData, SearchResult } from './providers/tefas.js';
35
36
  export type { InflationLatest, InflationData, InflationCalculation } from './providers/tcmb.js';
36
- export type { ContractData, Company, Disclosure } from './providers/kap.js';
37
+ export type { ContractData, Disclosure } from './providers/kap.js';
37
38
 
38
39
  export const VERSION = '0.1.0';
package/src/market.ts CHANGED
@@ -1,7 +1,77 @@
1
1
  /**
2
2
  * Market-level functions for BIST data.
3
3
  */
4
- import { getKapProvider, Company } from './providers/kap.js';
4
+ import { getBtcTurkProvider } from './providers/btcturk.js';
5
5
 
6
- export async function companies(): Promise<Company[]> { return getKapProvider().getCompanies(); }
7
- export async function searchCompanies(query: string): Promise<Company[]> { return getKapProvider().search(query); }
6
+ // Static list of major BIST stocks (commonly traded)
7
+ const BIST_STOCKS = [
8
+ 'THYAO', 'GARAN', 'AKBNK', 'YKBNK', 'ISCTR', 'HALKB', 'VAKBN', 'SAHOL', 'SISE', 'TUPRS',
9
+ 'TCELL', 'EREGL', 'BIMAS', 'KOZAL', 'PETKM', 'ASELS', 'KCHOL', 'TOASO', 'FROTO', 'ARCLK',
10
+ 'MGROS', 'TTKOM', 'ENKAI', 'PGSUS', 'TAVHL', 'EKGYO', 'SASA', 'DOHOL', 'VESTL', 'GUBRF',
11
+ 'KOZAA', 'KLMSC', 'KRDMD', 'ODAS', 'TSKB', 'AKSEN', 'AEFES', 'KONTR', 'CEMTS', 'LOGO',
12
+ 'OYAKC', 'ULKER', 'CIMSA', 'ALARK', 'TURSG', 'ISGYO', 'GESAN', 'SOKM', 'DOAS', 'OTKAR',
13
+ 'BTCIM', 'BRISA', 'NETAS', 'IHLGM', 'TKFEN', 'TRGYO', 'AYGAZ', 'CCOLA', 'MAVI', 'HEKTS',
14
+ 'ANSGR', 'ZOREN', 'AGHOL', 'ISMEN', 'ANHYT', 'IPEKE', 'KORDS', 'KARTN', 'KLRHO', 'BINHO',
15
+ 'AKSA', 'NUHCM', 'ALBRK', 'SKBNK', 'TMSN', 'VERUS', 'SISEB', 'POLHO', 'GLYHO', 'TUREX',
16
+ ] as const;
17
+
18
+ export interface Company {
19
+ ticker: string;
20
+ name?: string;
21
+ sector?: string;
22
+ }
23
+
24
+ /**
25
+ * Get common BIST stock symbols.
26
+ * @returns Array of stock symbols
27
+ */
28
+ export function symbols(): string[] {
29
+ return [...BIST_STOCKS].sort();
30
+ }
31
+
32
+ /**
33
+ * Search stocks by ticker pattern.
34
+ * @param query - Search query (matches start of ticker)
35
+ * @returns Matching symbols
36
+ */
37
+ export function searchSymbols(query: string): string[] {
38
+ const q = query.toUpperCase();
39
+ return BIST_STOCKS.filter(s => s.includes(q));
40
+ }
41
+
42
+ /**
43
+ * Get available cryptocurrency pairs.
44
+ * @param quote - Quote currency (default: 'TRY')
45
+ * @returns Array of trading pairs (e.g., ['BTCTRY', 'ETHTRY', ...])
46
+ */
47
+ export async function cryptoSymbols(quote: string = 'TRY'): Promise<string[]> {
48
+ return getBtcTurkProvider().getPairs(quote);
49
+ }
50
+
51
+ /**
52
+ * Available FX symbols.
53
+ */
54
+ export const fxSymbols = [
55
+ // Currencies
56
+ 'USD', 'EUR', 'GBP', 'JPY', 'CHF', 'CAD', 'AUD',
57
+ // Precious Metals
58
+ 'gram-altin', 'ceyrek-altin', 'yarim-altin', 'tam-altin', 'cumhuriyet-altini',
59
+ 'gumus', 'ons',
60
+ // Energy
61
+ 'BRENT', 'WTI',
62
+ // Fuel
63
+ 'diesel', 'gasoline', 'lpg',
64
+ ] as const;
65
+
66
+ /**
67
+ * Available BIST indices.
68
+ */
69
+ export const indexSymbols = [
70
+ 'XU100', 'XU050', 'XU030', 'XBANK', 'XUSIN', 'XHOLD', 'XUTEK', 'XGIDA',
71
+ 'XTRZM', 'XULAS', 'XSGRT', 'XMANA', 'XKMYA', 'XMADN', 'XELKT', 'XTEKS',
72
+ 'XILTM', 'XUMAL', 'XUTUM',
73
+ ] as const;
74
+
75
+ export type FXSymbol = typeof fxSymbols[number];
76
+ export type IndexSymbol = typeof indexSymbols[number];
77
+ export type StockSymbol = typeof BIST_STOCKS[number];
@@ -7,10 +7,19 @@ import { TTL } from '../cache.js';
7
7
  import { APIError } from '../exceptions.js';
8
8
 
9
9
  export interface Company { ticker: string; name: string; city: string; }
10
- export interface Disclosure { id: string; date: Date; title: string; type: string; url: string; }
10
+ export interface Disclosure { date: string; title: string; disclosureIndex: number; url: string; }
11
+ export interface CalendarEvent { startDate: string; endDate: string; subject: string; period: string; year: string; }
12
+ export interface CompanyDetails { sector?: string; market?: string; website?: string; }
11
13
 
12
14
  export class KapProvider extends BaseProvider {
13
15
  private static readonly BASE_URL = 'https://www.kap.org.tr';
16
+ private static readonly DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
17
+ private static readonly CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
18
+ private static readonly COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
19
+ private oidMap: Map<string, string> | null = null;
20
+ private oidCacheTime: number = 0;
21
+ private readonly CACHE_DURATION = 86400000; // 24 hours in ms
22
+
14
23
  constructor(options?: ProviderOptions) { super(options); }
15
24
 
16
25
  async getCompanies(): Promise<Company[]> {
@@ -18,13 +27,32 @@ export class KapProvider extends BaseProvider {
18
27
  const cached = this.cacheGet<Company[]>(cacheKey);
19
28
  if (cached) return cached;
20
29
  try {
21
- const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketleri`, { responseType: 'text' as const });
22
- const $ = cheerio.load(response.data);
30
+ const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
31
+
32
+ // Parse from Next.js embedded JSON data
33
+ // Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
34
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
35
+
23
36
  const companies: Company[] = [];
24
- $('table.dataTable tbody tr').each((_, row) => {
25
- const cells = $(row).find('td');
26
- if (cells.length >= 3) companies.push({ ticker: $(cells[0]).text().trim(), name: $(cells[1]).text().trim(), city: $(cells[2]).text().trim() });
27
- });
37
+ const matches = response.data.matchAll(pattern);
38
+
39
+ for (const match of matches) {
40
+ const name = match[2];
41
+ const stockCodes = match[3];
42
+
43
+ // Handle multiple tickers (e.g., "GARAN, TGB")
44
+ if (stockCodes.includes(',')) {
45
+ const tickers = stockCodes.split(',').map(t => t.trim());
46
+ for (const ticker of tickers) {
47
+ if (ticker) {
48
+ companies.push({ ticker, name, city: '' });
49
+ }
50
+ }
51
+ } else {
52
+ companies.push({ ticker: stockCodes, name, city: '' });
53
+ }
54
+ }
55
+
28
56
  this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
29
57
  return companies;
30
58
  } catch (error) { throw new APIError(`Failed to fetch companies: ${error}`); }
@@ -35,6 +63,187 @@ export class KapProvider extends BaseProvider {
35
63
  const q = query.toLowerCase();
36
64
  return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
37
65
  }
66
+
67
+ async getMemberOid(symbol: string): Promise<string | null> {
68
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
69
+ const currentTime = Date.now();
70
+
71
+ // Check cache
72
+ if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
73
+ return this.oidMap.get(symbol) || null;
74
+ }
75
+
76
+ // Fetch BIST companies list from KAP
77
+ try {
78
+ const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
79
+
80
+ // Parse mkkMemberOid and stockCode pairs from Next.js data
81
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
82
+ const matches = response.data.matchAll(pattern);
83
+
84
+ // Build mapping: stockCode -> mkkMemberOid
85
+ this.oidMap = new Map();
86
+ for (const match of matches) {
87
+ const oid = match[1];
88
+ const codesStr = match[2];
89
+
90
+ // Handle multiple codes per company (e.g., "GARAN, TGB")
91
+ for (const code of codesStr.split(',')) {
92
+ const trimmedCode = code.trim();
93
+ if (trimmedCode) {
94
+ this.oidMap.set(trimmedCode, oid);
95
+ }
96
+ }
97
+ }
98
+
99
+ this.oidCacheTime = currentTime;
100
+ return this.oidMap.get(symbol) || null;
101
+ } catch (error) {
102
+ return null;
103
+ }
104
+ }
105
+
106
+ async getDisclosures(symbol: string, limit: number = 20): Promise<Disclosure[]> {
107
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
108
+
109
+ // Get KAP member OID for the symbol
110
+ const memberOid = await this.getMemberOid(symbol);
111
+ if (!memberOid) {
112
+ return [];
113
+ }
114
+
115
+ // Fetch disclosures from KAP
116
+ const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
117
+
118
+ try {
119
+ const response = await this.get<string>(discUrl, { responseType: 'text' as const });
120
+
121
+ // Parse disclosures from Next.js embedded data
122
+ // Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
123
+ const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
124
+ const matches = Array.from(response.data.matchAll(pattern));
125
+
126
+ const disclosures: Disclosure[] = [];
127
+ for (let i = 0; i < Math.min(matches.length, limit); i++) {
128
+ const match = matches[i];
129
+ const date = match[1];
130
+ const idx = parseInt(match[2]);
131
+ const title = match[3];
132
+
133
+ disclosures.push({
134
+ date,
135
+ title,
136
+ disclosureIndex: idx,
137
+ url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
138
+ });
139
+ }
140
+
141
+ return disclosures;
142
+ } catch (error) {
143
+ throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
144
+ }
145
+ }
146
+
147
+ async getCalendar(symbol: string): Promise<CalendarEvent[]> {
148
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
149
+
150
+ // Get KAP member OID for the symbol
151
+ const memberOid = await this.getMemberOid(symbol);
152
+ if (!memberOid) {
153
+ return [];
154
+ }
155
+
156
+ // Calculate date range: today to 6 months from now
157
+ const now = new Date();
158
+ const startDate = now.toISOString().split('T')[0];
159
+ const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
160
+
161
+ // Fetch expected disclosures from KAP API
162
+ const headers = {
163
+ 'Accept': '*/*',
164
+ 'Content-Type': 'application/json',
165
+ 'Origin': 'https://kap.org.tr',
166
+ 'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
167
+ };
168
+
169
+ const payload = {
170
+ startDate,
171
+ endDate,
172
+ memberTypes: ['IGS'],
173
+ mkkMemberOidList: [memberOid],
174
+ disclosureClass: '',
175
+ subjects: [],
176
+ mainSector: '',
177
+ sector: '',
178
+ subSector: '',
179
+ market: '',
180
+ index: '',
181
+ year: '',
182
+ term: '',
183
+ ruleType: ''
184
+ };
185
+
186
+ try {
187
+ const response = await this.post<any[]>(KapProvider.CALENDAR_API_URL, payload, { headers });
188
+
189
+ const events: CalendarEvent[] = [];
190
+ for (const item of response.data) {
191
+ events.push({
192
+ startDate: item.startDate || '',
193
+ endDate: item.endDate || '',
194
+ subject: item.subject || '',
195
+ period: item.ruleTypeTerm || '',
196
+ year: item.year || ''
197
+ });
198
+ }
199
+
200
+ return events;
201
+ } catch (error) {
202
+ throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
203
+ }
204
+ }
205
+
206
+ async getCompanyDetails(symbol: string): Promise<CompanyDetails> {
207
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
208
+
209
+ // Get KAP member OID for the symbol
210
+ const memberOid = await this.getMemberOid(symbol);
211
+ if (!memberOid) {
212
+ return {};
213
+ }
214
+
215
+ // Fetch company info page
216
+ const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
217
+
218
+ try {
219
+ const response = await this.get<string>(url, { responseType: 'text' as const });
220
+ const html = response.data;
221
+
222
+ const result: CompanyDetails = {};
223
+
224
+ // Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
225
+ const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
226
+ if (sectorMatch) {
227
+ result.sector = sectorMatch[1].trim();
228
+ }
229
+
230
+ // Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
231
+ const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
232
+ if (marketMatch) {
233
+ result.market = marketMatch[1].trim();
234
+ }
235
+
236
+ // Extract website: after "İnternet Adresi" label
237
+ const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
238
+ if (websiteMatch) {
239
+ result.website = websiteMatch[1].trim();
240
+ }
241
+
242
+ return result;
243
+ } catch (error) {
244
+ return {};
245
+ }
246
+ }
38
247
  }
39
248
 
40
249
  export interface ContractData { code: string; contract: string; price: number; change: number; volumeTl: number; volumeQty: number; category: string; }