diff --git a/frontend/Entry.elm b/frontend/Entry.elm index b410caa..c4c91a5 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -69,6 +69,16 @@ type alias TaxGroup = , percentage : Float } +type alias NewItem = + { barcode : String + , name : String + , salesUnits : Int + , group : Group + , location : Location + , netUnitPrice : Float + , taxGroup : TaxGroup + } + type alias Context = { globals : Globals , state : State @@ -135,11 +145,12 @@ updateState msg globals state = case state of case find (\tg -> tg.id == searchResult.taxGroupId) globals.taxGroups of Nothing -> (state, Cmd.none) Just taxGroup -> - ( ItemEditor <| updateGrossUnitPrice + ( ItemEditor { barcode = searchResult.barcode , name = searchResult.name , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice - , grossUnitPrice = NumberInput.fromFloat 0 + , grossUnitPrice = NumberInput.fromFloat + (suggestedGrossPrice searchResult.netUnitPrice taxGroup.percentage) , salesUnits = NumberInput.fromInt searchResult.salesUnits , group = Select.init (.id >> String.fromInt) (.name) { id = searchResult.groupId, name = searchResult.groupName } globals.groups , location = Select.init (.id >> String.fromInt) (.name) { id = searchResult.locationId, name = searchResult.locationName } globals.locations @@ -157,26 +168,26 @@ updateState msg globals state = case state of SetSalesUnits str -> (ItemEditor { model | salesUnits = NumberInput.update str model.salesUnits }, Cmd.none) SetNetUnitPrice str -> - ( ItemEditor <| updateGrossUnitPrice { model | netUnitPrice = NumberInput.update str model.netUnitPrice } + ( ItemEditor { model | netUnitPrice = NumberInput.update str model.netUnitPrice } , Cmd.none ) SetGrossUnitPrice str -> - (ItemEditor { model | grossUnitPrice = NumberInput.update str model.grossUnitPrice }, Cmd.none) + ( ItemEditor { model | grossUnitPrice = NumberInput.update str model.grossUnitPrice } + , Cmd.none + ) SetGroup key -> (ItemEditor { model | group = Select.update key model.group }, Cmd.none) SetLocation key -> (ItemEditor { model | location = Select.update key model.location }, Cmd.none) SetTaxGroup key -> - ( ItemEditor <| updateGrossUnitPrice { model | taxGroup = Select.update key model.taxGroup } + ( ItemEditor { model | taxGroup = Select.update key model.taxGroup } , Cmd.none ) _ -> (state, Cmd.none) -updateGrossUnitPrice model = - { model - | grossUnitPrice = Maybe.withDefault model.grossUnitPrice <| Maybe.map NumberInput.fromFloat <| calculateGarfieldPrice model - } +suggestedGrossPrice netPrice percentage = + roundTo 2 <| netPrice * (1 + percentage) + 0.01 -- View stuff @@ -217,7 +228,7 @@ view { globals, state } = case state of , Select.view SetLocation model.location ] , div [ class "form-input" ] - [ label [ for "net-unit-price" ] [ text "Stückpreis (Netto)" ] + [ label [ for "net-unit-price" ] [ text "Einkaufspreis (Netto)" ] , input [ value <| NumberInput.show model.netUnitPrice , onInput SetNetUnitPrice @@ -231,29 +242,36 @@ view { globals, state } = case state of [ label [ for "tax-group" ] [ text "Steuergruppe" ] , Select.view SetTaxGroup model.taxGroup ] - ] - , fieldset [] - [ legend [] [ text "Neuer Snackeintrag" ] , div [ class "form-input" ] - [ label [ for "snack-name" ] [ text "Name" ] - , input [ value model.name, disabled True, id "snack-name" ] [] + [ label [ for "gross-unit-price" ] [ text "Verkaufspreis (Brutto)" ] + , input + [ value <| NumberInput.show model.grossUnitPrice + , onInput SetGrossUnitPrice + , type_ "number" + , id "gross-unit-price" + , step "0.01" + ] + [] + , viewSetSuggestedPriceButton model ] - , viewGrossUnitPriceInput model ] ] -viewGrossUnitPriceInput model = - let - suggestedPriceStr = case calculateGarfieldPrice model of - Nothing -> "?" - Just suggestedPrice -> String.fromFloat suggestedPrice - in - div [ class "form-input" ] - [ label [ for "gross-unit-price" ] - [ text <| "Stückpreis (Brutto), Vorschlag: " ++ suggestedPriceStr - ] - , input [ onInput SetGrossUnitPrice, value <| NumberInput.show model.grossUnitPrice, id "gross-unit-price", type_ "number", step "0.01" ] [] - ] +viewSetSuggestedPriceButton model = + case NumberInput.get model.netUnitPrice of + Nothing -> + button [ disabled True ] [ text "Auf ? setzen" ] + Just netUnitPrice -> + let + grossUnitPrice = suggestedGrossPrice netUnitPrice (Select.get model.taxGroup).percentage + in + button + [ onClick <| SetGrossUnitPrice <| String.fromFloat grossUnitPrice + -- Prevent submitting the form + , type_ "button" + ] + [ text <| "Auf " ++ String.fromFloat grossUnitPrice ++ " setzen" + ] searchResultHeaders = tr [] diff --git a/jon/static/entry.js b/jon/static/entry.js index 16b7f6b..fd6e49f 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11119,6 +11119,17 @@ var $author$project$Entry$searchResultDecoder = A3( 'item_barcode', $elm$json$Json$Decode$string, $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$round = _Basics_round; +var $author$project$Entry$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Entry$suggestedGrossPrice = F2( + function (netPrice, percentage) { + return A2($author$project$Entry$roundTo, 2, (netPrice * (1 + percentage)) + 0.01); + }); var $author$project$NumberInput$update = F2( function (str, model) { return _Utils_update( @@ -11152,53 +11163,6 @@ var $author$project$Select$update = F2( {selected: x}); } }); -var $author$project$NumberInput$get = function ($) { - return $.value; -}; -var $author$project$Select$get = function ($) { - return $.selected; -}; -var $elm$core$Maybe$map = F2( - function (f, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return $elm$core$Maybe$Just( - f(value)); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$round = _Basics_round; -var $author$project$Entry$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Entry$calculateGarfieldPrice = function (model) { - return A2( - $elm$core$Maybe$map, - function (netUnitPrice) { - return A2( - $author$project$Entry$roundTo, - 2, - (netUnitPrice * (1 + $author$project$Select$get(model.taxGroup).percentage)) + 0.01); - }, - $author$project$NumberInput$get(model.netUnitPrice)); -}; -var $author$project$Entry$updateGrossUnitPrice = function (model) { - return _Utils_update( - model, - { - grossUnitPrice: A2( - $elm$core$Maybe$withDefault, - model.grossUnitPrice, - A2( - $elm$core$Maybe$map, - $author$project$NumberInput$fromFloat, - $author$project$Entry$calculateGarfieldPrice(model))) - }); -}; var $author$project$Entry$updateState = F3( function (msg, globals, state) { if (state.$ === 'ItemSearch') { @@ -11251,53 +11215,53 @@ var $author$project$Entry$updateState = F3( var taxGroup = _v2.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - { - barcode: searchResult.barcode, - grossUnitPrice: $author$project$NumberInput$fromFloat(0), - group: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + { + barcode: searchResult.barcode, + grossUnitPrice: $author$project$NumberInput$fromFloat( + A2($author$project$Entry$suggestedGrossPrice, searchResult.netUnitPrice, taxGroup.percentage)), + group: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.name; + return $.id; }, - {id: searchResult.groupId, name: searchResult.groupName}, - globals.groups), - location: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.groupId, name: searchResult.groupName}, + globals.groups), + location: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.name; + return $.id; }, - {id: searchResult.locationId, name: searchResult.locationName}, - globals.locations), - name: searchResult.name, - netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), - salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), - taxGroup: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.locationId, name: searchResult.locationName}, + globals.locations), + name: searchResult.name, + netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), + salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), + taxGroup: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.description; + return $.id; }, - taxGroup, - globals.taxGroups) - })), + $elm$core$String$fromInt), + function ($) { + return $.description; + }, + taxGroup, + globals.taxGroups) + }), $elm$core$Platform$Cmd$none); } default: @@ -11338,12 +11302,11 @@ var $author$project$Entry$updateState = F3( var str = msg.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - _Utils_update( - model, - { - netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) - }))), + _Utils_update( + model, + { + netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) + })), $elm$core$Platform$Cmd$none); case 'SetGrossUnitPrice': var str = msg.a; @@ -11379,12 +11342,11 @@ var $author$project$Entry$updateState = F3( var key = msg.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - _Utils_update( - model, - { - taxGroup: A2($author$project$Select$update, key, model.taxGroup) - }))), + _Utils_update( + model, + { + taxGroup: A2($author$project$Select$update, key, model.taxGroup) + })), $elm$core$Platform$Cmd$none); default: return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); @@ -11405,6 +11367,9 @@ var $author$project$Entry$update = F2( var $author$project$Entry$SetBarcode = function (a) { return {$: 'SetBarcode', a: a}; }; +var $author$project$Entry$SetGrossUnitPrice = function (a) { + return {$: 'SetGrossUnitPrice', a: a}; +}; var $author$project$Entry$SetGroup = function (a) { return {$: 'SetGroup', a: a}; }; @@ -11566,51 +11531,6 @@ var $author$project$Select$view = F2( ]), A2($elm$core$List$map, viewOption, model.options)); }); -var $author$project$Entry$SetGrossUnitPrice = function (a) { - return {$: 'SetGrossUnitPrice', a: a}; -}; -var $author$project$Entry$viewGrossUnitPriceInput = function (model) { - var suggestedPriceStr = function () { - var _v0 = $author$project$Entry$calculateGarfieldPrice(model); - if (_v0.$ === 'Nothing') { - return '?'; - } else { - var suggestedPrice = _v0.a; - return $elm$core$String$fromFloat(suggestedPrice); - } - }(); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('gross-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Stückpreis (Brutto), Vorschlag: ' + suggestedPriceStr) - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.grossUnitPrice)), - $elm$html$Html$Attributes$id('gross-unit-price'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])); -}; var $author$project$Entry$GotoItemEditor = function (a) { return {$: 'GotoItemEditor', a: a}; }; @@ -11712,6 +11632,47 @@ var $author$project$Entry$viewSearchResult = function (model) { ])) ])); }; +var $author$project$NumberInput$get = function ($) { + return $.value; +}; +var $author$project$Select$get = function ($) { + return $.selected; +}; +var $author$project$Entry$viewSetSuggestedPriceButton = function (model) { + var _v0 = $author$project$NumberInput$get(model.netUnitPrice); + if (_v0.$ === 'Nothing') { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$disabled(true) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Auf ? setzen') + ])); + } else { + var netUnitPrice = _v0.a; + var grossUnitPrice = A2( + $author$project$Entry$suggestedGrossPrice, + netUnitPrice, + $author$project$Select$get(model.taxGroup).percentage); + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Events$onClick( + $author$project$Entry$SetGrossUnitPrice( + $elm$core$String$fromFloat(grossUnitPrice))), + $elm$html$Html$Attributes$type_('button') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + 'Auf ' + ($elm$core$String$fromFloat(grossUnitPrice) + ' setzen')) + ])); + } +}; var $author$project$Entry$view = function (_v0) { var globals = _v0.globals; var state = _v0.state; @@ -11937,7 +11898,7 @@ var $author$project$Entry$view = function (_v0) { ]), _List_fromArray( [ - $elm$html$Html$text('Stückpreis (Netto)') + $elm$html$Html$text('Einkaufspreis (Netto)') ])), A2( $elm$html$Html$input, @@ -11971,19 +11932,6 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$text('Steuergruppe') ])), A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) - ])) - ])), - A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Neuer Snackeintrag') ])), A2( $elm$html$Html$div, @@ -11997,23 +11945,26 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$label, _List_fromArray( [ - $elm$html$Html$Attributes$for('snack-name') + $elm$html$Html$Attributes$for('gross-unit-price') ]), _List_fromArray( [ - $elm$html$Html$text('Name') + $elm$html$Html$text('Verkaufspreis (Brutto)') ])), A2( $elm$html$Html$input, _List_fromArray( [ - $elm$html$Html$Attributes$value(model.name), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$id('snack-name') + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.grossUnitPrice)), + $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$id('gross-unit-price'), + $elm$html$Html$Attributes$step('0.01') ]), - _List_Nil) - ])), - $author$project$Entry$viewGrossUnitPriceInput(model) + _List_Nil), + $author$project$Entry$viewSetSuggestedPriceButton(model) + ])) ])) ])); }