added new columns to mining report
This commit is contained in:
parent
8aeb6d32f5
commit
e6f95b405d
|
|
@ -21,11 +21,16 @@ frappe.query_reports["Mining Resources Stock Report"] = {
|
||||||
formatter: function (value, row, column, data, default_formatter) {
|
formatter: function (value, row, column, data, default_formatter) {
|
||||||
value = default_formatter(value, row, column, data);
|
value = default_formatter(value, row, column, data);
|
||||||
|
|
||||||
// Format quantity columns with green color for positive values
|
// Format stock quantity columns with green color for positive values
|
||||||
if (column.fieldtype == "Float" && data && parseFloat(value) > 0) {
|
if (column.fieldtype == "Float" && data && parseFloat(value) > 0) {
|
||||||
value = "<span style='color:green; font-weight: bold'>" + value + "</span>";
|
value = "<span style='color:green; font-weight: bold'>" + value + "</span>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format sales amount columns with blue color for positive values
|
||||||
|
if (column.fieldtype == "Currency" && data && parseFloat(value) > 0) {
|
||||||
|
value = "<span style='color:blue; font-weight: bold'>" + value + "</span>";
|
||||||
|
}
|
||||||
|
|
||||||
// Format date column
|
// Format date column
|
||||||
if (column.fieldname == "date") {
|
if (column.fieldname == "date") {
|
||||||
value = "<span style='font-weight: bold'>" + value + "</span>";
|
value = "<span style='font-weight: bold'>" + value + "</span>";
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ def execute(filters=None):
|
||||||
|
|
||||||
def get_columns():
|
def get_columns():
|
||||||
item_groups = get_predefined_item_groups()
|
item_groups = get_predefined_item_groups()
|
||||||
|
sales_groups = get_sales_item_groups()
|
||||||
|
|
||||||
columns = [
|
columns = [
|
||||||
{
|
{
|
||||||
|
|
@ -27,11 +28,20 @@ def get_columns():
|
||||||
for group in item_groups:
|
for group in item_groups:
|
||||||
columns.append({
|
columns.append({
|
||||||
"label": _(group),
|
"label": _(group),
|
||||||
"fieldname": group.replace(" ", "_").replace("-", "_").replace(":", "_").replace("/", "_").replace("³", "3").replace("ə", "e").replace("ü", "u").replace("ö", "o").replace("ı", "i").replace("ç", "c").replace("ş", "s").replace("ğ", "g"),
|
"fieldname": get_field_name(group),
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"width": 120,
|
"width": 120,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Add sales columns for first 3 groups
|
||||||
|
for group in sales_groups:
|
||||||
|
columns.append({
|
||||||
|
"label": _(group + " (Sales)"),
|
||||||
|
"fieldname": get_field_name(group + "_sales"),
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"width": 130,
|
||||||
|
})
|
||||||
|
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def get_predefined_item_groups():
|
def get_predefined_item_groups():
|
||||||
|
|
@ -59,11 +69,20 @@ def get_predefined_item_groups():
|
||||||
"Gips, gəc - ton"
|
"Gips, gəc - ton"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_sales_item_groups():
|
||||||
|
"""Return the first 3 item groups for sales columns"""
|
||||||
|
return [
|
||||||
|
"Xam neft - ton",
|
||||||
|
"Təbii qaz - m³",
|
||||||
|
"Filiz faydalı qazıntıları: bütün növ metallar - ton"
|
||||||
|
]
|
||||||
|
|
||||||
def get_field_name(group_name):
|
def get_field_name(group_name):
|
||||||
"""Convert item group name to valid field name"""
|
"""Convert item group name to valid field name"""
|
||||||
return group_name.replace(" ", "_").replace("-", "_").replace(":", "_").replace("/", "_").replace("³", "3").replace("ə", "e").replace("ü", "u").replace("ö", "o").replace("ı", "i").replace("ç", "c").replace("ş", "s").replace("ğ", "g")
|
return group_name.replace(" ", "_").replace("-", "_").replace(":", "_").replace("/", "_").replace("³", "3").replace("ə", "e").replace("ü", "u").replace("ö", "o").replace("ı", "i").replace("ç", "c").replace("ş", "s").replace("ğ", "g").replace("(", "").replace(")", "")
|
||||||
|
|
||||||
def get_data(filters):
|
def get_stock_data(filters):
|
||||||
|
"""Get stock ledger data"""
|
||||||
item_groups = get_predefined_item_groups()
|
item_groups = get_predefined_item_groups()
|
||||||
|
|
||||||
# Get stock ledger entries grouped by posting_date and item_group
|
# Get stock ledger entries grouped by posting_date and item_group
|
||||||
|
|
@ -98,11 +117,61 @@ def get_data(filters):
|
||||||
if filters and filters.get("to_date"):
|
if filters and filters.get("to_date"):
|
||||||
query = query.where(sle_table.posting_date <= filters.to_date)
|
query = query.where(sle_table.posting_date <= filters.to_date)
|
||||||
|
|
||||||
raw_data = query.run(as_dict=True)
|
return query.run(as_dict=True)
|
||||||
|
|
||||||
# Group data by date
|
def get_sales_data(filters):
|
||||||
|
"""Get sales invoice data for first 3 item groups"""
|
||||||
|
sales_groups = get_sales_item_groups()
|
||||||
|
|
||||||
|
# Get sales invoice data
|
||||||
|
si_table = frappe.qb.DocType("Sales Invoice")
|
||||||
|
si_item_table = frappe.qb.DocType("Sales Invoice Item")
|
||||||
|
item_table = frappe.qb.DocType("Item")
|
||||||
|
item_group_table = frappe.qb.DocType("Item Group")
|
||||||
|
|
||||||
|
query = (
|
||||||
|
frappe.qb.from_(si_table)
|
||||||
|
.inner_join(si_item_table)
|
||||||
|
.on(si_table.name == si_item_table.parent)
|
||||||
|
.inner_join(item_table)
|
||||||
|
.on(si_item_table.item_code == item_table.name)
|
||||||
|
.inner_join(item_group_table)
|
||||||
|
.on(item_table.item_group == item_group_table.name)
|
||||||
|
.select(
|
||||||
|
si_table.posting_date,
|
||||||
|
item_group_table.name.as_("item_group"),
|
||||||
|
Sum(si_item_table.amount).as_("total_amount")
|
||||||
|
)
|
||||||
|
.where(
|
||||||
|
(item_group_table.name.isin(sales_groups))
|
||||||
|
& (si_table.docstatus == 1) # Only submitted invoices
|
||||||
|
& (si_table.selling_price_list == "Topdan Satış")
|
||||||
|
)
|
||||||
|
.groupby(si_table.posting_date, item_group_table.name)
|
||||||
|
.orderby(si_table.posting_date)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add date filter if provided
|
||||||
|
if filters and filters.get("from_date"):
|
||||||
|
query = query.where(si_table.posting_date >= filters.from_date)
|
||||||
|
if filters and filters.get("to_date"):
|
||||||
|
query = query.where(si_table.posting_date <= filters.to_date)
|
||||||
|
|
||||||
|
return query.run(as_dict=True)
|
||||||
|
|
||||||
|
def get_data(filters):
|
||||||
|
item_groups = get_predefined_item_groups()
|
||||||
|
sales_groups = get_sales_item_groups()
|
||||||
|
|
||||||
|
# Get stock data
|
||||||
|
stock_raw_data = get_stock_data(filters)
|
||||||
|
|
||||||
|
# Get sales data
|
||||||
|
sales_raw_data = get_sales_data(filters)
|
||||||
|
|
||||||
|
# Group stock data by date
|
||||||
date_data = {}
|
date_data = {}
|
||||||
for row in raw_data:
|
for row in stock_raw_data:
|
||||||
date = row.posting_date
|
date = row.posting_date
|
||||||
if date not in date_data:
|
if date not in date_data:
|
||||||
date_data[date] = {}
|
date_data[date] = {}
|
||||||
|
|
@ -110,18 +179,35 @@ def get_data(filters):
|
||||||
field_name = get_field_name(row.item_group)
|
field_name = get_field_name(row.item_group)
|
||||||
date_data[date][field_name] = flt(row.total_qty)
|
date_data[date][field_name] = flt(row.total_qty)
|
||||||
|
|
||||||
|
# Group sales data by date
|
||||||
|
for row in sales_raw_data:
|
||||||
|
date = row.posting_date
|
||||||
|
if date not in date_data:
|
||||||
|
date_data[date] = {}
|
||||||
|
|
||||||
|
field_name = get_field_name(row.item_group + "_sales")
|
||||||
|
date_data[date][field_name] = flt(row.total_amount)
|
||||||
|
|
||||||
# Convert to list format for the report
|
# Convert to list format for the report
|
||||||
result = []
|
result = []
|
||||||
for date in sorted(date_data.keys()):
|
for date in sorted(date_data.keys()):
|
||||||
row = {"date": date}
|
row = {"date": date}
|
||||||
|
|
||||||
# Add data for each item group column
|
# Add data for each stock item group column
|
||||||
for group in item_groups:
|
for group in item_groups:
|
||||||
field_name = get_field_name(group)
|
field_name = get_field_name(group)
|
||||||
row[field_name] = date_data[date].get(field_name, 0)
|
row[field_name] = date_data[date].get(field_name, 0)
|
||||||
|
|
||||||
# Only add row if it has any non-zero values
|
# Add data for each sales item group column
|
||||||
if any(row[get_field_name(group)] > 0 for group in item_groups):
|
for group in sales_groups:
|
||||||
|
field_name = get_field_name(group + "_sales")
|
||||||
|
row[field_name] = date_data[date].get(field_name, 0)
|
||||||
|
|
||||||
|
# Only add row if it has any non-zero values (stock or sales)
|
||||||
|
has_stock_data = any(row[get_field_name(group)] > 0 for group in item_groups)
|
||||||
|
has_sales_data = any(row[get_field_name(group + "_sales")] > 0 for group in sales_groups)
|
||||||
|
|
||||||
|
if has_stock_data or has_sales_data:
|
||||||
result.append(row)
|
result.append(row)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
Loading…
Reference in New Issue