From 4d65dc0b448b8aeaf6fe1a4c0f93828c519b1b7f Mon Sep 17 00:00:00 2001 From: Elphas Masuka Date: Wed, 15 Apr 2026 09:20:03 +0200 Subject: [PATCH] add get single product endpoint --- .github/workflows/ci.yml | 0 .gitignore | 0 README.md | 0 havano_pos_integration/__init__.py | 0 havano_pos_integration/api.py | 352 ++++++++++++++++++ havano_pos_integration/auth.py | 0 havano_pos_integration/config/__init__.py | 0 .../custom_scripts/additional_salary.js | 0 .../custom_scripts/income_tax_slab.js | 0 .../custom_scripts/income_tax_slab.py | 0 .../custom_scripts/landed_cost_voucher.js | 0 .../custom_scripts/payment_entry.js | 0 .../custom_scripts/salary_slip.js | 0 .../custom_scripts/salary_slip.py | 0 .../custom_scripts/sales_invoice_list.js | 0 .../fixtures/letter_head.json | 0 .../fixtures/print_format.json | 0 .../havano_pos_integration/__init__.py | 0 .../doctype/__init__.py | 0 .../company_tax_calculations/__init__.py | 0 .../company_tax_calculations.js | 0 .../company_tax_calculations.json | 0 .../company_tax_calculations.py | 0 .../test_company_tax_calculations.py | 0 .../havano_pos_integration/report/__init__.py | 0 .../report/nec_report/__init__.py | 0 .../report/nec_report/nec_report.html | 0 .../report/nec_report/nec_report.js | 0 .../report/nec_report/nec_report.json | 0 .../report/nec_report/nec_report.py | 0 .../report/nssa_form_p4_report/__init__.py | 0 .../nssa_form_p4_report.html | 0 .../nssa_form_p4_report.js | 0 .../nssa_form_p4_report.json | 0 .../nssa_form_p4_report.py | 0 .../report/nssa_p4_report/__init__.py | 0 .../report/nssa_p4_report/nssa_p4_report.html | 0 .../report/nssa_p4_report/nssa_p4_report.js | 0 .../report/nssa_p4_report/nssa_p4_report.json | 0 .../report/nssa_p4_report/nssa_p4_report.py | 0 .../report/nssa_report/__init__.py | 0 .../report/nssa_report/nssa_report.html | 0 .../report/nssa_report/nssa_report.js | 0 .../report/nssa_report/nssa_report.json | 0 .../report/nssa_report/nssa_report.py | 0 .../report/zimdef_report/__init__.py | 0 .../report/zimdef_report/zimdef_report.html | 0 .../report/zimdef_report/zimdef_report.js | 0 .../report/zimdef_report/zimdef_report.json | 0 .../report/zimdef_report/zimdef_report.py | 0 .../report/zimra_itf16/__init__.py | 0 .../report/zimra_itf16/zimra_itf16.html | 0 .../report/zimra_itf16/zimra_itf16.js | 0 .../report/zimra_itf16/zimra_itf16.json | 0 .../report/zimra_itf16/zimra_itf16.py | 0 .../report/zimra_p2form/__init__.py | 0 .../report/zimra_p2form/zimra_p2form.js | 0 .../report/zimra_p2form/zimra_p2form.json | 0 .../report/zimra_p2form/zimra_p2form.py | 0 havano_pos_integration/hooks.py | 0 havano_pos_integration/modules.txt | 0 havano_pos_integration/patches.txt | 0 havano_pos_integration/public/.gitkeep | 0 .../public/reports/stock_ledger.js | 0 havano_pos_integration/templates/__init__.py | 0 .../templates/pages/__init__.py | 0 havano_pos_integration/update_payment.py | 0 .../update_sales_invoice.py | 0 havano_pos_integration/utils.py | 0 havano_pos_integration/www/__init__.py | 0 license.txt | 0 pyproject.toml | 0 72 files changed, 352 insertions(+) mode change 100755 => 100644 .github/workflows/ci.yml mode change 100755 => 100644 .gitignore mode change 100755 => 100644 README.md mode change 100755 => 100644 havano_pos_integration/__init__.py mode change 100755 => 100644 havano_pos_integration/auth.py mode change 100755 => 100644 havano_pos_integration/config/__init__.py mode change 100755 => 100644 havano_pos_integration/custom_scripts/additional_salary.js mode change 100755 => 100644 havano_pos_integration/custom_scripts/income_tax_slab.js mode change 100755 => 100644 havano_pos_integration/custom_scripts/income_tax_slab.py mode change 100755 => 100644 havano_pos_integration/custom_scripts/landed_cost_voucher.js mode change 100755 => 100644 havano_pos_integration/custom_scripts/payment_entry.js mode change 100755 => 100644 havano_pos_integration/custom_scripts/salary_slip.js mode change 100755 => 100644 havano_pos_integration/custom_scripts/salary_slip.py mode change 100755 => 100644 havano_pos_integration/custom_scripts/sales_invoice_list.js mode change 100755 => 100644 havano_pos_integration/fixtures/letter_head.json mode change 100755 => 100644 havano_pos_integration/fixtures/print_format.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/test_company_tax_calculations.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nec_report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_p4_report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimdef_report/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_itf16/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.html mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_p2form/__init__.py mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.js mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.json mode change 100755 => 100644 havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.py mode change 100755 => 100644 havano_pos_integration/hooks.py mode change 100755 => 100644 havano_pos_integration/modules.txt mode change 100755 => 100644 havano_pos_integration/patches.txt mode change 100755 => 100644 havano_pos_integration/public/.gitkeep mode change 100755 => 100644 havano_pos_integration/public/reports/stock_ledger.js mode change 100755 => 100644 havano_pos_integration/templates/__init__.py mode change 100755 => 100644 havano_pos_integration/templates/pages/__init__.py mode change 100755 => 100644 havano_pos_integration/update_payment.py mode change 100755 => 100644 havano_pos_integration/update_sales_invoice.py mode change 100755 => 100644 havano_pos_integration/utils.py mode change 100755 => 100644 havano_pos_integration/www/__init__.py mode change 100755 => 100644 license.txt mode change 100755 => 100644 pyproject.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/havano_pos_integration/__init__.py b/havano_pos_integration/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/api.py b/havano_pos_integration/api.py index 91fdce6..febf12f 100644 --- a/havano_pos_integration/api.py +++ b/havano_pos_integration/api.py @@ -1405,3 +1405,355 @@ def create_customer(): frappe.log_error(message=str(e), title="Error creating customer and assigning permission") return + +@frappe.whitelist() +def get_single_product(item_code=None): + """Fetch a single product with its warehouses, prices, taxes, and UOM conversions. + Used for real-time updates when a WebSocket event indicates an item has changed.""" + try: + if not item_code: + data = frappe.local.form_dict + item_code = data.get("item_code") + + if not item_code: + create_response("417", {"error": "item_code is required"}) + return + + if not frappe.db.exists("Item", item_code): + create_response("404", {"error": f"Item {item_code} not found"}) + return + + item_fields = [ + "name", "item_name", "item_code", "item_group", + "is_stock_item", "custom_simple_code", "is_sales_item", + "stock_uom", "disabled" + ] + + has_food_tourism = frappe.db.has_column("Item", "custom_food_and_tourism_tax") + has_food_tax = frappe.db.has_column("Item", "custom_food_tax") + has_tourism_tax = frappe.db.has_column("Item", "custom_tourism_tax") + has_cummulative = frappe.db.has_column("Item", "custom_cummulative") + + if has_food_tourism: + item_fields.append("custom_food_and_tourism_tax") + if has_food_tax: + item_fields.append("custom_food_tax") + if has_tourism_tax: + item_fields.append("custom_tourism_tax") + if has_cummulative: + item_fields.append("custom_cummulative") + + item = frappe.db.get_value("Item", item_code, item_fields, as_dict=True) + if not item: + create_response("404", {"error": f"Item {item_code} not found"}) + return + + # UOM Conversions + conversions = frappe.get_all( + "UOM Conversion Detail", + filters={"parent": item_code}, + fields=["uom", "conversion_factor"] + ) + + # Warehouses (Bin data) + bins = frappe.get_all( + "Bin", + filters={"item_code": item_code}, + fields=["warehouse", "actual_qty"] + ) + warehouses = [{"warehouse": b["warehouse"], "qtyOnHand": b["actual_qty"]} for b in bins] + if not warehouses: + warehouses = [{"warehouse": get_default_warehouse_for_user(), "qtyOnHand": 0}] + + # Prices + prices_data = frappe.get_all( + "Item Price", + filters={"item_code": item_code}, + fields=["price_list", "price_list_rate", "selling", "uom", "buying"] + ) + prices = [{ + "priceName": p["price_list"], + "price": p["price_list_rate"], + "uom": p["uom"] or "nos", + "type": "selling" if p["selling"] else "buying" + } for p in prices_data] + + # Taxes + taxes = [] + try: + doc = frappe.get_doc("Item", item_code) + for tax in getattr(doc, "taxes", []): + taxes.append({ + "item_tax_template": tax.item_tax_template, + "tax_category": tax.tax_category, + "valid_from": tax.valid_from, + "minimum_net_rate": tax.minimum_net_rate, + "maximum_net_rate": tax.maximum_net_rate + }) + except Exception: + pass + + product = { + "itemcode": item["item_code"], + "itemname": item["item_name"], + "groupname": item["item_group"], + "maintainstock": item["is_stock_item"], + "warehouses": warehouses, + "default warehouse": get_default_warehouse_for_user(), + "prices": prices, + "taxes": taxes, + "simple_code": item.get("custom_simple_code"), + "is_sales_item": item["is_sales_item"], + "disabled": item.get("disabled", 0), + "uom": { + "stock_uom": item["stock_uom"], + "conversions": conversions + } + } + + if has_food_tourism: + product["food_and_tourism_tax"] = item.get("custom_food_and_tourism_tax") + if has_food_tax: + product["food_tax"] = item.get("custom_food_tax") + if has_tourism_tax: + product["tourism_tax"] = item.get("custom_tourism_tax") + if has_cummulative: + product["cumulative"] = item.get("custom_cummulative") + + create_response("200", {"product": product}) + + except Exception as e: + create_response("417", {"error": str(e)}) + frappe.log_error(str(e), "Error fetching single product") + + +@frappe.whitelist() +def get_modified_products(since=None): + """Fetch only products modified since a given timestamp. + Used for delta sync instead of reloading all products.""" + try: + data = frappe.local.form_dict + if not since: + since = data.get("since") + + if not since: + create_response("417", {"error": "since timestamp is required"}) + return + + filters = {"disabled": 0, "modified": [">=", since]} + + user = frappe.session.user + user_doc = frappe.get_doc("User", user) + + # User permission filtering for item groups + if user_doc.user_rights_profile: + profile = frappe.get_doc("User Rights Profile", user_doc.user_rights_profile) + if profile.is_item_group_related: + allowed_item_groups = frappe.get_all( + "User Permission", + filters={"user": user_doc.name, "allow": "Item Group"}, + fields=["for_value"] + ) + allowed_item_groups = [g.for_value for g in allowed_item_groups] + if allowed_item_groups: + filters["item_group"] = ["in", allowed_item_groups] + + modified_items = frappe.get_all( + "Item", + filters=filters, + fields=["item_code"], + order_by="modified desc" + ) + + # Also get items with modified prices since timestamp + modified_prices = frappe.get_all( + "Item Price", + filters={"modified": [">=", since]}, + fields=["item_code"], + group_by="item_code" + ) + + # Also get items with stock changes since timestamp + modified_stock = frappe.db.sql(""" + SELECT DISTINCT item_code + FROM `tabStock Ledger Entry` + WHERE modified >= %s + """, since, as_dict=True) + + # Combine all modified item codes + all_item_codes = set() + for item in modified_items: + all_item_codes.add(item["item_code"]) + for item in modified_prices: + all_item_codes.add(item["item_code"]) + for item in modified_stock: + all_item_codes.add(item["item_code"]) + + # Also check for deleted items since timestamp + deleted_items = frappe.get_all( + "Deleted Document", + filters={ + "deleted_doctype": "Item", + "modified": [">=", since] + }, + fields=["deleted_name"] + ) + deleted_item_codes = [d["deleted_name"] for d in deleted_items] + + # Fetch full product data for each modified item + products = [] + for item_code in all_item_codes: + try: + if not frappe.db.exists("Item", item_code): + continue + + item_fields = [ + "name", "item_name", "item_code", "item_group", + "is_stock_item", "custom_simple_code", "is_sales_item", + "stock_uom", "disabled" + ] + + has_food_tourism = frappe.db.has_column("Item", "custom_food_and_tourism_tax") + has_food_tax = frappe.db.has_column("Item", "custom_food_tax") + has_tourism_tax = frappe.db.has_column("Item", "custom_tourism_tax") + has_cummulative = frappe.db.has_column("Item", "custom_cummulative") + + if has_food_tourism: + item_fields.append("custom_food_and_tourism_tax") + if has_food_tax: + item_fields.append("custom_food_tax") + if has_tourism_tax: + item_fields.append("custom_tourism_tax") + if has_cummulative: + item_fields.append("custom_cummulative") + + item = frappe.db.get_value("Item", item_code, item_fields, as_dict=True) + if not item: + continue + + # Bins + bins = frappe.get_all( + "Bin", filters={"item_code": item_code}, + fields=["warehouse", "actual_qty"] + ) + warehouses = [{"warehouse": b["warehouse"], "qtyOnHand": b["actual_qty"]} for b in bins] + if not warehouses: + warehouses = [{"warehouse": get_default_warehouse_for_user(), "qtyOnHand": 0}] + + # Prices + prices_data = frappe.get_all( + "Item Price", filters={"item_code": item_code}, + fields=["price_list", "price_list_rate", "selling", "uom", "buying"] + ) + prices = [{ + "priceName": p["price_list"], + "price": p["price_list_rate"], + "uom": p["uom"] or "nos", + "type": "selling" if p["selling"] else "buying" + } for p in prices_data] + + # UOM + conversions = frappe.get_all( + "UOM Conversion Detail", + filters={"parent": item_code}, + fields=["uom", "conversion_factor"] + ) + + # Taxes + taxes = [] + try: + doc = frappe.get_doc("Item", item_code) + for tax in getattr(doc, "taxes", []): + taxes.append({ + "item_tax_template": tax.item_tax_template, + "tax_category": tax.tax_category, + "valid_from": tax.valid_from, + "minimum_net_rate": tax.minimum_net_rate, + "maximum_net_rate": tax.maximum_net_rate + }) + except Exception: + pass + + product = { + "itemcode": item["item_code"], + "itemname": item["item_name"], + "groupname": item["item_group"], + "maintainstock": item["is_stock_item"], + "warehouses": warehouses, + "default warehouse": get_default_warehouse_for_user(), + "prices": prices, + "taxes": taxes, + "simple_code": item.get("custom_simple_code"), + "is_sales_item": item["is_sales_item"], + "disabled": item.get("disabled", 0), + "uom": { + "stock_uom": item["stock_uom"], + "conversions": conversions + } + } + + if has_food_tourism: + product["food_and_tourism_tax"] = item.get("custom_food_and_tourism_tax") + if has_food_tax: + product["food_tax"] = item.get("custom_food_tax") + if has_tourism_tax: + product["tourism_tax"] = item.get("custom_tourism_tax") + if has_cummulative: + product["cumulative"] = item.get("custom_cummulative") + + products.append(product) + + except Exception: + continue + + create_response("200", { + "products": products, + "deleted_items": deleted_item_codes, + "total_modified": len(products), + "total_deleted": len(deleted_item_codes), + "since": since, + "server_time": str(now_datetime()) + }) + + except Exception as e: + create_response("417", {"error": str(e)}) + frappe.log_error(str(e), "Error fetching modified products") + + +@frappe.whitelist() +def get_stock_update(item_code=None, warehouse=None): + """Get current stock for a specific item and/or warehouse. + Used for real-time stock updates from WebSocket events.""" + try: + data = frappe.local.form_dict + if not item_code: + item_code = data.get("item_code") + if not warehouse: + warehouse = data.get("warehouse") + + filters = {} + if item_code: + filters["item_code"] = item_code + if warehouse: + filters["warehouse"] = warehouse + + if not filters: + create_response("417", {"error": "item_code or warehouse is required"}) + return + + bins = frappe.get_all( + "Bin", + filters=filters, + fields=["item_code", "warehouse", "actual_qty", "reserved_qty", + "ordered_qty", "stock_value", "valuation_rate"] + ) + + create_response("200", { + "stock": bins, + "server_time": str(now_datetime()) + }) + + except Exception as e: + create_response("417", {"error": str(e)}) + frappe.log_error(str(e), "Error fetching stock update") + diff --git a/havano_pos_integration/auth.py b/havano_pos_integration/auth.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/config/__init__.py b/havano_pos_integration/config/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/additional_salary.js b/havano_pos_integration/custom_scripts/additional_salary.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/income_tax_slab.js b/havano_pos_integration/custom_scripts/income_tax_slab.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/income_tax_slab.py b/havano_pos_integration/custom_scripts/income_tax_slab.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/landed_cost_voucher.js b/havano_pos_integration/custom_scripts/landed_cost_voucher.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/payment_entry.js b/havano_pos_integration/custom_scripts/payment_entry.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/salary_slip.js b/havano_pos_integration/custom_scripts/salary_slip.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/salary_slip.py b/havano_pos_integration/custom_scripts/salary_slip.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/custom_scripts/sales_invoice_list.js b/havano_pos_integration/custom_scripts/sales_invoice_list.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/fixtures/letter_head.json b/havano_pos_integration/fixtures/letter_head.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/fixtures/print_format.json b/havano_pos_integration/fixtures/print_format.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/__init__.py b/havano_pos_integration/havano_pos_integration/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/__init__.py b/havano_pos_integration/havano_pos_integration/doctype/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/__init__.py b/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.js b/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.json b/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.py b/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/company_tax_calculations.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/test_company_tax_calculations.py b/havano_pos_integration/havano_pos_integration/doctype/company_tax_calculations/test_company_tax_calculations.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/__init__.py b/havano_pos_integration/havano_pos_integration/report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nec_report/__init__.py b/havano_pos_integration/havano_pos_integration/report/nec_report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.html b/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.js b/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.json b/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.py b/havano_pos_integration/havano_pos_integration/report/nec_report/nec_report.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/__init__.py b/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.html b/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.js b/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.json b/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.py b/havano_pos_integration/havano_pos_integration/report/nssa_form_p4_report/nssa_form_p4_report.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/__init__.py b/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.html b/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.js b/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.json b/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.py b/havano_pos_integration/havano_pos_integration/report/nssa_p4_report/nssa_p4_report.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_report/__init__.py b/havano_pos_integration/havano_pos_integration/report/nssa_report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.html b/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.js b/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.json b/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.py b/havano_pos_integration/havano_pos_integration/report/nssa_report/nssa_report.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimdef_report/__init__.py b/havano_pos_integration/havano_pos_integration/report/zimdef_report/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.html b/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.js b/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.json b/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.py b/havano_pos_integration/havano_pos_integration/report/zimdef_report/zimdef_report.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_itf16/__init__.py b/havano_pos_integration/havano_pos_integration/report/zimra_itf16/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.html b/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.html old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.js b/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.json b/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.py b/havano_pos_integration/havano_pos_integration/report/zimra_itf16/zimra_itf16.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_p2form/__init__.py b/havano_pos_integration/havano_pos_integration/report/zimra_p2form/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.js b/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.json b/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.json old mode 100755 new mode 100644 diff --git a/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.py b/havano_pos_integration/havano_pos_integration/report/zimra_p2form/zimra_p2form.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/hooks.py b/havano_pos_integration/hooks.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/modules.txt b/havano_pos_integration/modules.txt old mode 100755 new mode 100644 diff --git a/havano_pos_integration/patches.txt b/havano_pos_integration/patches.txt old mode 100755 new mode 100644 diff --git a/havano_pos_integration/public/.gitkeep b/havano_pos_integration/public/.gitkeep old mode 100755 new mode 100644 diff --git a/havano_pos_integration/public/reports/stock_ledger.js b/havano_pos_integration/public/reports/stock_ledger.js old mode 100755 new mode 100644 diff --git a/havano_pos_integration/templates/__init__.py b/havano_pos_integration/templates/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/templates/pages/__init__.py b/havano_pos_integration/templates/pages/__init__.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/update_payment.py b/havano_pos_integration/update_payment.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/update_sales_invoice.py b/havano_pos_integration/update_sales_invoice.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/utils.py b/havano_pos_integration/utils.py old mode 100755 new mode 100644 diff --git a/havano_pos_integration/www/__init__.py b/havano_pos_integration/www/__init__.py old mode 100755 new mode 100644 diff --git a/license.txt b/license.txt old mode 100755 new mode 100644 diff --git a/pyproject.toml b/pyproject.toml old mode 100755 new mode 100644