Files @ 2fddb86c05a9
Branch filter:

Location: ChaosStuff/stockcli/stockcli/stock.py - annotation

Dennis Fink
Specifiy in prompts that 0 can be used to abort
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6fa39f685829
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
2fddb86c05a9
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
2fddb86c05a9
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
2fddb86c05a9
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
2fddb86c05a9
2fddb86c05a9
2fddb86c05a9
2fddb86c05a9
2fddb86c05a9
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
2fddb86c05a9
2fddb86c05a9
2fddb86c05a9
2fddb86c05a9
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
6d0c2e63f225
57d1c880665b
57d1c880665b
57d1c880665b
6d0c2e63f225
6d0c2e63f225
from operator import itemgetter
from typing import Any

from rich.panel import Panel
from rich.table import Table

from . import utils
from .console import DEFAULT_PADDING, console, int_prompt, prompt
from .style import GreenBoldText


def get_info_by_barcode(barcode: str) -> None:

    product = utils.get_request(
        f"stock/products/by-barcode/{barcode}"
    )  # type: dict[str, Any]

    inner_product = product["product"]
    product_id = inner_product["id"]

    product_group = utils.get_request(
        f"objects/product_groups/{inner_product['product_group_id']}"
    )  # type: dict[str, Any]

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="left", no_wrap=True)
    grid.add_column(justify="right", style="cyan", no_wrap=True)
    grid.add_column(justify="left", no_wrap=True)

    grid.add_row(GreenBoldText("Product ID:"), product_id)
    grid.add_row(GreenBoldText("Product Name:"), inner_product["name"])
    grid.add_row(GreenBoldText("Product Group:"), product_group["name"])

    for i, barcode_data in enumerate(product["product_barcodes"], start=1):
        grid.add_row(
            GreenBoldText(f"Barcode N°{i}:"),
            barcode_data["barcode"],
            barcode_data["note"],
        )

    purchase_quantity_unit = product["default_quantity_unit_purchase"]
    stock_quantity_unit = product["quantity_unit_stock"]

    purchase_to_stock_conversion = utils.get_request(
        f"objects/quantity_unit_conversions?query[]=from_qu_id={purchase_quantity_unit['id']}&query[]=to_qu_id={stock_quantity_unit['id']}"
    )  # type: list[dict[str, Any]]

    if len(purchase_to_stock_conversion) != 0:
        conversion = f"{purchase_to_stock_conversion[0]['factor']} {stock_quantity_unit['name_plural']}"
    else:
        conversion = ""

    grid.add_row(
        GreenBoldText("Purchase Quantity Unit:"),
        purchase_quantity_unit["name"],
        conversion,
    )
    grid.add_row(
        GreenBoldText("Stock Quantity Unit:"),
        stock_quantity_unit["name"],
    )

    stock_amount = int(product["stock_amount"])
    grid.add_row(GreenBoldText("Overall Stock Amount:"), str(stock_amount))

    if stock_amount > 0:
        grid.add_row(GreenBoldText("Locations:"))
        locations = utils.get_request(
            f"stock/products/{product_id}/locations"
        )  # type: list[dict[str, Any]]

        for location in sorted(locations, key=itemgetter("location_name")):
            grid.add_row(
                f"[green bold]-[/green bold] [magenta]{location['location_name']}[/magenta]",
                location["amount"],
            )

    console.print(Panel(grid, title="[green bold]Product Info[/green bold]"))

    return


def transfer_by_barcode(barcode: str) -> None:

    product = utils.get_request(
        f"stock/products/by-barcode/{barcode}"
    )  # type: dict[str, Any]

    inner_product = product["product"]
    product_id = inner_product["id"]

    locations = utils.get_request(
        f"stock/products/{product_id}/locations"
    )  # type: list[dict[str, Any]]
    all_locations = utils.get_request("objects/locations")  # type: list[dict[str, Any]]

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="right", no_wrap=True)
    grid.add_column(justify="left", style="cyan", no_wrap=True)
    grid.add_column(justify="right", style="magenta", no_wrap=True)

    grid.add_row(GreenBoldText("Product ID:"), product_id)
    grid.add_row(GreenBoldText("Product Name:"), inner_product["name"])
    grid.add_row(GreenBoldText("Locations:"))

    choices = []

    for location in sorted(locations, key=itemgetter("location_id")):
        location_id = location["location_id"]
        choices.append(location_id)
        grid.add_row(
            f"[blue]{location_id}[/blue]",
            location["location_name"],
            location["amount"],
        )

    choices.append("0")
    console.print(
        Panel(
            grid,
            title="[green bold]Product Info[/green bold]",
            subtitle="[blue]Transfer stock[/blue]",
        )
    )

    from_id = int_prompt.ask(
        "From (Enter 0 to abort)",
        choices=choices,
        default=int(choices[0]),
    )

    if not from_id:
        return

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="right", style="blue", no_wrap=True)
    grid.add_column(justify="left", style="cyan", no_wrap=True)

    choices = []
    for location in sorted(all_locations, key=itemgetter("id")):
        location_id = location["id"]
        if int(location_id) != from_id:
            choices.append(location_id)
            grid.add_row(location_id, location["name"])

    choices.append("0")
    console.print(
        Panel(
            grid,
            title="[green bold]Locations[/green bold]",
            subtitle="[blue]Transfer Stock[/blue]",
        )
    )

    to_id = int_prompt.ask(
        "To (Enter 0 to abort)",
        choices=choices,
        default=int(choices[0]),
    )

    if not to_id:
        return

    amount = int_prompt.ask("Amount (Enter 0 to abort)")

    if not amount:
        return

    data = {"amount": amount, "location_id_from": from_id, "location_id_to": to_id}

    response = utils.post_request(
        f"stock/products/by-barcode/{barcode}/transfer", data
    )  # type: dict[str, Any]
    console.print("Successfully transfered!")
    return


def add_by_barcode(barcode: str) -> None:

    product = utils.get_request(
        f"stock/products/by-barcode/{barcode}"
    )  # type: dict[str, Any]

    inner_product = product["product"]
    product_id = inner_product["id"]

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="right", no_wrap=True)
    grid.add_column(justify="left", style="cyan", no_wrap=True)
    grid.add_row(GreenBoldText("Product ID:"), product_id)
    grid.add_row(GreenBoldText("Product Name:"), inner_product["name"])
    console.print(
        Panel(
            grid,
            title="[green bold]Product Info[/green bold]",
            subtitle="[blue]Add Stock[/blue]",
        )
    )

    amount = int_prompt.ask("Amount (Enter 0 to abort)")

    if not amount:
        return

    data = {"amount": amount, "transaction_type": "purchase"}

    response = utils.post_request(
        f"stock/products/by-barcode/{barcode}/add", data
    )  # type: dict[str, Any]
    console.print("Successfully added!")
    return


def update_by_barcode(barcode: str) -> None:

    product = utils.get_request(
        f"stock/products/by-barcode/{barcode}"
    )  # type: dict[str, Any]

    inner_product = product["product"]
    product_id = inner_product["id"]

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="right", no_wrap=True)
    grid.add_column(justify="left", style="cyan", no_wrap=True)

    grid.add_row(GreenBoldText("Product ID:"), product_id)
    grid.add_row(GreenBoldText("Product Name:"), inner_product["name"])
    grid.add_row(GreenBoldText("Overall Stock Amount:"), product["stock_amount"])

    console.print(
        Panel(
            grid,
            title="[green bold]Product Info[/green bold]",
            subtitle="[blue]Update stock[/blue]",
        )
    )
    amount = int_prompt.ask("Amount (Enter 0 to abort)")

    if not amount:
        return

    data = {
        "new_amount": amount,
    }

    response = utils.post_request(
        f"stock/products/{product_id}/inventory", data
    )  # type: dict[str, Any]
    console.print("Successfully updated!")
    return