Reintroduce cashbox (#535)
* feat: reintroduce cashbox component * feat: cashbox update on db * feat: cashbox on notifications * feat: cashbox on overrides * fix: cashin notifications * fix: styling * feat: cashin bills added to cashbox * refactor: comment unused code * fix: new bills length on cashbox * fix: remove unused code * chore: remove temporary code
This commit is contained in:
parent
0d3eb2e392
commit
26c5c427bf
6 changed files with 55 additions and 18 deletions
|
|
@ -46,8 +46,14 @@ function insertNewBills (t, billRows, machineTx) {
|
||||||
const dbBills = _.map(cashInLow.massage, bills)
|
const dbBills = _.map(cashInLow.massage, bills)
|
||||||
const columns = ['id', 'fiat', 'fiat_code', 'crypto_code', 'cash_in_fee', 'cash_in_txs_id', 'device_time']
|
const columns = ['id', 'fiat', 'fiat_code', 'crypto_code', 'cash_in_fee', 'cash_in_txs_id', 'device_time']
|
||||||
const sql = pgp.helpers.insert(dbBills, columns, 'bills')
|
const sql = pgp.helpers.insert(dbBills, columns, 'bills')
|
||||||
|
const deviceID = machineTx.deviceId
|
||||||
|
const sql2 = `update devices set cashbox = cashbox + $2
|
||||||
|
where device_id = $1`
|
||||||
|
|
||||||
|
return t.none(sql2, [deviceID, dbBills.length])
|
||||||
|
.then(() => {
|
||||||
return t.none(sql)
|
return t.none(sql)
|
||||||
|
})
|
||||||
.then(() => bills)
|
.then(() => bills)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,11 @@ function emptyCashInBills (rec) {
|
||||||
return db.none(sql, [rec.deviceId])
|
return db.none(sql, [rec.deviceId])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setCassetteBills (rec) {
|
||||||
|
const sql = 'update devices set cashbox=$1, cassette1=$2, cassette2=$3 where device_id=$4'
|
||||||
|
return db.none(sql, [rec.cashbox, rec.cassettes[0], rec.cassettes[1], rec.deviceId])
|
||||||
|
}
|
||||||
|
|
||||||
function unpair (rec) {
|
function unpair (rec) {
|
||||||
return pairing.unpair(rec.deviceId)
|
return pairing.unpair(rec.deviceId)
|
||||||
}
|
}
|
||||||
|
|
@ -129,6 +134,7 @@ function setMachine (rec) {
|
||||||
case 'rename': return renameMachine(rec)
|
case 'rename': return renameMachine(rec)
|
||||||
case 'emptyCashInBills': return emptyCashInBills(rec)
|
case 'emptyCashInBills': return emptyCashInBills(rec)
|
||||||
case 'resetCashOutBills': return resetCashOutBills(rec)
|
case 'resetCashOutBills': return resetCashOutBills(rec)
|
||||||
|
case 'setCassetteBills': return setCassetteBills(rec)
|
||||||
case 'unpair': return unpair(rec)
|
case 'unpair': return unpair(rec)
|
||||||
case 'reboot': return reboot(rec)
|
case 'reboot': return reboot(rec)
|
||||||
case 'shutdown': return shutdown(rec)
|
case 'shutdown': return shutdown(rec)
|
||||||
|
|
|
||||||
|
|
@ -275,6 +275,7 @@ const typeDefs = gql`
|
||||||
rename
|
rename
|
||||||
emptyCashInBills
|
emptyCashInBills
|
||||||
resetCashOutBills
|
resetCashOutBills
|
||||||
|
setCassetteBills
|
||||||
unpair
|
unpair
|
||||||
reboot
|
reboot
|
||||||
shutdown
|
shutdown
|
||||||
|
|
@ -282,7 +283,7 @@ const typeDefs = gql`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Mutation {
|
type Mutation {
|
||||||
machineAction(deviceId:ID!, action: MachineAction!, cassette1: Int, cassette2: Int, newName: String): Machine
|
machineAction(deviceId:ID!, action: MachineAction!, cashbox: Int, cassette1: Int, cassette2: Int, newName: String): Machine
|
||||||
setCustomer(customerId: ID!, customerInput: CustomerInput): Customer
|
setCustomer(customerId: ID!, customerInput: CustomerInput): Customer
|
||||||
saveConfig(config: JSONObject): JSONObject
|
saveConfig(config: JSONObject): JSONObject
|
||||||
resetConfig(schemaVersion: Int): JSONObject
|
resetConfig(schemaVersion: Int): JSONObject
|
||||||
|
|
@ -348,7 +349,7 @@ const resolvers = {
|
||||||
coupons: () => couponManager.getAvailableCoupons()
|
coupons: () => couponManager.getAvailableCoupons()
|
||||||
},
|
},
|
||||||
Mutation: {
|
Mutation: {
|
||||||
machineAction: (...[, { deviceId, action, cassette1, cassette2, newName }]) => machineAction({ deviceId, action, cassette1, cassette2, newName }),
|
machineAction: (...[, { deviceId, action, cashbox, cassette1, cassette2, newName }]) => machineAction({ deviceId, action, cashbox, cassette1, cassette2, newName }),
|
||||||
createPairingTotem: (...[, { name }]) => pairing.totem(name),
|
createPairingTotem: (...[, { name }]) => pairing.totem(name),
|
||||||
saveAccounts: (...[, { accounts }]) => settingsLoader.saveAccounts(accounts),
|
saveAccounts: (...[, { accounts }]) => settingsLoader.saveAccounts(accounts),
|
||||||
resetAccounts: (...[, { schemaVersion }]) => settingsLoader.resetAccounts(schemaVersion),
|
resetAccounts: (...[, { schemaVersion }]) => settingsLoader.resetAccounts(schemaVersion),
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,13 @@ function getMachine (machineId) {
|
||||||
.then(machines => machines.find(({ deviceId }) => deviceId === machineId))
|
.then(machines => machines.find(({ deviceId }) => deviceId === machineId))
|
||||||
}
|
}
|
||||||
|
|
||||||
function machineAction ({ deviceId, action, cassette1, cassette2, newName }) {
|
function machineAction ({ deviceId, action, cashbox, cassette1, cassette2, newName }) {
|
||||||
return getMachine(deviceId)
|
return getMachine(deviceId)
|
||||||
.then(machine => {
|
.then(machine => {
|
||||||
if (!machine) throw new UserInputError(`machine:${deviceId} not found`, { deviceId })
|
if (!machine) throw new UserInputError(`machine:${deviceId} not found`, { deviceId })
|
||||||
return machine
|
return machine
|
||||||
})
|
})
|
||||||
.then(machineLoader.setMachine({ deviceId, action, cassettes: [cassette1, cassette2], newName }))
|
.then(machineLoader.setMachine({ deviceId, action, cashbox, cassettes: [cassette1, cassette2], newName }))
|
||||||
.then(getMachine(deviceId))
|
.then(getMachine(deviceId))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,19 +31,19 @@ const Cashbox = ({ percent = 0, cashOut = false, className }) => {
|
||||||
|
|
||||||
// https://support.lamassu.is/hc/en-us/articles/360025595552-Installing-the-Sintra-Forte
|
// https://support.lamassu.is/hc/en-us/articles/360025595552-Installing-the-Sintra-Forte
|
||||||
// Sintra and Sintra Forte can have up to 500 notes per cashOut box and up to 1000 per cashIn box
|
// Sintra and Sintra Forte can have up to 500 notes per cashOut box and up to 1000 per cashIn box
|
||||||
const CashIn = ({ capacity = 1000, notes = 0, total = 0 }) => {
|
const CashIn = ({ currency, notes, total }) => {
|
||||||
const percent = (100 * notes) / capacity
|
|
||||||
const classes = gridClasses()
|
const classes = gridClasses()
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className={classes.row}>
|
<div className={classes.row}>
|
||||||
<div>
|
|
||||||
<Cashbox percent={percent} />
|
|
||||||
</div>
|
|
||||||
<div className={classes.col2}>
|
<div className={classes.col2}>
|
||||||
<div>
|
<div className={classes.innerRow}>
|
||||||
<Info2 className={classes.noMarginText}>{notes} notes</Info2>
|
<Info2 className={classes.noMarginText}>{notes} notes</Info2>
|
||||||
<Label1 className={classes.noMarginText}>{total}</Label1>
|
</div>
|
||||||
|
<div className={classes.innerRow}>
|
||||||
|
<Label1 className={classes.noMarginText}>
|
||||||
|
{total} {currency.code}
|
||||||
|
</Label1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import React from 'react'
|
||||||
import * as Yup from 'yup'
|
import * as Yup from 'yup'
|
||||||
|
|
||||||
import { Table as EditableTable } from 'src/components/editableTable'
|
import { Table as EditableTable } from 'src/components/editableTable'
|
||||||
import { CashOut } from 'src/components/inputs/cashbox/Cashbox'
|
import { CashOut, CashIn } from 'src/components/inputs/cashbox/Cashbox'
|
||||||
import { NumberInput } from 'src/components/inputs/formik'
|
import { NumberInput } from 'src/components/inputs/formik'
|
||||||
import TitleSection from 'src/components/layout/TitleSection'
|
import TitleSection from 'src/components/layout/TitleSection'
|
||||||
import { fromNamespace } from 'src/utils/config'
|
import { fromNamespace } from 'src/utils/config'
|
||||||
|
|
@ -16,6 +16,12 @@ const useStyles = makeStyles(styles)
|
||||||
|
|
||||||
const ValidationSchema = Yup.object().shape({
|
const ValidationSchema = Yup.object().shape({
|
||||||
name: Yup.string().required(),
|
name: Yup.string().required(),
|
||||||
|
cashbox: Yup.number()
|
||||||
|
.label('Cashbox')
|
||||||
|
.required()
|
||||||
|
.integer()
|
||||||
|
.min(0)
|
||||||
|
.max(1000),
|
||||||
cassette1: Yup.number()
|
cassette1: Yup.number()
|
||||||
.label('Cassette 1 (top)')
|
.label('Cassette 1 (top)')
|
||||||
.required()
|
.required()
|
||||||
|
|
@ -35,6 +41,7 @@ const GET_MACHINES_AND_CONFIG = gql`
|
||||||
machines {
|
machines {
|
||||||
name
|
name
|
||||||
id: deviceId
|
id: deviceId
|
||||||
|
cashbox
|
||||||
cassette1
|
cassette1
|
||||||
cassette2
|
cassette2
|
||||||
}
|
}
|
||||||
|
|
@ -42,20 +49,23 @@ const GET_MACHINES_AND_CONFIG = gql`
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
const RESET_CASHOUT_BILLS = gql`
|
const SET_CASSETTE_BILLS = gql`
|
||||||
mutation MachineAction(
|
mutation MachineAction(
|
||||||
$deviceId: ID!
|
$deviceId: ID!
|
||||||
$action: MachineAction!
|
$action: MachineAction!
|
||||||
|
$cashbox: Int!
|
||||||
$cassette1: Int!
|
$cassette1: Int!
|
||||||
$cassette2: Int!
|
$cassette2: Int!
|
||||||
) {
|
) {
|
||||||
machineAction(
|
machineAction(
|
||||||
deviceId: $deviceId
|
deviceId: $deviceId
|
||||||
action: $action
|
action: $action
|
||||||
|
cashbox: $cashbox
|
||||||
cassette1: $cassette1
|
cassette1: $cassette1
|
||||||
cassette2: $cassette2
|
cassette2: $cassette2
|
||||||
) {
|
) {
|
||||||
deviceId
|
deviceId
|
||||||
|
cashbox
|
||||||
cassette1
|
cassette1
|
||||||
cassette2
|
cassette2
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +77,7 @@ const CashCassettes = () => {
|
||||||
|
|
||||||
const { data } = useQuery(GET_MACHINES_AND_CONFIG)
|
const { data } = useQuery(GET_MACHINES_AND_CONFIG)
|
||||||
|
|
||||||
const [resetCashOut, { error }] = useMutation(RESET_CASHOUT_BILLS, {
|
const [setCassetteBills, { error }] = useMutation(SET_CASSETTE_BILLS, {
|
||||||
refetchQueries: () => ['getData']
|
refetchQueries: () => ['getData']
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -75,11 +85,12 @@ const CashCassettes = () => {
|
||||||
const locale = data?.config && fromNamespace('locale')(data.config)
|
const locale = data?.config && fromNamespace('locale')(data.config)
|
||||||
const fiatCurrency = locale?.fiatCurrency
|
const fiatCurrency = locale?.fiatCurrency
|
||||||
|
|
||||||
const onSave = (...[, { id, cassette1, cassette2 }]) => {
|
const onSave = (...[, { id, cashbox, cassette1, cassette2 }]) => {
|
||||||
return resetCashOut({
|
return setCassetteBills({
|
||||||
variables: {
|
variables: {
|
||||||
action: 'resetCashOutBills',
|
action: 'setCassetteBills',
|
||||||
deviceId: id,
|
deviceId: id,
|
||||||
|
cashbox,
|
||||||
cassette1,
|
cassette1,
|
||||||
cassette2
|
cassette2
|
||||||
}
|
}
|
||||||
|
|
@ -97,6 +108,19 @@ const CashCassettes = () => {
|
||||||
view: name => <>{name}</>,
|
view: name => <>{name}</>,
|
||||||
input: ({ field: { value: name } }) => <>{name}</>
|
input: ({ field: { value: name } }) => <>{name}</>
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'cashbox',
|
||||||
|
header: 'Cashbox',
|
||||||
|
width: 240,
|
||||||
|
stripe: true,
|
||||||
|
view: value => (
|
||||||
|
<CashIn currency={{ code: fiatCurrency }} notes={value} total={0} />
|
||||||
|
),
|
||||||
|
input: NumberInput,
|
||||||
|
inputProps: {
|
||||||
|
decimalPlaces: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'cassette1',
|
name: 'cassette1',
|
||||||
header: 'Cassette 1 (Top)',
|
header: 'Cassette 1 (Top)',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue