aboutsummaryrefslogtreecommitdiff
path: root/packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx
diff options
context:
space:
mode:
authorNic Eigel <nic@eigel.ch>2024-06-24 09:16:33 +0200
committerNic Eigel <nic@eigel.ch>2024-06-24 09:16:33 +0200
commit75ff04672c011cf4c47b8f07d327adbf59323396 (patch)
tree24577e0429f641e3c19005b5a9180af8186232d0 /packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx
parent0b90a34e7c7c5d9bcca9a2ebe74df9fdfafc6577 (diff)
downloadwallet-core-75ff04672c011cf4c47b8f07d327adbf59323396.tar.xz
fixing merge-error
Diffstat (limited to 'packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx')
-rw-r--r--packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx127
1 files changed, 0 insertions, 127 deletions
diff --git a/packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx b/packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx
deleted file mode 100644
index 25b1f0e2d..000000000
--- a/packages/auditor-backoffice-ui/src/components/product/InventoryProductForm.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021-2024 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-import { useTranslationContext } from "@gnu-taler/web-util/browser";
-import { h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { MerchantBackend, WithId } from "../../declaration.js";
-import { ProductMap } from "../../paths/instance/orders/create/CreatePage.js";
-import { FormErrors, FormProvider } from "../form/FormProvider.js";
-import { InputNumber } from "../form/InputNumber.js";
-import { InputSearchOnList } from "../form/InputSearchOnList.js";
-
-type Form = {
- product: MerchantBackend.Products.ProductDetail & WithId;
- quantity: number;
-};
-
-interface Props {
- currentProducts: ProductMap;
- onAddProduct: (
- product: MerchantBackend.Products.ProductDetail & WithId,
- quantity: number,
- ) => void;
- inventory: (MerchantBackend.Products.ProductDetail & WithId)[];
-}
-
-export function InventoryProductForm({
- currentProducts,
- onAddProduct,
- inventory,
-}: Props): VNode {
- const initialState = { quantity: 1 };
- const [state, setState] = useState<Partial<Form>>(initialState);
- const [errors, setErrors] = useState<FormErrors<Form>>({});
-
- const { i18n } = useTranslationContext();
-
- const productWithInfiniteStock =
- state.product && state.product.total_stock === -1;
-
- const submit = (): void => {
- if (!state.product) {
- setErrors({
- product: i18n.str`You must enter a valid product identifier.`,
- });
- return;
- }
- if (productWithInfiniteStock) {
- onAddProduct(state.product, 1);
- } else {
- if (!state.quantity || state.quantity <= 0) {
- setErrors({ quantity: i18n.str`Quantity must be greater than 0!` });
- return;
- }
- const currentStock =
- state.product.total_stock -
- state.product.total_lost -
- state.product.total_sold;
- const p = currentProducts[state.product.id];
- if (p) {
- if (state.quantity + p.quantity > currentStock) {
- const left = currentStock - p.quantity;
- setErrors({
- quantity: i18n.str`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.`,
- });
- return;
- }
- onAddProduct(state.product, state.quantity + p.quantity);
- } else {
- if (state.quantity > currentStock) {
- const left = currentStock;
- setErrors({
- quantity: i18n.str`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.`,
- });
- return;
- }
- onAddProduct(state.product, state.quantity);
- }
- }
-
- setState(initialState);
- };
-
- return (
- <FormProvider<Form> errors={errors} object={state} valueHandler={setState}>
- <InputSearchOnList
- label={i18n.str`Search product`}
- selected={state.product}
- onChange={(p) => setState((v) => ({ ...v, product: p }))}
- list={inventory}
- withImage
- />
- {state.product && (
- <div class="columns mt-5">
- <div class="column is-two-thirds">
- {!productWithInfiniteStock && (
- <InputNumber<Form>
- name="quantity"
- label={i18n.str`Quantity`}
- tooltip={i18n.str`how many products will be added`}
- />
- )}
- </div>
- <div class="column">
- <div class="buttons is-right">
- <button class="button is-success" onClick={submit}>
- <i18n.Translate>Add from inventory</i18n.Translate>
- </button>
- </div>
- </div>
- </div>
- )}
- </FormProvider>
- );
-}