from operator import itemgetter 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}") inner_product = product["product"] product_id = inner_product["id"] product_group = utils.get_request( f"objects/product_groups/{inner_product['product_group_id']}" ) 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']}" ) 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 = 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") 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}") inner_product = product["product"] product_id = inner_product["id"] locations = utils.get_request(f"stock/products/{product_id}/locations") all_locations = utils.get_request("objects/locations") grid = Table.grid(padding=DEFAULT_PADDING) grid.add_column(justify="right", style="green", 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("Product ID:", product_id, "") grid.add_row("Product Name:", inner_product["name"], "") grid.add_row("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", choices=choices, default=int(choices[0]), ) if not from_id: return grid = Table.grid(padding=DEFAULT_PADDING) grid.add_column(justify="right", style="green", 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(f"[blue]{location_id}[/blue]", 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", choices=choices, default=int(choices[0]), ) if not to_id: return amount = int_prompt.ask("Amount") 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) console.print("Successfully transfered!") return def add_by_barcode(barcode: str) -> None: product = utils.get_request(f"stock/products/by-barcode/{barcode}") inner_product = product["product"] product_id = inner_product["id"] grid = Table.grid(padding=DEFAULT_PADDING) grid.add_column(justify="right", style="green", no_wrap=True) grid.add_column(justify="left", style="cyan", no_wrap=True) grid.add_row("Product ID:", product_id) grid.add_row("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") data = {"amount": amount, "transaction_type": "purchase"} response = utils.post_request(f"stock/products/by-barcode/{barcode}/add", data) console.print("Successfully added!") return def update_by_barcode(barcode: str) -> None: product = utils.get_request(f"stock/products/by-barcode/{barcode}") inner_product = product["product"] product_id = inner_product["id"] grid = Table.grid(padding=DEFAULT_PADDING) grid.add_column(justify="right", style="green", no_wrap=True) grid.add_column(justify="left", style="cyan", no_wrap=True) grid.add_row("Product ID:", product_id) grid.add_row("Product Name:", inner_product["name"]) grid.add_row("Overall Stock Amount:", product["stock_amount"]) console.print( Panel( grid, title="[green bold]Product Info[/green bold]", subtitle="[blue]Update stock[/blue]", ) ) amount = prompt.ask("Amount") data = { "new_amount": amount, } response = utils.post_request(f"stock/products/{product_id}/inventory", data) console.print("Successfully updated!") return