vantuz 3.4.2 → 3.5.1
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.
- package/.env.example +21 -0
- package/.openclaw/completions/openclaw.bash +227 -0
- package/.openclaw/completions/openclaw.fish +1552 -0
- package/.openclaw/completions/openclaw.ps1 +1966 -0
- package/.openclaw/completions/openclaw.zsh +3571 -0
- package/.openclaw/gateway.cmd +10 -0
- package/.openclaw/identity/device.json +7 -0
- package/.openclaw/openclaw.json +40 -0
- package/.windsurf/workflows/vantuz-dev.md +31 -0
- package/DOCS_TR.md +80 -0
- package/LICENSE +45 -45
- package/README.md +52 -21
- package/cli.js +685 -585
- package/config.js +733 -733
- package/core/agent-loop.js +190 -190
- package/core/ai-provider.js +298 -261
- package/core/automation.js +523 -523
- package/core/brand-analyst.js +101 -0
- package/core/channels.js +167 -167
- package/core/dashboard.js +230 -230
- package/core/database.js +135 -37
- package/core/eia-monitor.js +3 -1
- package/core/engine.js +648 -636
- package/core/gateway.js +447 -447
- package/core/learning.js +214 -214
- package/core/license.js +113 -0
- package/core/marketplace-adapter.js +168 -168
- package/core/memory.js +190 -190
- package/core/migrations/001-initial-schema.sql +1 -1
- package/core/queue.js +120 -120
- package/core/self-healer.js +314 -314
- package/core/unified-product.js +214 -214
- package/core/vision-service.js +113 -113
- package/index.js +217 -174
- package/modules/crm/sentiment-crm.js +231 -231
- package/modules/healer/listing-healer.js +201 -201
- package/modules/oracle/predictor.js +214 -214
- package/modules/researcher/agent.js +169 -169
- package/modules/team/agents/base.js +92 -92
- package/modules/team/agents/dev.js +33 -33
- package/modules/team/agents/josh.js +40 -40
- package/modules/team/agents/marketing.js +33 -33
- package/modules/team/agents/milo.js +36 -36
- package/modules/team/index.js +78 -78
- package/modules/team/shared-memory.js +87 -87
- package/modules/war-room/competitor-tracker.js +250 -250
- package/modules/war-room/pricing-engine.js +308 -308
- package/n11docs.md +1680 -0
- package/nodes/warehouse.js +238 -238
- package/onboard.js +1 -1
- package/openclawdocs.md +3 -0
- package/package.json +7 -5
- package/platforms/pttavm.js +14 -14
- package/plugins/vantuz/index.js +528 -528
- package/plugins/vantuz/memory/hippocampus.js +465 -465
- package/plugins/vantuz/package.json +20 -20
- package/plugins/vantuz/platforms/_template.js +118 -118
- package/plugins/vantuz/platforms/amazon.js +236 -236
- package/plugins/vantuz/platforms/ciceksepeti.js +166 -166
- package/plugins/vantuz/platforms/hepsiburada.js +180 -180
- package/plugins/vantuz/platforms/index.js +165 -165
- package/plugins/vantuz/platforms/n11.js +229 -229
- package/plugins/vantuz/platforms/pazarama.js +154 -154
- package/plugins/vantuz/platforms/pttavm.js +127 -127
- package/plugins/vantuz/platforms/trendyol.js +326 -326
- package/plugins/vantuz/services/alerts.js +253 -253
- package/plugins/vantuz/services/license.js +34 -34
- package/plugins/vantuz/services/scheduler.js +232 -232
- package/plugins/vantuz/tools/analytics.js +152 -152
- package/plugins/vantuz/tools/crossborder.js +187 -187
- package/plugins/vantuz/tools/nl-parser.js +211 -211
- package/plugins/vantuz/tools/product.js +110 -110
- package/plugins/vantuz/tools/quick-report.js +175 -175
- package/plugins/vantuz/tools/repricer.js +314 -314
- package/plugins/vantuz/tools/sentiment.js +115 -115
- package/plugins/vantuz/tools/vision.js +257 -257
- package/public.pem +9 -0
- package/server/app.js +260 -260
- package/server/public/index.html +514 -514
- package/start.bat +33 -33
- package/vantuz.sqlite +0 -0
- package/workspace/AGENTS.md +73 -0
- package/workspace/BRAND.md +29 -0
- package/workspace/SOUL.md +72 -0
- package/workspace/team/DECISIONS.md +3 -0
- package/workspace/team/GOALS.md +3 -0
- package/workspace/team/PROJECT_STATUS.md +3 -0
- package/workspace/team/agents/dev/SOUL.md +12 -0
- package/workspace/team/agents/josh/SOUL.md +12 -0
- package/workspace/team/agents/marketing/SOUL.md +12 -0
- package/workspace/team/agents/milo/SOUL.md +12 -0
- package/vantuz-3.3.4.tgz +0 -0
|
@@ -1,187 +1,187 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 🌍 Cross-Border Tool
|
|
3
|
-
* Ürünleri yurt dışı pazarlarına uyarla
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const EXCHANGE_RATES = {
|
|
7
|
-
TRY_EUR: 0.027,
|
|
8
|
-
TRY_USD: 0.029,
|
|
9
|
-
TRY_GBP: 0.023
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const FBA_FEES = {
|
|
13
|
-
de: { base: 3.50, perKg: 0.50, storage: 0.10 },
|
|
14
|
-
us: { base: 3.99, perKg: 0.55, storage: 0.12 },
|
|
15
|
-
uk: { base: 3.20, perKg: 0.45, storage: 0.09 }
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const SHIPPING_COSTS = {
|
|
19
|
-
de: { base: 8.50, perKg: 2.00 },
|
|
20
|
-
us: { base: 15.00, perKg: 3.50 },
|
|
21
|
-
uk: { base: 9.00, perKg: 2.20 }
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const crossborderTool = {
|
|
25
|
-
name: 'crossborder',
|
|
26
|
-
|
|
27
|
-
async execute(params, context) {
|
|
28
|
-
const { api, memory, license } = context;
|
|
29
|
-
const { productId, sourcePlatform = 'trendyol', targetMarket, fulfillment = 'fba' } = params;
|
|
30
|
-
|
|
31
|
-
if (!license.hasFeature('crossborder')) {
|
|
32
|
-
return { success: false, error: 'Cross-Border için lisans gerekli.' };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Kaynak ürünü al
|
|
36
|
-
const sourceProduct = await this._getSourceProduct(productId, sourcePlatform, api);
|
|
37
|
-
if (!sourceProduct) {
|
|
38
|
-
return { success: false, error: 'Kaynak ürün bulunamadı.' };
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Çeviri yap
|
|
42
|
-
const translation = await this._translateProduct(sourceProduct, targetMarket, api);
|
|
43
|
-
|
|
44
|
-
// Maliyet hesapla
|
|
45
|
-
const costs = this._calculateCosts(sourceProduct, targetMarket, fulfillment);
|
|
46
|
-
|
|
47
|
-
// Optimal fiyat belirle
|
|
48
|
-
const pricing = this._calculatePricing(sourceProduct, costs, targetMarket);
|
|
49
|
-
|
|
50
|
-
// Hafızaya kaydet
|
|
51
|
-
await memory.remember('product', {
|
|
52
|
-
type: 'crossborder_preparation',
|
|
53
|
-
sourceProduct: productId,
|
|
54
|
-
targetMarket,
|
|
55
|
-
translation,
|
|
56
|
-
pricing
|
|
57
|
-
}, { productId, targetMarket });
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
success: true,
|
|
61
|
-
source: {
|
|
62
|
-
platform: sourcePlatform,
|
|
63
|
-
name: sourceProduct.name,
|
|
64
|
-
price: `${sourceProduct.price} ₺`
|
|
65
|
-
},
|
|
66
|
-
target: {
|
|
67
|
-
market: targetMarket,
|
|
68
|
-
title: translation.title,
|
|
69
|
-
description: translation.description,
|
|
70
|
-
currency: this._getCurrency(targetMarket)
|
|
71
|
-
},
|
|
72
|
-
costs: {
|
|
73
|
-
productCost: `${costs.productCostForeign.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
74
|
-
shipping: `${costs.shipping.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
75
|
-
fbaFees: fulfillment === 'fba' ? `${costs.fbaFees.toFixed(2)} ${this._getCurrency(targetMarket)}` : 'N/A',
|
|
76
|
-
platformCommission: `${costs.commission.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
77
|
-
totalCost: `${costs.total.toFixed(2)} ${this._getCurrency(targetMarket)}`
|
|
78
|
-
},
|
|
79
|
-
pricing: {
|
|
80
|
-
suggestedPrice: `${pricing.suggested.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
81
|
-
minPrice: `${pricing.min.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
82
|
-
expectedProfit: `${pricing.profit.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
83
|
-
profitMargin: `${pricing.margin.toFixed(0)}%`
|
|
84
|
-
},
|
|
85
|
-
readyToPublish: true,
|
|
86
|
-
nextStep: `"Amazon ${targetMarket.toUpperCase()}'ya yayınla" demek isterseniz otomatik listeleyebilirim.`
|
|
87
|
-
};
|
|
88
|
-
},
|
|
89
|
-
|
|
90
|
-
async _getSourceProduct(productId, platform, api) {
|
|
91
|
-
// TODO: Platform API'sinden ürün bilgisi al
|
|
92
|
-
return {
|
|
93
|
-
id: productId,
|
|
94
|
-
name: 'Kadın Basic Tişört - Kırmızı',
|
|
95
|
-
description: '%100 Pamuklu, V Yaka, rahat kesim kadın tişört.',
|
|
96
|
-
price: 349,
|
|
97
|
-
weight: 0.3, // kg
|
|
98
|
-
category: 'Kadın > Giyim > Tişört',
|
|
99
|
-
images: ['https://example.com/image.jpg']
|
|
100
|
-
};
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
async _translateProduct(product, targetMarket, api) {
|
|
104
|
-
const languages = {
|
|
105
|
-
de: 'Almanca',
|
|
106
|
-
us: 'İngilizce (Amerikan)',
|
|
107
|
-
uk: 'İngilizce (İngiliz)',
|
|
108
|
-
fr: 'Fransızca'
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// TODO: AI ile çeviri
|
|
112
|
-
const translations = {
|
|
113
|
-
de: {
|
|
114
|
-
title: 'Damen Basic T-Shirt - Rot',
|
|
115
|
-
description: '100% Baumwolle, V-Ausschnitt, bequeme Passform Damen T-Shirt.'
|
|
116
|
-
},
|
|
117
|
-
us: {
|
|
118
|
-
title: "Women's Basic T-Shirt - Red",
|
|
119
|
-
description: '100% Cotton, V-Neck, comfortable fit women\'s t-shirt.'
|
|
120
|
-
},
|
|
121
|
-
uk: {
|
|
122
|
-
title: "Ladies Basic T-Shirt - Red",
|
|
123
|
-
description: '100% Cotton, V-Neck, comfortable fit ladies t-shirt.'
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
return translations[targetMarket] || translations.us;
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
_calculateCosts(product, targetMarket, fulfillment) {
|
|
131
|
-
const rate = this._getExchangeRate(targetMarket);
|
|
132
|
-
const fbaFee = FBA_FEES[targetMarket] || FBA_FEES.de;
|
|
133
|
-
const shippingCost = SHIPPING_COSTS[targetMarket] || SHIPPING_COSTS.de;
|
|
134
|
-
|
|
135
|
-
const productCostForeign = product.price * rate;
|
|
136
|
-
const shipping = shippingCost.base + (product.weight * shippingCost.perKg);
|
|
137
|
-
const fbaFees = fulfillment === 'fba'
|
|
138
|
-
? fbaFee.base + (product.weight * fbaFee.perKg)
|
|
139
|
-
: 0;
|
|
140
|
-
const commission = productCostForeign * 0.15; // Amazon komisyonu ~15%
|
|
141
|
-
|
|
142
|
-
return {
|
|
143
|
-
productCostForeign,
|
|
144
|
-
shipping,
|
|
145
|
-
fbaFees,
|
|
146
|
-
commission,
|
|
147
|
-
total: productCostForeign + shipping + fbaFees + commission
|
|
148
|
-
};
|
|
149
|
-
},
|
|
150
|
-
|
|
151
|
-
_calculatePricing(product, costs, targetMarket) {
|
|
152
|
-
const minMargin = 0.20; // Minimum %20 kar
|
|
153
|
-
const targetMargin = 0.35; // Hedef %35 kar
|
|
154
|
-
|
|
155
|
-
const minPrice = costs.total * (1 + minMargin);
|
|
156
|
-
const suggested = costs.total * (1 + targetMargin);
|
|
157
|
-
const profit = suggested - costs.total;
|
|
158
|
-
const margin = (profit / suggested) * 100;
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
min: minPrice,
|
|
162
|
-
suggested,
|
|
163
|
-
profit,
|
|
164
|
-
margin
|
|
165
|
-
};
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
_getExchangeRate(targetMarket) {
|
|
169
|
-
const rates = {
|
|
170
|
-
de: EXCHANGE_RATES.TRY_EUR,
|
|
171
|
-
fr: EXCHANGE_RATES.TRY_EUR,
|
|
172
|
-
us: EXCHANGE_RATES.TRY_USD,
|
|
173
|
-
uk: EXCHANGE_RATES.TRY_GBP
|
|
174
|
-
};
|
|
175
|
-
return rates[targetMarket] || EXCHANGE_RATES.TRY_EUR;
|
|
176
|
-
},
|
|
177
|
-
|
|
178
|
-
_getCurrency(targetMarket) {
|
|
179
|
-
const currencies = {
|
|
180
|
-
de: '€',
|
|
181
|
-
fr: '€',
|
|
182
|
-
us: '$',
|
|
183
|
-
uk: '£'
|
|
184
|
-
};
|
|
185
|
-
return currencies[targetMarket] || '€';
|
|
186
|
-
}
|
|
187
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* 🌍 Cross-Border Tool
|
|
3
|
+
* Ürünleri yurt dışı pazarlarına uyarla
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const EXCHANGE_RATES = {
|
|
7
|
+
TRY_EUR: 0.027,
|
|
8
|
+
TRY_USD: 0.029,
|
|
9
|
+
TRY_GBP: 0.023
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const FBA_FEES = {
|
|
13
|
+
de: { base: 3.50, perKg: 0.50, storage: 0.10 },
|
|
14
|
+
us: { base: 3.99, perKg: 0.55, storage: 0.12 },
|
|
15
|
+
uk: { base: 3.20, perKg: 0.45, storage: 0.09 }
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const SHIPPING_COSTS = {
|
|
19
|
+
de: { base: 8.50, perKg: 2.00 },
|
|
20
|
+
us: { base: 15.00, perKg: 3.50 },
|
|
21
|
+
uk: { base: 9.00, perKg: 2.20 }
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const crossborderTool = {
|
|
25
|
+
name: 'crossborder',
|
|
26
|
+
|
|
27
|
+
async execute(params, context) {
|
|
28
|
+
const { api, memory, license } = context;
|
|
29
|
+
const { productId, sourcePlatform = 'trendyol', targetMarket, fulfillment = 'fba' } = params;
|
|
30
|
+
|
|
31
|
+
if (!license.hasFeature('crossborder')) {
|
|
32
|
+
return { success: false, error: 'Cross-Border için lisans gerekli.' };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Kaynak ürünü al
|
|
36
|
+
const sourceProduct = await this._getSourceProduct(productId, sourcePlatform, api);
|
|
37
|
+
if (!sourceProduct) {
|
|
38
|
+
return { success: false, error: 'Kaynak ürün bulunamadı.' };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Çeviri yap
|
|
42
|
+
const translation = await this._translateProduct(sourceProduct, targetMarket, api);
|
|
43
|
+
|
|
44
|
+
// Maliyet hesapla
|
|
45
|
+
const costs = this._calculateCosts(sourceProduct, targetMarket, fulfillment);
|
|
46
|
+
|
|
47
|
+
// Optimal fiyat belirle
|
|
48
|
+
const pricing = this._calculatePricing(sourceProduct, costs, targetMarket);
|
|
49
|
+
|
|
50
|
+
// Hafızaya kaydet
|
|
51
|
+
await memory.remember('product', {
|
|
52
|
+
type: 'crossborder_preparation',
|
|
53
|
+
sourceProduct: productId,
|
|
54
|
+
targetMarket,
|
|
55
|
+
translation,
|
|
56
|
+
pricing
|
|
57
|
+
}, { productId, targetMarket });
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
source: {
|
|
62
|
+
platform: sourcePlatform,
|
|
63
|
+
name: sourceProduct.name,
|
|
64
|
+
price: `${sourceProduct.price} ₺`
|
|
65
|
+
},
|
|
66
|
+
target: {
|
|
67
|
+
market: targetMarket,
|
|
68
|
+
title: translation.title,
|
|
69
|
+
description: translation.description,
|
|
70
|
+
currency: this._getCurrency(targetMarket)
|
|
71
|
+
},
|
|
72
|
+
costs: {
|
|
73
|
+
productCost: `${costs.productCostForeign.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
74
|
+
shipping: `${costs.shipping.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
75
|
+
fbaFees: fulfillment === 'fba' ? `${costs.fbaFees.toFixed(2)} ${this._getCurrency(targetMarket)}` : 'N/A',
|
|
76
|
+
platformCommission: `${costs.commission.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
77
|
+
totalCost: `${costs.total.toFixed(2)} ${this._getCurrency(targetMarket)}`
|
|
78
|
+
},
|
|
79
|
+
pricing: {
|
|
80
|
+
suggestedPrice: `${pricing.suggested.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
81
|
+
minPrice: `${pricing.min.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
82
|
+
expectedProfit: `${pricing.profit.toFixed(2)} ${this._getCurrency(targetMarket)}`,
|
|
83
|
+
profitMargin: `${pricing.margin.toFixed(0)}%`
|
|
84
|
+
},
|
|
85
|
+
readyToPublish: true,
|
|
86
|
+
nextStep: `"Amazon ${targetMarket.toUpperCase()}'ya yayınla" demek isterseniz otomatik listeleyebilirim.`
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
async _getSourceProduct(productId, platform, api) {
|
|
91
|
+
// TODO: Platform API'sinden ürün bilgisi al
|
|
92
|
+
return {
|
|
93
|
+
id: productId,
|
|
94
|
+
name: 'Kadın Basic Tişört - Kırmızı',
|
|
95
|
+
description: '%100 Pamuklu, V Yaka, rahat kesim kadın tişört.',
|
|
96
|
+
price: 349,
|
|
97
|
+
weight: 0.3, // kg
|
|
98
|
+
category: 'Kadın > Giyim > Tişört',
|
|
99
|
+
images: ['https://example.com/image.jpg']
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
async _translateProduct(product, targetMarket, api) {
|
|
104
|
+
const languages = {
|
|
105
|
+
de: 'Almanca',
|
|
106
|
+
us: 'İngilizce (Amerikan)',
|
|
107
|
+
uk: 'İngilizce (İngiliz)',
|
|
108
|
+
fr: 'Fransızca'
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// TODO: AI ile çeviri
|
|
112
|
+
const translations = {
|
|
113
|
+
de: {
|
|
114
|
+
title: 'Damen Basic T-Shirt - Rot',
|
|
115
|
+
description: '100% Baumwolle, V-Ausschnitt, bequeme Passform Damen T-Shirt.'
|
|
116
|
+
},
|
|
117
|
+
us: {
|
|
118
|
+
title: "Women's Basic T-Shirt - Red",
|
|
119
|
+
description: '100% Cotton, V-Neck, comfortable fit women\'s t-shirt.'
|
|
120
|
+
},
|
|
121
|
+
uk: {
|
|
122
|
+
title: "Ladies Basic T-Shirt - Red",
|
|
123
|
+
description: '100% Cotton, V-Neck, comfortable fit ladies t-shirt.'
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
return translations[targetMarket] || translations.us;
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
_calculateCosts(product, targetMarket, fulfillment) {
|
|
131
|
+
const rate = this._getExchangeRate(targetMarket);
|
|
132
|
+
const fbaFee = FBA_FEES[targetMarket] || FBA_FEES.de;
|
|
133
|
+
const shippingCost = SHIPPING_COSTS[targetMarket] || SHIPPING_COSTS.de;
|
|
134
|
+
|
|
135
|
+
const productCostForeign = product.price * rate;
|
|
136
|
+
const shipping = shippingCost.base + (product.weight * shippingCost.perKg);
|
|
137
|
+
const fbaFees = fulfillment === 'fba'
|
|
138
|
+
? fbaFee.base + (product.weight * fbaFee.perKg)
|
|
139
|
+
: 0;
|
|
140
|
+
const commission = productCostForeign * 0.15; // Amazon komisyonu ~15%
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
productCostForeign,
|
|
144
|
+
shipping,
|
|
145
|
+
fbaFees,
|
|
146
|
+
commission,
|
|
147
|
+
total: productCostForeign + shipping + fbaFees + commission
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
_calculatePricing(product, costs, targetMarket) {
|
|
152
|
+
const minMargin = 0.20; // Minimum %20 kar
|
|
153
|
+
const targetMargin = 0.35; // Hedef %35 kar
|
|
154
|
+
|
|
155
|
+
const minPrice = costs.total * (1 + minMargin);
|
|
156
|
+
const suggested = costs.total * (1 + targetMargin);
|
|
157
|
+
const profit = suggested - costs.total;
|
|
158
|
+
const margin = (profit / suggested) * 100;
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
min: minPrice,
|
|
162
|
+
suggested,
|
|
163
|
+
profit,
|
|
164
|
+
margin
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
_getExchangeRate(targetMarket) {
|
|
169
|
+
const rates = {
|
|
170
|
+
de: EXCHANGE_RATES.TRY_EUR,
|
|
171
|
+
fr: EXCHANGE_RATES.TRY_EUR,
|
|
172
|
+
us: EXCHANGE_RATES.TRY_USD,
|
|
173
|
+
uk: EXCHANGE_RATES.TRY_GBP
|
|
174
|
+
};
|
|
175
|
+
return rates[targetMarket] || EXCHANGE_RATES.TRY_EUR;
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
_getCurrency(targetMarket) {
|
|
179
|
+
const currencies = {
|
|
180
|
+
de: '€',
|
|
181
|
+
fr: '€',
|
|
182
|
+
us: '$',
|
|
183
|
+
uk: '£'
|
|
184
|
+
};
|
|
185
|
+
return currencies[targetMarket] || '€';
|
|
186
|
+
}
|
|
187
|
+
};
|