import gradio as gr import pandas as pd import requests import json from collections import defaultdict def filter_records(records): # Convert DataFrame to JSON data = records.to_dict(orient='records') # Add additional fields for i, item in enumerate(data): item['stock_price_id'] = i + 1 item['product_detail_fkid'] = 1 item['stock_in'] = float(item['stock_in']) item['stock_out'] = float(item['stock_out']) item['price'] = float(item['price']) item['stock_in_id'] = "100" item['stock_in_source'] = "purchase" json_data = json.dumps(data) print('request: ', json_data) # Make POST request url = 'https://api-report.uniq-dev.xyz/v1/simulation/fifo' headers = {'Content-type': 'application/json'} response = requests.post(url, data=json_data, headers=headers) # Check response status code if response.status_code != 200: return "Error: API response status code " + str(response.status_code) # Convert response JSON to DataFrame and return print('response: ', response.text) response_json = json.loads(response.text) df_response = pd.DataFrame(response_json['data']) # Keep only certain columns columns = ['stock_in', 'stock_out', 'price'] df_response = df_response[columns] changes = json.dumps(response_json['changes'].copy(), indent=4) print(changes) return df_response, generate_markdown(response_json['changes']), changes def generate_markdown(data): grouped = defaultdict(lambda: defaultdict(list)) for key, value in data.items(): for item in value: grouped[item['StockPriceId']][key].append(item) result = dict(grouped) grouped_json = json.dumps(result) # Sort keys sorted_keys = sorted(result.keys(), reverse=False) # Build sorted dict sorted_data = {} for key in sorted_keys: sorted_data[key] = result[key] md = "" for stock_price_id, group in sorted_data.items(): qtys = [item["Qty"] for v in group.values() for item in v] md += f"### StockPriceId {stock_price_id}, Qty Changes: {sum(qtys)}\n" md += "| StockPriceId | Qty | Price |\n" md += "|---|---|---|\n" for key, value in group.items():#for value in group.values(): for item in value: md += f"| {key} | {item['Qty']} | {item['Price']} |\n" md += "\n" return md columns = ['stock_in', 'stock_out', 'price'] exaples = [[{"stock_price_id":1,"product_detail_fkid":1,"stock_in":6,"stock_out":0,"price":80000,"stock_in_id":"156634","stock_in_source":"purchase"},{"stock_price_id":2,"product_detail_fkid":1,"stock_in":20,"stock_out":10,"price":18000,"stock_in_id":"156640","stock_in_source":"purchase","stock_out_id":None}], [{"stock_price_id":1,"product_detail_fkid":1,"stock_in":16,"stock_out":1,"price":80000,"stock_in_id":"156634","stock_in_source":"purchase"},{"stock_price_id":2,"product_detail_fkid":1,"stock_in":5,"stock_out":5,"price":18000,"stock_in_id":"156640","stock_in_source":"purchase"},{"stock_price_id":3,"product_detail_fkid":1,"stock_in":21,"stock_out":4,"price":18000,"stock_in_id":"156640","stock_in_source":"purchase"}], [{"stock_price_id":1,"product_detail_fkid":1,"stock_in":6,"stock_out":0,"price":80000,"stock_in_id":"156634","stock_in_source":"purchase"},{"stock_price_id":2,"product_detail_fkid":1,"stock_in":10,"stock_out":10,"price":18000,"stock_in_id":"156640","stock_in_source":"purchase"},{"stock_price_id":3,"product_detail_fkid":1,"stock_in":20,"stock_out":10,"price":18000,"stock_in_id":"156640","stock_in_source":"purchase"}], [{"stock_price_id":1,"product_detail_fkid":1,"stock_in":10,"stock_out":0,"price":5000,"stock_in_id":"100","stock_in_source":"purchase"},{"stock_price_id":2,"product_detail_fkid":1,"stock_in":10,"stock_out":10,"price":6000,"stock_in_id":"101","stock_in_source":"purchase"},{"stock_price_id":3,"product_detail_fkid":1,"stock_in":20,"stock_out":0,"price":7000,"stock_in_id":"102","stock_in_source":"purchase"},{"stock_price_id":4,"product_detail_fkid":1,"stock_in":10,"stock_out":0,"price":5000,"stock_in_id":"103","stock_in_source":"purchase"}], [{"stock_price_id":1,"product_detail_fkid":1,"stock_in":10,"stock_out":20,"price":5000,"stock_in_id":"100","stock_in_source":"purchase"},{"stock_price_id":2,"product_detail_fkid":1,"stock_in":5,"stock_out":5,"price":6000,"stock_in_id":"101","stock_in_source":"purchase"},{"stock_price_id":3,"product_detail_fkid":1,"stock_in":4,"stock_out":4,"price":7000,"stock_in_id":"102","stock_in_source":"purchase"}]] example_df = [pd.DataFrame(json_data)[columns] for json_data in exaples] demo = gr.Interface( filter_records, [ gr.Dataframe( headers=["stock_in", "stock_out", "price"], datatype=["number", "number", "number"], row_count=2, col_count=(3, "fixed"), ) ], ["dataframe", "markdown", "json"], description="Enter Stock Price to Recalculate!", examples = example_df ) if __name__ == "__main__": demo.launch()