feat: fiat balance alerts to percentages and config migration

This commit is contained in:
José Oliveira 2021-05-03 16:02:30 +01:00 committed by Josh Harvey
parent 0c0133d01c
commit 3de12e3f6e
7 changed files with 95 additions and 38 deletions

View file

@ -599,7 +599,7 @@ function plugins (settings, deviceId) {
}
: null
const cassette1Alert = cashOutEnabled && device.cassette1 < notifications.fiatBalanceCassette1
const cassette1Alert = cashOutEnabled && (device.cassette1 / 500) < notifications.fillingPercentageCassette1
? {
code: 'LOW_CASH_OUT',
cassette: 1,
@ -611,7 +611,7 @@ function plugins (settings, deviceId) {
}
: null
const cassette2Alert = cashOutEnabled && device.cassette2 < notifications.fiatBalanceCassette2
const cassette2Alert = cashOutEnabled && (device.cassette2 / 500) < notifications.fillingPercentageCassette2
? {
code: 'LOW_CASH_OUT',
cassette: 2,

View file

@ -0,0 +1,52 @@
const _ = require('lodash/fp')
const { saveConfig, loadLatest } = require('../lib/new-settings-loader')
exports.up = function (next) {
loadLatest()
.then(({ config }) => {
const fiatBalance1 = config.notifications_fiatBalanceCassette1
const fiatBalance2 = config.notifications_fiatBalanceCassette2
if (fiatBalance1) {
config.notifications_fiatBalanceCassette1 = (100 * (fiatBalance1 / 500)).toFixed(0)
}
if (fiatBalance2) {
config.notifications_fiatBalanceCassette2 = (100 * (fiatBalance2 / 500)).toFixed(0)
}
const {
notifications_fiatBalanceCassette1: notifications_fillingPercentageCassette1,
notifications_fiatBalanceCassette2: notifications_fillingPercentageCassette2,
...rest
} = config
config = { notifications_fillingPercentageCassette1, notifications_fillingPercentageCassette2, ...rest }
config.notifications_fiatBalanceOverrides = _.map(override => {
if (override.fiatBalanceCassette1) {
override.fiatBalanceCassette1 = (100 * (override.fiatBalanceCassette1 / 500)).toFixed(0)
}
if (override.fiatBalanceCassette2) {
override.fiatBalanceCassette2 = (100 * (override.fiatBalanceCassette2 / 500)).toFixed(0)
}
const {
fiatBalanceCassette1: fillingPercentageCassette1,
fiatBalanceCassette2: fillingPercentageCassette2,
...rest } = override
return { fillingPercentageCassette1, fillingPercentageCassette2, ...rest }
}, config.notifications_fiatBalanceOverrides)
return saveConfig(config)
.then(() => next())
})
.catch(err => {
if (err.message === 'lamassu-server is not configured') {
return next()
}
console.log(err.message)
return next(err)
})
}
module.exports.down = function (next) {
next()
}

View file

@ -18,20 +18,26 @@ const Cashbox = ({
cashOut = false,
className,
emptyPartClassName,
labelClassName
labelClassName,
inFiatBalanceAlerts
}) => {
const classes = cashboxClasses({ percent, cashOut })
const threshold = 51
return (
<div className={classnames(className, classes.cashbox)}>
<div
className={
inFiatBalanceAlerts
? classnames(className, classes.fiatBalanceAlertCashbox)
: classnames(className, classes.cashbox)
}>
<div className={classnames(emptyPartClassName, classes.emptyPart)}>
{percent <= threshold && (
{!inFiatBalanceAlerts && percent <= threshold && (
<Label2 className={labelClassName}>{percent.toFixed(0)}%</Label2>
)}
</div>
<div className={classes.fullPart}>
{percent > threshold && (
{!inFiatBalanceAlerts && percent > threshold && (
<Label2 className={labelClassName}>{percent.toFixed(0)}%</Label2>
)}
</div>

View file

@ -24,6 +24,13 @@ const cashboxStyles = {
textAlign: 'end',
display: 'inline-block'
},
fiatBalanceAlertCashbox: {
borderColor: colorPicker,
backgroundColor: colorPicker,
height: 118,
width: 80,
border: '4px solid'
},
emptyPart: {
backgroundColor: 'white',
height: ({ percent }) => `${100 - percent}%`,

View file

@ -116,7 +116,7 @@ const Notifications = ({
<Section
title="Fiat balance alerts"
error={error && section === 'fiat'}>
<FiatBalanceAlerts section="fiat" max={500} fieldWidth={50} />
<FiatBalanceAlerts section="fiat" max={100} fieldWidth={50} />
{displayOverrides && <FiatBalanceOverrides section="fiat" />}
</Section>
)}

View file

@ -18,12 +18,7 @@ const useStyles = makeStyles(styles)
const NAME = 'fiatBalanceAlerts'
const FiatBalance = ({
section,
min = 0,
max = Number.MAX_SAFE_INTEGER,
fieldWidth = 80
}) => {
const FiatBalance = ({ section, min = 0, max = 100, fieldWidth = 80 }) => {
const { isEditing, isDisabled, setEditing, data, save } = useContext(
NotificationsCtx
)
@ -32,13 +27,13 @@ const FiatBalance = ({
const editing = isEditing(NAME)
const schema = Yup.object().shape({
fiatBalanceCassette1: Yup.number()
fillingPercentageCassette1: Yup.number()
.transform(transformNumber)
.integer()
.min(min)
.max(max)
.nullable(),
fiatBalanceCassette2: Yup.number()
fillingPercentageCassette2: Yup.number()
.transform(transformNumber)
.integer()
.min(min)
@ -46,19 +41,14 @@ const FiatBalance = ({
.nullable()
})
const fiatBalanceCassette1Percent =
(100 * (data?.fiatBalanceCassette1 ?? 0)) / max
const fiatBalanceCassette2Percent =
(100 * (data?.fiatBalanceCassette2 ?? 0)) / max
return (
<Formik
validateOnBlur={false}
validateOnChange={false}
enableReinitialize
initialValues={{
fiatBalanceCassette1: data?.fiatBalanceCassette1 ?? '',
fiatBalanceCassette2: data?.fiatBalanceCassette2 ?? ''
fillingPercentageCassette1: data?.fillingPercentageCassette1 ?? '',
fillingPercentageCassette2: data?.fillingPercentageCassette2 ?? ''
}}
validationSchema={schema}
onSubmit={it => save(section, schema.cast(it))}
@ -79,17 +69,18 @@ const FiatBalance = ({
<Cashbox
labelClassName={classes.cashboxLabel}
emptyPartClassName={classes.cashboxEmptyPart}
percent={fiatBalanceCassette1Percent}
percent={data?.fillingPercentageCassette1}
inFiatBalanceAlerts={true}
cashOut
/>
<div className={classes.col2}>
<TL2 className={classes.title}>Cassette 1 (Top)</TL2>
<EditableNumber
label="Alert me under"
name="fiatBalanceCassette1"
name="fillingPercentageCassette1"
editing={editing}
displayValue={x => (x === '' ? '-' : x)}
decoration="notes"
decoration="%"
width={fieldWidth}
/>
</div>
@ -99,17 +90,18 @@ const FiatBalance = ({
<Cashbox
labelClassName={classes.cashboxLabel}
emptyPartClassName={classes.cashboxEmptyPart}
percent={fiatBalanceCassette2Percent}
percent={data?.fillingPercentageCassette2}
inFiatBalanceAlerts={true}
cashOut
/>
<div className={classes.col2}>
<TL2 className={classes.title}>Cassette 2 (Bottom)</TL2>
<EditableNumber
label="Alert me under"
name="fiatBalanceCassette2"
name="fillingPercentageCassette2"
editing={editing}
displayValue={x => (x === '' ? '-' : x)}
decoration="notes"
decoration="%"
width={fieldWidth}
/>
</div>

View file

@ -9,8 +9,8 @@ import { transformNumber } from 'src/utils/number'
import NotificationsCtx from '../NotificationsContext'
const CASSETTE_1_KEY = 'fiatBalanceCassette1'
const CASSETTE_2_KEY = 'fiatBalanceCassette2'
const CASSETTE_1_KEY = 'fillingPercentageCassette1'
const CASSETTE_2_KEY = 'fillingPercentageCassette2'
const MACHINE_KEY = 'machine'
const NAME = 'fiatBalanceOverrides'
@ -44,8 +44,8 @@ const FiatBalanceOverrides = ({ section }) => {
[CASSETTE_2_KEY]: ''
}
const notesMin = 0
const notesMax = 9999999
const percentMin = 0
const percentMax = 100
const validationSchema = Yup.object().shape(
{
[MACHINE_KEY]: Yup.string()
@ -60,8 +60,8 @@ const FiatBalanceOverrides = ({ section }) => {
})
.transform(transformNumber)
.integer()
.min(notesMin)
.max(notesMax)
.min(percentMin)
.max(percentMax)
.nullable(),
[CASSETTE_2_KEY]: Yup.number()
.label('Cassette 2 (bottom)')
@ -71,8 +71,8 @@ const FiatBalanceOverrides = ({ section }) => {
})
.transform(transformNumber)
.integer()
.min(notesMin)
.max(notesMax)
.min(percentMin)
.max(percentMax)
.nullable()
},
[CASSETTE_1_KEY, CASSETTE_2_KEY]
@ -102,7 +102,7 @@ const FiatBalanceOverrides = ({ section }) => {
doubleHeader: 'Cash-out (Cassette Empty)',
bold: true,
input: NumberInput,
suffix: 'notes',
suffix: '%',
inputProps: {
decimalPlaces: 0
}
@ -115,7 +115,7 @@ const FiatBalanceOverrides = ({ section }) => {
doubleHeader: 'Cash-out (Cassette Empty)',
bold: true,
input: NumberInput,
suffix: 'notes',
suffix: '%',
inputProps: {
decimalPlaces: 0
}