new sport and lottery report
This commit is contained in:
parent
537289c230
commit
8280774762
|
|
@ -0,0 +1,71 @@
|
||||||
|
frappe.query_reports["Sport and Lottery Report"] = {
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"fieldname": "company",
|
||||||
|
"label": __("Company"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Company",
|
||||||
|
"default": frappe.defaults.get_user_default("Company"),
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "from_date",
|
||||||
|
"label": __("From Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "to_date",
|
||||||
|
"label": __("To Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"default": frappe.datetime.get_today(),
|
||||||
|
"reqd": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"label": __("Sales Invoice"),
|
||||||
|
"fieldname": "sales_invoice",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Sales Invoice",
|
||||||
|
"width": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": __("Posting Date"),
|
||||||
|
"fieldname": "posting_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"width": 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": __("Grand Total"),
|
||||||
|
"fieldname": "grand_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": __("Amount up to 500"),
|
||||||
|
"fieldname": "amount_up_to_500",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": __("Amount over 500"),
|
||||||
|
"fieldname": "amount_over_500",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 180
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formatter": function(value, row, column, data, default_formatter) {
|
||||||
|
value = default_formatter(value, row, column, data);
|
||||||
|
if (column.fieldname === "amount_up_to_500" && data.amount_up_to_500 > 0) {
|
||||||
|
value = "<span style='color:green;'>" + value + "</span>";
|
||||||
|
} else if (column.fieldname === "amount_over_500" && data.amount_over_500 > 0) {
|
||||||
|
value = "<span style='color:red;'>" + value + "</span>";
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"add_total_row": 0,
|
||||||
|
"columns": [],
|
||||||
|
"creation": "2025-08-18 17:55:54.332106",
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Report",
|
||||||
|
"filters": [],
|
||||||
|
"idx": 0,
|
||||||
|
"is_standard": "Yes",
|
||||||
|
"letterhead": null,
|
||||||
|
"modified": "2025-08-18 17:56:15.489704",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Taxes Az",
|
||||||
|
"name": "Sport and Lottery Report",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"prepared_report": 0,
|
||||||
|
"ref_doctype": "Sales Invoice",
|
||||||
|
"report_name": "Sport and Lottery Report",
|
||||||
|
"report_type": "Script Report",
|
||||||
|
"roles": [
|
||||||
|
{
|
||||||
|
"role": "Accounts User"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Accounts Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Employee Self Service"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timeout": 0
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
|
def execute(filters=None):
|
||||||
|
columns, data = [], []
|
||||||
|
columns = get_columns()
|
||||||
|
data = get_data(filters)
|
||||||
|
return columns, data
|
||||||
|
|
||||||
|
def get_columns():
|
||||||
|
"""Defines the columns for the report."""
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"label": _("Sales Invoice"),
|
||||||
|
"fieldname": "sales_invoice",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Sales Invoice",
|
||||||
|
"width": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Posting Date"),
|
||||||
|
"fieldname": "posting_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"width": 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Grand Total"),
|
||||||
|
"fieldname": "grand_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Amount up to 500"),
|
||||||
|
"fieldname": "amount_up_to_500",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Amount over 500"),
|
||||||
|
"fieldname": "amount_over_500",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"options": "currency",
|
||||||
|
"width": 180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Currency"),
|
||||||
|
"fieldname": "currency",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Currency",
|
||||||
|
"hidden": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_data(filters):
|
||||||
|
"""Fetches and processes the report data."""
|
||||||
|
conditions = get_conditions(filters)
|
||||||
|
|
||||||
|
# The item groups to filter by
|
||||||
|
target_item_groups = ["İdman və mərc oyunları", "Lotoreya oyunları"]
|
||||||
|
|
||||||
|
# Fetching the data using Frappe's Query Builder
|
||||||
|
si = frappe.qb.DocType("Sales Invoice")
|
||||||
|
sii = frappe.qb.DocType("Sales Invoice Item")
|
||||||
|
item = frappe.qb.DocType("Item")
|
||||||
|
|
||||||
|
query = (
|
||||||
|
frappe.qb.from_(si)
|
||||||
|
.inner_join(sii)
|
||||||
|
.on(si.name == sii.parent)
|
||||||
|
.inner_join(item)
|
||||||
|
.on(sii.item_code == item.name)
|
||||||
|
.select(
|
||||||
|
si.name.as_("sales_invoice"),
|
||||||
|
si.posting_date,
|
||||||
|
si.grand_total,
|
||||||
|
si.currency,
|
||||||
|
sii.amount
|
||||||
|
)
|
||||||
|
.where(
|
||||||
|
(si.docstatus == 1) &
|
||||||
|
(item.item_group.isin(target_item_groups)) &
|
||||||
|
(si.company == filters.get("company")) &
|
||||||
|
(si.posting_date.between(filters.get("from_date"), filters.get("to_date")))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Execute the query
|
||||||
|
invoice_items = query.run(as_dict=True)
|
||||||
|
|
||||||
|
# Process the data to aggregate amounts per invoice
|
||||||
|
processed_data = {}
|
||||||
|
for item in invoice_items:
|
||||||
|
doc_name = item.sales_invoice
|
||||||
|
if doc_name not in processed_data:
|
||||||
|
processed_data[doc_name] = {
|
||||||
|
"sales_invoice": doc_name,
|
||||||
|
"posting_date": item.posting_date,
|
||||||
|
"grand_total": item.grand_total,
|
||||||
|
"currency": item.currency,
|
||||||
|
"amount_up_to_500": 0,
|
||||||
|
"amount_over_500": 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Distribute the item amount into the correct bucket
|
||||||
|
if item.amount <= 500:
|
||||||
|
processed_data[doc_name]["amount_up_to_500"] += item.amount
|
||||||
|
else:
|
||||||
|
processed_data[doc_name]["amount_over_500"] += item.amount
|
||||||
|
|
||||||
|
# Return the processed data as a list of dictionaries
|
||||||
|
return list(processed_data.values())
|
||||||
|
|
||||||
|
def get_conditions(filters):
|
||||||
|
"""Builds SQL conditions from filters."""
|
||||||
|
conditions = ""
|
||||||
|
if filters.get("company"):
|
||||||
|
conditions += f" AND si.company = '{filters.get('company')}'"
|
||||||
|
if filters.get("from_date"):
|
||||||
|
conditions += f" AND si.posting_date >= '{filters.get('from_date')}'"
|
||||||
|
if filters.get("to_date"):
|
||||||
|
conditions += f" AND si.posting_date <= '{filters.get('to_date')}'"
|
||||||
|
return conditions
|
||||||
|
|
||||||
Loading…
Reference in New Issue