adsd
This commit is contained in:
@@ -805,8 +805,7 @@
|
||||
runtime_months: 1,
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: 'MH/s',
|
||||
bonus_speed_value: '',
|
||||
bonus_speed_unit: 'MH/s',
|
||||
bonus_percent: '',
|
||||
auto_renew: true,
|
||||
base_price_amount: '',
|
||||
payment_type: 'fiat',
|
||||
@@ -826,10 +825,7 @@
|
||||
const [minerOfferForm, setMinerOfferForm] = useState({
|
||||
label: '',
|
||||
runtime_months: '',
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: 'MH/s',
|
||||
bonus_speed_value: '',
|
||||
bonus_speed_unit: 'MH/s',
|
||||
bonus_percent: '',
|
||||
base_price_amount: '',
|
||||
base_price_currency: 'USD',
|
||||
payment_type: 'fiat',
|
||||
@@ -841,9 +837,14 @@
|
||||
const [purchaseMinerModalOpen, setPurchaseMinerModalOpen] = useState(false);
|
||||
const [purchaseMinerForm, setPurchaseMinerForm] = useState({
|
||||
offer_id: '',
|
||||
base_offer_id: '',
|
||||
purchased_at: '',
|
||||
label: '',
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: '',
|
||||
bonus_percent: '',
|
||||
total_cost_amount: '',
|
||||
currency: 'USD',
|
||||
currency: '',
|
||||
reference_price_amount: '',
|
||||
reference_price_currency: '',
|
||||
auto_renew: false,
|
||||
@@ -941,7 +942,7 @@
|
||||
: cryptoCurrencies;
|
||||
const selectableFiatCurrencies = preferredSelectableFiatCurrencies.length ? preferredSelectableFiatCurrencies : fiatCurrencies;
|
||||
const selectableCryptoCurrencies = preferredSelectableCryptoCurrencies.length ? preferredSelectableCryptoCurrencies : cryptoCurrencies;
|
||||
const selectedMinerScenario = availableMinerOffers.find((offer) => Number(offer.id) === Number(selectedMinerScenarioId)) || null;
|
||||
const selectedMinerScenario = availableMinerOffers.find((offer) => String(offer.id) === String(selectedMinerScenarioId)) || null;
|
||||
const activeMinerRows = currentPurchasedMiners.map((miner) => ({
|
||||
id: `purchase-${miner.id}`,
|
||||
source: 'miete',
|
||||
@@ -962,7 +963,7 @@
|
||||
: 'fiat',
|
||||
is_active: miner.is_active !== false,
|
||||
can_toggle_auto_renew: Number(miner.runtime_months) > 0 && renewableOfferIds.has(Number(miner.miner_offer_id)),
|
||||
hashrate_text: `${fmtNumber(((Number(miner.mining_speed_value) || 0) + (Number(miner.bonus_speed_value) || 0)), 4)} ${miner.mining_speed_unit || miner.bonus_speed_unit || ''}`.trim(),
|
||||
hashrate_text: formatHashrateWithBonus(miner.mining_speed_value, miner.mining_speed_unit, miner.bonus_speed_value, miner.bonus_speed_unit),
|
||||
type_label: 'Aus Angebot gemietet',
|
||||
})).concat(currentCostPlans.map((plan) => ({
|
||||
id: `plan-${plan.id}`,
|
||||
@@ -978,10 +979,7 @@
|
||||
payment_type: plan.payment_type,
|
||||
is_active: !!plan.is_active,
|
||||
can_toggle_auto_renew: false,
|
||||
hashrate_text: [
|
||||
formatSpeed(plan.mining_speed_value, plan.mining_speed_unit, 'Basis'),
|
||||
formatSpeed(plan.bonus_speed_value, plan.bonus_speed_unit, 'Bonus'),
|
||||
].filter(Boolean).join(' · ') || 'n/a',
|
||||
hashrate_text: formatHashrateWithBonus(plan.mining_speed_value, plan.mining_speed_unit, plan.bonus_speed_value, plan.bonus_speed_unit),
|
||||
type_label: 'Manuell eingetragen',
|
||||
}))).sort((left, right) => String(right.starts_at || '').localeCompare(String(left.starts_at || '')));
|
||||
|
||||
@@ -996,7 +994,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
const exists = availableMinerOffers.some((offer) => Number(offer.id) === Number(selectedMinerScenarioId));
|
||||
const exists = availableMinerOffers.some((offer) => String(offer.id) === String(selectedMinerScenarioId));
|
||||
if (!exists) {
|
||||
setSelectedMinerScenarioId(null);
|
||||
}
|
||||
@@ -1017,6 +1015,11 @@
|
||||
setPurchaseMinerForm((current) => ({
|
||||
...current,
|
||||
offer_id: current.offer_id || String(selectedOffer.id),
|
||||
base_offer_id: current.base_offer_id || String(selectedOffer.base_offer_id || selectedOffer.id || ''),
|
||||
label: current.label || String(selectedOffer.label || ''),
|
||||
mining_speed_value: current.mining_speed_value || String(selectedOffer.mining_speed_value || ''),
|
||||
mining_speed_unit: current.mining_speed_unit || String(selectedOffer.mining_speed_unit || ''),
|
||||
bonus_percent: current.bonus_percent || (selectedOffer.bonus_percent !== null && selectedOffer.bonus_percent !== undefined ? String(selectedOffer.bonus_percent) : ''),
|
||||
currency: current.currency || (!selectedOffer.auto_renew ? (currentSettings.crypto_currency || 'DOGE') : (selectedOffer.effective_price_currency || selectedOffer.base_price_currency || 'USD')),
|
||||
total_cost_amount: current.total_cost_amount || (selectedOffer.effective_price_amount !== null && selectedOffer.effective_price_amount !== undefined ? String(selectedOffer.effective_price_amount) : ''),
|
||||
reference_price_amount: current.reference_price_amount || (selectedOffer.reference_price_amount !== null && selectedOffer.reference_price_amount !== undefined ? String(selectedOffer.reference_price_amount) : ''),
|
||||
@@ -1672,8 +1675,7 @@
|
||||
runtime_months: 1,
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: 'MH/s',
|
||||
bonus_speed_value: '',
|
||||
bonus_speed_unit: 'MH/s',
|
||||
bonus_percent: '',
|
||||
auto_renew: true,
|
||||
base_price_amount: '',
|
||||
payment_type: 'fiat',
|
||||
@@ -1726,10 +1728,7 @@
|
||||
setMinerOfferForm({
|
||||
label: '',
|
||||
runtime_months: '',
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: 'MH/s',
|
||||
bonus_speed_value: '',
|
||||
bonus_speed_unit: 'MH/s',
|
||||
bonus_percent: '',
|
||||
base_price_amount: '',
|
||||
base_price_currency: 'USD',
|
||||
payment_type: 'fiat',
|
||||
@@ -1756,6 +1755,21 @@
|
||||
body: JSON.stringify(overrides || { purchased_at: nowDateTimeLocalValue() }),
|
||||
});
|
||||
setMessage('Miner als gemietet erfasst.');
|
||||
setPurchaseMinerForm({
|
||||
offer_id: '',
|
||||
base_offer_id: '',
|
||||
purchased_at: '',
|
||||
label: '',
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: '',
|
||||
bonus_percent: '',
|
||||
total_cost_amount: '',
|
||||
currency: '',
|
||||
reference_price_amount: '',
|
||||
reference_price_currency: '',
|
||||
auto_renew: false,
|
||||
note: '',
|
||||
});
|
||||
setPurchaseMinerModalOpen(false);
|
||||
await loadBootstrap(projectKey);
|
||||
} catch (err) {
|
||||
@@ -1772,7 +1786,17 @@
|
||||
return;
|
||||
}
|
||||
|
||||
await purchaseMinerOffer(purchaseMinerForm.offer_id, {
|
||||
const selectedOffer = availableMinerOffers.find((offer) => String(offer.id) === String(purchaseMinerForm.offer_id));
|
||||
if (!selectedOffer) {
|
||||
setError('Bitte ein gueltiges Miner-Angebot auswaehlen.');
|
||||
return;
|
||||
}
|
||||
|
||||
await purchaseMinerOffer(String(selectedOffer.base_offer_id || selectedOffer.id), {
|
||||
label: purchaseMinerForm.label || null,
|
||||
mining_speed_value: purchaseMinerForm.mining_speed_value || null,
|
||||
mining_speed_unit: purchaseMinerForm.mining_speed_unit || null,
|
||||
bonus_percent: purchaseMinerForm.bonus_percent || null,
|
||||
purchased_at: purchaseMinerForm.purchased_at || nowDateTimeLocalValue(),
|
||||
total_cost_amount: purchaseMinerForm.total_cost_amount || null,
|
||||
currency: purchaseMinerForm.currency || null,
|
||||
@@ -2413,7 +2437,24 @@
|
||||
key: 'rent-miner',
|
||||
type: 'button',
|
||||
className: 'mc-button mc-button--ghost',
|
||||
onClick: () => setPurchaseMinerModalOpen(true),
|
||||
onClick: () => {
|
||||
setPurchaseMinerForm({
|
||||
offer_id: '',
|
||||
base_offer_id: '',
|
||||
purchased_at: '',
|
||||
label: '',
|
||||
mining_speed_value: '',
|
||||
mining_speed_unit: '',
|
||||
bonus_percent: '',
|
||||
total_cost_amount: '',
|
||||
currency: '',
|
||||
reference_price_amount: '',
|
||||
reference_price_currency: '',
|
||||
auto_renew: false,
|
||||
note: '',
|
||||
});
|
||||
setPurchaseMinerModalOpen(true);
|
||||
},
|
||||
disabled: !availableMinerOffers.length,
|
||||
}, 'Neuen Miner mieten'),
|
||||
]),
|
||||
@@ -2493,14 +2534,14 @@
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
panel('Miner-Angebote', 'Angebote fuer neue Miner und eine grobe Reinvestitionsbewertung auf Basis der aktuellen Leistung.', [
|
||||
panel('Miner-Angebote', 'Hier werden nur Basis-Miner gepflegt. Alle vorgegebenen Geschwindigkeiten und Preise werden daraus automatisch abgeleitet.', [
|
||||
h('div', { key: 'actions', className: 'mc-inline-row' }, [
|
||||
h('button', {
|
||||
key: 'add-offer',
|
||||
type: 'button',
|
||||
className: 'mc-button mc-button--secondary',
|
||||
onClick: () => setMinerOfferModalOpen(true),
|
||||
}, 'Miner-Angebot anlegen'),
|
||||
}, 'Basis-Angebot anlegen'),
|
||||
]),
|
||||
h('div', { key: 'filters', className: 'mc-filter-grid' }, [
|
||||
inputField(`Min. Geschwindigkeit (${minerOfferFilters.speed_unit === 'kh' ? 'kH/s' : 'MH/s'})`, 'number', minerOfferFilters.speed_min, (value) => setMinerOfferFilters({ ...minerOfferFilters, speed_min: value }), '0.0001'),
|
||||
@@ -2548,7 +2589,7 @@
|
||||
h('button', {
|
||||
key: 'scenario',
|
||||
type: 'button',
|
||||
className: cx('mc-button', Number(selectedMinerScenario?.id) === Number(offer.id) ? 'mc-button--secondary' : 'mc-button--ghost'),
|
||||
className: cx('mc-button', String(selectedMinerScenario?.id) === String(offer.id) ? 'mc-button--secondary' : 'mc-button--ghost'),
|
||||
onClick: () => setSelectedMinerScenarioId(offer.id),
|
||||
}, 'Szenario'),
|
||||
h('button', {
|
||||
@@ -2560,7 +2601,7 @@
|
||||
label: offer.label,
|
||||
target_amount_fiat: String(offer.base_price_amount ?? offer.effective_price_amount ?? ''),
|
||||
currency: offer.base_price_currency || offer.effective_price_currency || 'EUR',
|
||||
miner_offer_id: String(offer.id),
|
||||
miner_offer_id: '',
|
||||
is_active: true,
|
||||
sort_order: 0,
|
||||
});
|
||||
@@ -2574,7 +2615,12 @@
|
||||
onClick: () => {
|
||||
setPurchaseMinerForm({
|
||||
offer_id: String(offer.id),
|
||||
base_offer_id: String(offer.base_offer_id || offer.id || ''),
|
||||
purchased_at: nowDateTimeLocalValue(),
|
||||
label: String(offer.label || ''),
|
||||
mining_speed_value: String(offer.mining_speed_value || ''),
|
||||
mining_speed_unit: String(offer.mining_speed_unit || ''),
|
||||
bonus_percent: offer.bonus_percent !== null && offer.bonus_percent !== undefined ? String(offer.bonus_percent) : '',
|
||||
total_cost_amount: offer.effective_price_amount !== null && offer.effective_price_amount !== undefined ? String(offer.effective_price_amount) : '',
|
||||
currency: offer.effective_price_currency || offer.base_price_currency || 'USD',
|
||||
reference_price_amount: offer.base_price_amount !== null && offer.base_price_amount !== undefined ? String(offer.base_price_amount) : '',
|
||||
@@ -2702,8 +2748,7 @@
|
||||
inputField('Laufzeit in Monaten', 'number', String(costPlanForm.runtime_months), (value) => setCostPlanForm({ ...costPlanForm, runtime_months: Number(value) || 0 })),
|
||||
inputField('Mining-Geschwindigkeit', 'number', costPlanForm.mining_speed_value, (value) => setCostPlanForm({ ...costPlanForm, mining_speed_value: value }), '0.0001'),
|
||||
selectField('Mining-Einheit', costPlanForm.mining_speed_unit, speedUnits, (value) => setCostPlanForm({ ...costPlanForm, mining_speed_unit: value })),
|
||||
inputField('Bonus-Geschwindigkeit', 'number', costPlanForm.bonus_speed_value, (value) => setCostPlanForm({ ...costPlanForm, bonus_speed_value: value }), '0.0001'),
|
||||
selectField('Bonus-Einheit', costPlanForm.bonus_speed_unit, speedUnits, (value) => setCostPlanForm({ ...costPlanForm, bonus_speed_unit: value })),
|
||||
inputField('Bonus-Hashrate in %', 'number', costPlanForm.bonus_percent, (value) => setCostPlanForm({ ...costPlanForm, bonus_percent: value }), '0.01'),
|
||||
inputField(`Basispreis in ${settingsForm.report_currency || 'EUR'}`, 'number', costPlanForm.base_price_amount, (value) => setCostPlanForm({ ...costPlanForm, base_price_amount: value }), '0.000001'),
|
||||
selectField('Zahlungsart', costPlanForm.payment_type, [{ value: 'fiat', label: 'FIAT' }, { value: 'crypto', label: 'Krypto' }], (value) => setCostPlanForm({ ...costPlanForm, payment_type: value })),
|
||||
textareaField('Notiz', costPlanForm.note, (value) => setCostPlanForm({ ...costPlanForm, note: value })),
|
||||
@@ -2733,17 +2778,21 @@
|
||||
]),
|
||||
]),
|
||||
], () => setPayoutModalOpen(false)) : null,
|
||||
minerOfferModalOpen ? renderModal('Miner-Angebot anlegen', [
|
||||
minerOfferModalOpen ? renderModal('Basis-Miner-Angebot anlegen', [
|
||||
h('form', { key: 'form', className: 'mc-form', onSubmit: submitMinerOffer }, [
|
||||
inputField('Label', 'text', minerOfferForm.label, (value) => setMinerOfferForm({ ...minerOfferForm, label: value })),
|
||||
inputField('Laufzeit in Monaten', 'number', minerOfferForm.runtime_months, (value) => setMinerOfferForm({ ...minerOfferForm, runtime_months: value })),
|
||||
inputField('Mining-Geschwindigkeit', 'number', minerOfferForm.mining_speed_value, (value) => setMinerOfferForm({ ...minerOfferForm, mining_speed_value: value }), '0.0001'),
|
||||
selectField('Mining-Einheit', minerOfferForm.mining_speed_unit, speedUnits, (value) => setMinerOfferForm({ ...minerOfferForm, mining_speed_unit: value })),
|
||||
inputField('Bonus-Geschwindigkeit', 'number', minerOfferForm.bonus_speed_value, (value) => setMinerOfferForm({ ...minerOfferForm, bonus_speed_value: value }), '0.0001'),
|
||||
selectField('Bonus-Einheit', minerOfferForm.bonus_speed_unit, speedUnits, (value) => setMinerOfferForm({ ...minerOfferForm, bonus_speed_unit: value })),
|
||||
displayField('Basis-Geschwindigkeit', baseOfferSpeedLabel(minerOfferForm.payment_type)),
|
||||
inputField('Bonus-Hashrate in %', 'number', minerOfferForm.bonus_percent, (value) => setMinerOfferForm({ ...minerOfferForm, bonus_percent: value }), '0.01'),
|
||||
inputField('Basispreis', 'number', minerOfferForm.base_price_amount, (value) => setMinerOfferForm({ ...minerOfferForm, base_price_amount: value }), '0.000001'),
|
||||
selectField('Basiswährung', minerOfferForm.base_price_currency, selectableFiatCurrencies.map((currency) => currency.code), (value) => setMinerOfferForm({ ...minerOfferForm, base_price_currency: value })),
|
||||
selectField('Zahlungsart', minerOfferForm.payment_type, [{ value: 'fiat', label: 'FIAT' }, { value: 'crypto', label: 'Krypto' }], (value) => setMinerOfferForm({ ...minerOfferForm, payment_type: value })),
|
||||
selectField('Zahlungsart', minerOfferForm.payment_type, [{ value: 'fiat', label: 'FIAT' }, { value: 'crypto', label: 'Krypto' }], (value) => setMinerOfferForm({
|
||||
...minerOfferForm,
|
||||
payment_type: value,
|
||||
base_price_currency: value === 'crypto'
|
||||
? (currentSettings.crypto_currency || selectableCryptoCurrencies[0]?.code || 'DOGE')
|
||||
: (selectableFiatCurrencies[0]?.code || 'USD'),
|
||||
})),
|
||||
selectField('Basiswährung', minerOfferForm.base_price_currency, (minerOfferForm.payment_type === 'crypto' ? selectableCryptoCurrencies : selectableFiatCurrencies).map((currency) => currency.code), (value) => setMinerOfferForm({ ...minerOfferForm, base_price_currency: value })),
|
||||
h('label', { className: 'mc-checkbox' }, [
|
||||
h('input', { type: 'checkbox', checked: !!minerOfferForm.auto_renew, onChange: (event) => setMinerOfferForm({ ...minerOfferForm, auto_renew: event.target.checked }) }),
|
||||
'Automatische Verlängerung',
|
||||
@@ -2768,7 +2817,12 @@
|
||||
const offer = availableMinerOffers.find((item) => String(item.id) === String(value));
|
||||
setPurchaseMinerForm({
|
||||
offer_id: value,
|
||||
base_offer_id: offer ? String(offer.base_offer_id || offer.id || '') : '',
|
||||
purchased_at: purchaseMinerForm.purchased_at || nowDateTimeLocalValue(),
|
||||
label: offer ? String(offer.label || '') : '',
|
||||
mining_speed_value: offer && offer.mining_speed_value !== null && offer.mining_speed_value !== undefined ? String(offer.mining_speed_value) : '',
|
||||
mining_speed_unit: offer?.mining_speed_unit || '',
|
||||
bonus_percent: offer && offer.bonus_percent !== null && offer.bonus_percent !== undefined ? String(offer.bonus_percent) : '',
|
||||
total_cost_amount: offer && offer.effective_price_amount !== null && offer.effective_price_amount !== undefined ? String(offer.effective_price_amount) : '',
|
||||
currency: offer?.effective_price_currency || offer?.base_price_currency || 'USD',
|
||||
reference_price_amount: offer && offer.reference_price_amount !== null && offer.reference_price_amount !== undefined ? String(offer.reference_price_amount) : '',
|
||||
@@ -2778,6 +2832,8 @@
|
||||
});
|
||||
}),
|
||||
inputField('Mietdatum/-zeit', 'datetime-local', purchaseMinerForm.purchased_at, (value) => setPurchaseMinerForm({ ...purchaseMinerForm, purchased_at: value })),
|
||||
displayField('Gewaehlte Geschwindigkeit', purchaseMinerForm.mining_speed_value && purchaseMinerForm.mining_speed_unit ? `${purchaseMinerForm.mining_speed_value} ${purchaseMinerForm.mining_speed_unit}` : 'n/a'),
|
||||
displayField('Bonus-Hashrate', purchaseMinerForm.bonus_percent ? `${purchaseMinerForm.bonus_percent}%` : 'kein Bonus'),
|
||||
inputField('Exakter Mietpreis', 'number', purchaseMinerForm.total_cost_amount, (value) => setPurchaseMinerForm({ ...purchaseMinerForm, total_cost_amount: value }), '0.000001'),
|
||||
selectField('Mietwährung', purchaseMinerForm.currency, selectableCurrencies.map((currency) => currency.code), (value) => setPurchaseMinerForm({ ...purchaseMinerForm, currency: value })),
|
||||
inputField('Referenzpreis', 'number', purchaseMinerForm.reference_price_amount, (value) => setPurchaseMinerForm({ ...purchaseMinerForm, reference_price_amount: value }), '0.000001'),
|
||||
@@ -2796,11 +2852,11 @@
|
||||
targetModalOpen ? renderModal('Ziel anlegen', [
|
||||
h('form', { key: 'form', className: 'mc-form', onSubmit: submitTarget }, [
|
||||
inputField('Label', 'text', targetForm.label, (value) => setTargetForm({ ...targetForm, label: value })),
|
||||
selectField('Angebots-Verknuepfung', targetForm.miner_offer_id || '', [{ value: '', label: 'Kein verknuepftes Angebot' }].concat(availableMinerOffers.map((offer) => ({
|
||||
selectField('Angebots-Verknuepfung', targetForm.miner_offer_id || '', [{ value: '', label: 'Kein verknuepftes Angebot' }].concat(currentMinerOffers.map((offer) => ({
|
||||
value: String(offer.id),
|
||||
label: `${offer.label} · ${fmtNumber(offer.base_price_amount ?? offer.effective_price_amount, 6)} ${offer.base_price_currency || offer.effective_price_currency}`,
|
||||
label: `${offer.label} · ${fmtNumber(offer.base_price_amount, 6)} ${offer.base_price_currency}`,
|
||||
}))), (value) => {
|
||||
const offer = availableMinerOffers.find((item) => String(item.id) === String(value));
|
||||
const offer = currentMinerOffers.find((item) => String(item.id) === String(value));
|
||||
setTargetForm({
|
||||
...targetForm,
|
||||
miner_offer_id: value,
|
||||
@@ -3051,6 +3107,18 @@
|
||||
return `${label ? label + ' ' : ''}${fmtNumber(value, 4)} ${unit}`;
|
||||
}
|
||||
|
||||
function baseOfferSpeedLabel(paymentType) {
|
||||
return String(paymentType || 'fiat') === 'crypto' ? '75 kH/s' : '50 kH/s';
|
||||
}
|
||||
|
||||
function formatHashrateWithBonus(speedValue, speedUnit, bonusValue, bonusUnit) {
|
||||
const parts = [
|
||||
formatSpeed(speedValue, speedUnit, 'Basis'),
|
||||
Number(bonusValue) > 0 ? formatSpeed(bonusValue, bonusUnit, 'Bonus') : '',
|
||||
].filter(Boolean);
|
||||
return parts.length ? parts.join(' · ') : 'n/a';
|
||||
}
|
||||
|
||||
function formatAdaptiveSpeed(valueMh) {
|
||||
const numericValue = Number(valueMh);
|
||||
if (!Number.isFinite(numericValue)) {
|
||||
|
||||
Reference in New Issue
Block a user