diff --git a/bin/lamassu-update-stackers b/bin/lamassu-update-stackers new file mode 100644 index 00000000..9f2135bc --- /dev/null +++ b/bin/lamassu-update-stackers @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +require('../lib/environment-helper') + +const _ = require('lodash') +const db = require('../lib/db') + +if (process.argv.length !== 4) { + console.log('Usage: lamassu-update-stackers ') + process.exit(1) +} + +if (!_.isFinite(parseInt(process.argv[3]))) { + console.log('Error: is not a valid number (%s)', err) + process.exit(3) +} + +if (parseInt(process.argv[3]) > 3 || parseInt(process.argv[3]) < 1) { + console.log('Error: is out of range. Should be a number between 1 and 3') + process.exit(3) +} + +const deviceId = process.argv[2] +const numberOfStackers = parseInt(process.argv[3]) + +const query = `UPDATE devices SET number_of_stackers = $1 WHERE device_id = $2` + +db.none(query, [numberOfStackers, deviceId]) + .then(() => { + console.log('Success! Device %s updated to %s stackers', deviceId, numberOfStackers) + process.exit(0) + }) + .catch(err => { + console.log('Error: %s', err) + process.exit(3) + }) \ No newline at end of file diff --git a/lib/machine-loader.js b/lib/machine-loader.js index fc55c007..96bc0c26 100644 --- a/lib/machine-loader.js +++ b/lib/machine-loader.js @@ -35,6 +35,7 @@ function toMachineObject (r) { stacker3r: r.stacker3r }, numberOfCassettes: r.number_of_cassettes, + numberOfStackers: r.number_of_stackers, version: r.version, model: r.model, pairedAt: new Date(r.created), diff --git a/lib/new-admin/graphql/types/machine.type.js b/lib/new-admin/graphql/types/machine.type.js index 3daae9c9..8583474f 100644 --- a/lib/new-admin/graphql/types/machine.type.js +++ b/lib/new-admin/graphql/types/machine.type.js @@ -16,6 +16,7 @@ const typeDef = gql` model: String cashUnits: CashUnits numberOfCassettes: Int + numberOfStackers: Int statuses: [MachineStatus] latestEvent: MachineEvent downloadSpeed: String diff --git a/lib/plugins.js b/lib/plugins.js index 5c151ef3..adeaaca8 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -645,6 +645,12 @@ function plugins (settings, deviceId) { const denomination2 = cashOutConfig.cassette2 const denomination3 = cashOutConfig.cassette3 const denomination4 = cashOutConfig.cassette4 + const denomination1f = cashOutConfig.stacker1f + const denomination1r = cashOutConfig.stacker1r + const denomination2f = cashOutConfig.stacker2f + const denomination2r = cashOutConfig.stacker2r + const denomination3f = cashOutConfig.stacker3f + const denomination3r = cashOutConfig.stacker3r const cashOutEnabled = cashOutConfig.active const isCassetteLow = (have, max, limit) => cashOutEnabled && ((have / max) * 100) < limit @@ -708,8 +714,92 @@ function plugins (settings, deviceId) { fiatCode } : null + + const stacker1fAlert = device.numberOfStackers >= 1 && isCassetteLow(device.cashUnits.stacker1f, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker1f) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker1f, + denomination: denomination1f, + fiatCode + } + : null - return _.compact([cashInAlert, cassette1Alert, cassette2Alert, cassette3Alert, cassette4Alert]) + const stacker1rAlert = device.numberOfStackers >= 1 && isCassetteLow(device.cashUnits.stacker1r, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker1r) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker1r, + denomination: denomination1r, + fiatCode + } + : null + + const stacker2fAlert = device.numberOfStackers >= 2 && isCassetteLow(device.cashUnits.stacker2f, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker2f) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker1f, + denomination: denomination1f, + fiatCode + } + : null + + const stacker2rAlert = device.numberOfStackers >= 2 && isCassetteLow(device.cashUnits.stacker2r, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker2r) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker2r, + denomination: denomination2r, + fiatCode + } + : null + + const stacker3fAlert = device.numberOfStackers >= 3 && isCassetteLow(device.cashUnits.stacker3f, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker3f) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker3f, + denomination: denomination3f, + fiatCode + } + : null + + const stacker3rAlert = device.numberOfStackers >= 3 && isCassetteLow(device.cashUnits.stacker3r, CASSETTE_MAX_CAPACITY, notifications.fillingPercentageStacker3r) + ? { + code: 'LOW_CASH_OUT', + cassette: 4, + machineName, + deviceId: device.deviceId, + notes: device.cashUnits.stacker3r, + denomination: denomination3r, + fiatCode + } + : null + + return _.compact([ + cashInAlert, + cassette1Alert, + cassette2Alert, + cassette3Alert, + cassette4Alert, + stacker1fAlert, + stacker1rAlert, + stacker2fAlert, + stacker2rAlert, + stacker3fAlert, + stacker3rAlert + ]) } function checkCryptoBalances (fiatCode, devices) { diff --git a/migrations/1681428616990-aveiro-recycler-settings.js b/migrations/1681428616990-aveiro-recycler-settings.js index d1a9fe5c..cb000e80 100644 --- a/migrations/1681428616990-aveiro-recycler-settings.js +++ b/migrations/1681428616990-aveiro-recycler-settings.js @@ -33,7 +33,8 @@ exports.up = function (next) { ADD COLUMN stacker2f INTEGER NOT NULL DEFAULT 0, ADD COLUMN stacker2r INTEGER NOT NULL DEFAULT 0, ADD COLUMN stacker3f INTEGER NOT NULL DEFAULT 0, - ADD COLUMN stacker3r INTEGER NOT NULL DEFAULT 0`, + ADD COLUMN stacker3r INTEGER NOT NULL DEFAULT 0 + ADD COLUMN number_of_stackers INTEGER NOT NULL DEFAULT 0`, `ALTER TABLE cash_out_txs ADD COLUMN provisioned_1f INTEGER, ADD COLUMN provisioned_1r INTEGER, diff --git a/new-lamassu-admin/src/pages/Cashout/Cashout.js b/new-lamassu-admin/src/pages/Cashout/Cashout.js index d2e674e5..16cacbe3 100644 --- a/new-lamassu-admin/src/pages/Cashout/Cashout.js +++ b/new-lamassu-admin/src/pages/Cashout/Cashout.js @@ -54,6 +54,7 @@ const GET_INFO = gql` stacker3r } numberOfCassettes + numberOfStackers } config } diff --git a/new-lamassu-admin/src/pages/Cashout/Wizard.js b/new-lamassu-admin/src/pages/Cashout/Wizard.js index 87d8b56c..5243f0b8 100644 --- a/new-lamassu-admin/src/pages/Cashout/Wizard.js +++ b/new-lamassu-admin/src/pages/Cashout/Wizard.js @@ -17,7 +17,7 @@ const MODAL_WIDTH = 554 const MODAL_HEIGHT = 520 const Wizard = ({ machine, locale, onClose, save, error }) => { - const LAST_STEP = machine.numberOfCassettes + 1 + const LAST_STEP = machine.numberOfCassettes + machine.numberOfStackers + 1 const [{ step, config }, setState] = useState({ step: 0, config: { active: true } @@ -46,18 +46,48 @@ const Wizard = ({ machine, locale, onClose, save, error }) => { }) } - const steps = R.map( - it => ({ - type: `cassette${it}`, - display: `Cassette ${it}`, - component: Autocomplete, - inputProps: { - options: options, - labelProp: 'display', - valueProp: 'code' - } - }), - R.range(1, machine.numberOfCassettes + 1) + const steps = R.concat( + R.map( + it => ({ + type: `cassette${it}`, + display: `Cassette ${it}`, + component: Autocomplete, + inputProps: { + options: options, + labelProp: 'display', + valueProp: 'code' + } + }), + R.range(1, machine.numberOfCassettes + 1) + ), + R.chain( + it => [ + { + type: `stacker${it}f`, + display: `Stacker ${it}F`, + component: Autocomplete, + inputProps: { + options: options, + labelProp: 'display', + valueProp: 'code' + } + }, + { + type: `stacker${it}r`, + display: `Stacker ${it}R`, + component: Autocomplete, + inputProps: { + options: options, + labelProp: 'display', + valueProp: 'code' + } + } + ], + R.range( + machine.numberOfCassettes + 1, + machine.numberOfCassettes + machine.numberOfStackers + 1 + ) + ) ) const schema = () => diff --git a/new-lamassu-admin/src/pages/Dashboard/SystemStatus/SystemStatus.js b/new-lamassu-admin/src/pages/Dashboard/SystemStatus/SystemStatus.js index 82caafd1..4a3f6004 100644 --- a/new-lamassu-admin/src/pages/Dashboard/SystemStatus/SystemStatus.js +++ b/new-lamassu-admin/src/pages/Dashboard/SystemStatus/SystemStatus.js @@ -38,6 +38,7 @@ const GET_DATA = gql` stacker3r } numberOfCassettes + numberOfStackers statuses { label type diff --git a/new-lamassu-admin/src/pages/Machines/MachineComponents/Cassettes/Cassettes.js b/new-lamassu-admin/src/pages/Machines/MachineComponents/Cassettes/Cassettes.js index 3309ea82..23ad89ab 100644 --- a/new-lamassu-admin/src/pages/Machines/MachineComponents/Cassettes/Cassettes.js +++ b/new-lamassu-admin/src/pages/Machines/MachineComponents/Cassettes/Cassettes.js @@ -50,7 +50,43 @@ const ValidationSchema = Yup.object().shape({ .required('Required') .integer() .min(0) - .max(500) + .max(500), + stacker1f: Yup.number() + .label('Stacker 1F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker1r: Yup.number() + .label('Stacker 1R') + .required('Required') + .integer() + .min(0) + .max(60), + stacker2f: Yup.number() + .label('Stacker 2F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker2r: Yup.number() + .label('Stacker 2R') + .required('Required') + .integer() + .min(0) + .max(60), + stacker3f: Yup.number() + .label('Stacker 3F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker3r: Yup.number() + .label('Stacker 3R') + .required('Required') + .integer() + .min(0) + .max(60) }) const SET_CASSETTE_BILLS = gql` diff --git a/new-lamassu-admin/src/pages/Machines/Machines.js b/new-lamassu-admin/src/pages/Machines/Machines.js index 1e1fffc4..fe195368 100644 --- a/new-lamassu-admin/src/pages/Machines/Machines.js +++ b/new-lamassu-admin/src/pages/Machines/Machines.js @@ -43,6 +43,7 @@ const GET_INFO = gql` stacker3r } numberOfCassettes + numberOfStackers statuses { label type diff --git a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js index 6ea13bd7..efb27a1b 100644 --- a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js +++ b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js @@ -10,8 +10,6 @@ import Modal from 'src/components/Modal' import { IconButton, Button } from 'src/components/buttons' import { Table as EditableTable } from 'src/components/editableTable' import { RadioGroup } from 'src/components/inputs' -import { CashOut, CashIn } from 'src/components/inputs/cashbox/Cashbox' -import { NumberInput, CashCassetteInput } from 'src/components/inputs/formik' import TitleSection from 'src/components/layout/TitleSection' import { EmptyTable } from 'src/components/table' import { P, Label1 } from 'src/components/typography' @@ -20,40 +18,16 @@ import { ReactComponent as ReverseHistoryIcon } from 'src/styling/icons/circle b import { ReactComponent as HistoryIcon } from 'src/styling/icons/circle buttons/history/zodiac.svg' import { fromNamespace, toNamespace } from 'src/utils/config' import { MANUAL, AUTOMATIC } from 'src/utils/constants' -import { hasRecycler } from 'src/utils/machine' import { onlyFirstToUpper } from 'src/utils/string' import styles from './CashCassettes.styles' import CashCassettesFooter from './CashCassettesFooter' import CashboxHistory from './CashboxHistory' import Wizard from './Wizard/Wizard' +import helper from './helper' const useStyles = makeStyles(styles) -const widthsByNumberOfCassettes = { - 2: { - machine: 250, - cashbox: 260, - cassette: 300, - cassetteGraph: 80, - editWidth: 90 - }, - 3: { - machine: 220, - cashbox: 215, - cassette: 225, - cassetteGraph: 60, - editWidth: 90 - }, - 4: { - machine: 190, - cashbox: 180, - cassette: 185, - cassetteGraph: 50, - editWidth: 90 - } -} - const ValidationSchema = Yup.object().shape({ name: Yup.string().required(), cashbox: Yup.number() @@ -85,7 +59,43 @@ const ValidationSchema = Yup.object().shape({ .required() .integer() .min(0) - .max(500) + .max(500), + stacker1f: Yup.number() + .label('Stacker 1F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker1r: Yup.number() + .label('Stacker 1R') + .required('Required') + .integer() + .min(0) + .max(60), + stacker2f: Yup.number() + .label('Stacker 2F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker2r: Yup.number() + .label('Stacker 2R') + .required('Required') + .integer() + .min(0) + .max(60), + stacker3f: Yup.number() + .label('Stacker 3F') + .required('Required') + .integer() + .min(0) + .max(60), + stacker3r: Yup.number() + .label('Stacker 3R') + .required('Required') + .integer() + .min(0) + .max(60) }) const GET_MACHINES_AND_CONFIG = gql` @@ -108,6 +118,7 @@ const GET_MACHINES_AND_CONFIG = gql` stacker3r } numberOfCassettes + numberOfStackers } unpairedMachines { id: deviceId @@ -177,12 +188,11 @@ const CashCassettes = () => { const [machineId, setMachineId] = useState('') const machines = R.path(['machines'])(data) ?? [] - const [nonRecyclerMachines, recyclerMachines] = R.partition(hasRecycler)( - machines - ) + const [stackerMachines, nonStackerMachines] = R.partition( + it => it.numberOfStackers > 0 + )(machines) const unpairedMachines = R.path(['unpairedMachines'])(data) ?? [] const config = R.path(['config'])(data) ?? {} - const fillingPercentageSettings = fromNamespace('notifications', config) const [setCassetteBills, { error }] = useMutation(SET_CASSETTE_BILLS, { refetchQueries: () => ['getData'] }) @@ -200,10 +210,6 @@ const CashCassettes = () => { const cashout = data?.config && fromNamespace('cashOut')(data.config) const locale = data?.config && fromNamespace('locale')(data.config) const fiatCurrency = locale?.fiatCurrency - const maxNumberOfCassettes = Math.max( - ...R.map(it => it.numberOfCassettes, nonRecyclerMachines), - 0 - ) const getCashoutSettings = id => fromNamespace(id)(cashout) const isCashOutDisabled = ({ id }) => !getCashoutSettings(id).active @@ -243,85 +249,23 @@ const CashCassettes = () => { setSelectedRadio(selectedRadio) } - const elements = [ - { - name: 'name', - header: 'Machine', - width: widthsByNumberOfCassettes[maxNumberOfCassettes]?.machine, - view: name => <>{name}, - input: ({ field: { value: name } }) => <>{name} - }, - { - name: 'cashbox', - header: 'Cash box', - width: widthsByNumberOfCassettes[maxNumberOfCassettes]?.cashbox, - view: (_, { id, cashUnits }) => ( - it.fiat, bills[id] ?? []))} - /> - ), - input: NumberInput, - inputProps: { - decimalPlaces: 0 - } - } - ] - - R.until( - R.gt(R.__, maxNumberOfCassettes), - it => { - elements.push({ - name: `cassette${it}`, - header: `Cassette ${it}`, - width: widthsByNumberOfCassettes[maxNumberOfCassettes]?.cassette, - stripe: true, - doubleHeader: 'Cash-out', - view: (_, { id, cashUnits }) => ( - - ), - isHidden: ({ numberOfCassettes }) => it > numberOfCassettes, - input: CashCassetteInput, - inputProps: { - decimalPlaces: 0, - width: widthsByNumberOfCassettes[maxNumberOfCassettes]?.cassetteGraph, - inputClassName: classes.cashbox - } - }) - return R.add(1, it) - }, - 1 + const nonStackerElements = helper.getElements( + nonStackerMachines, + classes, + config, + bills, + setMachineId, + setWizard ) - elements.push({ - name: 'edit', - header: 'Edit', - width: widthsByNumberOfCassettes[maxNumberOfCassettes]?.editWidth, - textAlign: 'center', - view: (_, { id }) => { - return ( - { - setMachineId(id) - setWizard(true) - }}> - - - ) - } - }) + const stackerElements = helper.getElements( + stackerMachines, + classes, + config, + bills, + setMachineId, + setWizard + ) return ( !dataLoading && ( @@ -381,18 +325,18 @@ const CashCassettes = () => { error={error?.message} name="cashboxes" stripeWhen={isCashOutDisabled} - elements={elements} - data={nonRecyclerMachines} + elements={nonStackerElements} + data={nonStackerMachines} validationSchema={ValidationSchema} tbodyWrapperClass={classes.tBody} /> diff --git a/new-lamassu-admin/src/pages/Maintenance/helper.js b/new-lamassu-admin/src/pages/Maintenance/helper.js new file mode 100644 index 00000000..ec525e00 --- /dev/null +++ b/new-lamassu-admin/src/pages/Maintenance/helper.js @@ -0,0 +1,241 @@ +import * as R from 'ramda' + +import { IconButton } from 'src/components/buttons' +import { CashOut, CashIn } from 'src/components/inputs/cashbox/Cashbox' +import { NumberInput, CashCassetteInput } from 'src/components/inputs/formik' +import { ReactComponent as EditIcon } from 'src/styling/icons/action/edit/enabled.svg' +import { fromNamespace } from 'src/utils/config' + +const widthsByCashUnits = { + 2: { + machine: 250, + cashbox: 260, + cassette: 300, + unitGraph: 80, + editWidth: 90 + }, + 3: { + machine: 220, + cashbox: 215, + cassette: 225, + unitGraph: 60, + editWidth: 90 + }, + 4: { + machine: 190, + cashbox: 180, + cassette: 185, + unitGraph: 50, + editWidth: 90 + }, + 5: { + machine: 170, + cashbox: 140, + cassette: 160, + unitGraph: 45, + editWidth: 90 + }, + 6: { + machine: 150, + cashbox: 130, + cassette: 142, + unitGraph: 45, + editWidth: 70 + }, + 7: { + machine: 140, + cashbox: 115, + cassette: 125, + unitGraph: 40, + editWidth: 70 + }, + 8: { + machine: 100, + cashbox: 115, + cassette: 122, + unitGraph: 35, + editWidth: 70 + } +} + +const getMaxNumberOfCassettesMap = machines => + Math.max(...R.map(it => it.numberOfCassettes, machines), 0) + +const getMaxNumberOfStackersMap = machines => + Math.max(...R.map(it => it.numberOfStackers, machines), 0) + +// Each stacker counts as two cash units (front and rear) +const getMaxNumberOfCashUnits = machines => + Math.max( + ...R.map(it => it.numberOfCassettes + it.numberOfStackers * 2, machines), + 0 + ) + +const getElements = ( + machines, + classes, + config, + bills, + setMachineId, + setWizard +) => { + const fillingPercentageSettings = fromNamespace('notifications', config) + const locale = fromNamespace('locale')(config) + const cashout = fromNamespace('cashOut')(config) + const fiatCurrency = locale?.fiatCurrency + + const getCashoutSettings = id => fromNamespace(id)(cashout) + + const elements = [ + { + name: 'name', + header: 'Machine', + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.machine, + view: name => <>{name}, + input: ({ field: { value: name } }) => <>{name} + }, + { + name: 'cashbox', + header: 'Cash box', + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.cashbox, + view: (_, { id, cashUnits }) => ( + it.fiat, bills[id] ?? []))} + /> + ), + input: NumberInput, + inputProps: { + decimalPlaces: 0 + } + } + ] + + R.until( + R.gt(R.__, getMaxNumberOfCassettesMap(machines)), + it => { + elements.push({ + name: `cassette${it}`, + header: `Cassette ${it}`, + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.cassette, + stripe: true, + doubleHeader: 'Cash-out', + view: (_, { id, cashUnits }) => ( + + ), + isHidden: ({ numberOfCassettes }) => it > numberOfCassettes, + input: CashCassetteInput, + inputProps: { + decimalPlaces: 0, + width: + widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.unitGraph, + inputClassName: classes.cashbox + } + }) + return R.add(1, it) + }, + 1 + ) + + R.until( + R.gt(R.__, getMaxNumberOfStackersMap(machines)), + it => { + elements.push( + { + name: `stacker${it}f`, + header: `Stacker ${it}F`, + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.cassette, + stripe: true, + doubleHeader: 'Cash recycling', + view: (_, { id, cashUnits }) => ( + + ), + isHidden: ({ numberOfStackers }) => it > numberOfStackers, + input: CashCassetteInput, + inputProps: { + decimalPlaces: 0, + width: + widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.unitGraph, + inputClassName: classes.cashbox + } + }, + { + name: `stacker${it}r`, + header: `Stacker ${it}R`, + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.cassette, + stripe: true, + doubleHeader: 'Cash recycling', + view: (_, { id, cashUnits }) => ( + + ), + isHidden: ({ numberOfStackers }) => it > numberOfStackers, + input: CashCassetteInput, + inputProps: { + decimalPlaces: 0, + width: + widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.unitGraph, + inputClassName: classes.cashbox + } + } + ) + return R.add(1, it) + }, + 1 + ) + + elements.push({ + name: 'edit', + header: 'Edit', + width: widthsByCashUnits[getMaxNumberOfCashUnits(machines)]?.editWidth, + textAlign: 'center', + view: (_, { id }) => { + return ( + { + setMachineId(id) + setWizard(true) + }}> + + + ) + } + }) + + return elements +} + +export default { getElements } diff --git a/new-lamassu-admin/src/pages/Notifications/Notifications.js b/new-lamassu-admin/src/pages/Notifications/Notifications.js index b79eb9a7..a053ab9d 100644 --- a/new-lamassu-admin/src/pages/Notifications/Notifications.js +++ b/new-lamassu-admin/src/pages/Notifications/Notifications.js @@ -28,6 +28,7 @@ const GET_INFO = gql` name deviceId numberOfCassettes + numberOfStackers } cryptoCurrencies { code diff --git a/new-lamassu-admin/src/utils/machine.js b/new-lamassu-admin/src/utils/machine.js index d3edfae1..e2cf97f9 100644 --- a/new-lamassu-admin/src/utils/machine.js +++ b/new-lamassu-admin/src/utils/machine.js @@ -7,9 +7,6 @@ const modelPrettifier = { grandola: 'GrĂ¢ndola' } -const hasRecycler = machine => - machine.model === 'aveiro' || machine.model === 'grandola' - const cashUnitCapacity = { tejo: { cashbox: 1000, @@ -22,4 +19,4 @@ const cashUnitCapacity = { } } -export { modelPrettifier, cashUnitCapacity, hasRecycler } +export { modelPrettifier, cashUnitCapacity }