perioada luna anterioara finalizata

This commit is contained in:
2026-02-16 14:12:03 +02:00
parent bc05d02319
commit 85423cfe94
5 changed files with 299 additions and 157 deletions

View File

@@ -13,3 +13,7 @@ ORACLE_PASSWORD=PAROLA
# Output settings # Output settings
OUTPUT_DIR=./output OUTPUT_DIR=./output
COMPANY_NAME=Data Intelligence Report COMPANY_NAME=Data Intelligence Report
# Reporting period end month (optional, default: previous complete month)
# Format: YYYY-MM. Example: 2026-01 means "report through January 2026"
# REPORT_END_MONTH=2026-01

View File

@@ -14,16 +14,42 @@ python -m venv .venv
source .venv/bin/activate # Linux/WSL source .venv/bin/activate # Linux/WSL
pip install -r requirements.txt pip install -r requirements.txt
# Run report (default: last 12 months) # Run report (default: last 12 months, previous complete month)
python main.py python main.py
# Custom period # Custom period duration
python main.py --months 6 python main.py --months 6
# Custom end month (report through January 2026)
python main.py --end-month 2026-01
# Combined: 6 months through December 2025
python main.py --months 6 --end-month 2025-12
# Docker alternative # Docker alternative
docker-compose run --rm report-generator docker-compose run --rm report-generator
``` ```
## Configurable Reporting Period
**Default behavior**: Reports cover data through the **last complete month** (excludes current incomplete month).
- Example: If today is 2026-02-16, default reports data through 2026-01-31
**Override with CLI**:
```bash
python main.py --end-month 2026-01 # Report through January 2026
```
**Override with environment variable**:
```bash
export REPORT_END_MONTH=2026-01
python main.py
```
**Internals**: All SQL queries receive `:data_referinta` as an Oracle DATE bind variable (= first day of month AFTER end-month).
- Ensures consistent period boundaries across all queries (sales, balances, aging, etc.)
- YoY comparisons auto-adjust based on configured period
## Oracle Connection ## Oracle Connection
| Environment | ORACLE_HOST value | | Environment | ORACLE_HOST value |

View File

@@ -26,6 +26,9 @@ def get_dsn():
OUTPUT_DIR = Path(os.getenv('OUTPUT_DIR', './output')) OUTPUT_DIR = Path(os.getenv('OUTPUT_DIR', './output'))
COMPANY_NAME = os.getenv('COMPANY_NAME', 'Data Intelligence Report') COMPANY_NAME = os.getenv('COMPANY_NAME', 'Data Intelligence Report')
# Reporting period - end month (YYYY-MM format, default: previous complete month)
REPORT_END_MONTH = os.getenv('REPORT_END_MONTH', None)
# Ensure output directory exists # Ensure output directory exists
OUTPUT_DIR.mkdir(parents=True, exist_ok=True) OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

74
main.py
View File

@@ -48,11 +48,12 @@ check_dependencies()
import oracledb import oracledb
import pandas as pd import pandas as pd
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from datetime import timedelta
from config import ( from config import (
ORACLE_CONFIG, get_dsn, OUTPUT_DIR, COMPANY_NAME, ORACLE_CONFIG, get_dsn, OUTPUT_DIR, COMPANY_NAME,
ANALYSIS_MONTHS, MIN_SALES_FOR_ANALYSIS, LOW_MARGIN_THRESHOLD, ANALYSIS_MONTHS, MIN_SALES_FOR_ANALYSIS, LOW_MARGIN_THRESHOLD,
RECOMMENDATION_THRESHOLDS RECOMMENDATION_THRESHOLDS, REPORT_END_MONTH
) )
from queries import QUERIES from queries import QUERIES
from report_generator import ( from report_generator import (
@@ -279,6 +280,41 @@ class PerformanceLogger:
print(f"\n📝 Log saved to: {log_file}") print(f"\n📝 Log saved to: {log_file}")
def compute_data_referinta(end_month_str: str = None) -> datetime:
"""
Compute reference date (first day of month AFTER the last reporting month).
If end_month_str is None: default to first day of current month
(i.e., report through end of previous month).
If end_month_str is 'YYYY-MM': parse it and return first day of next month.
"""
if end_month_str:
parsed = datetime.strptime(end_month_str, '%Y-%m')
if parsed.month == 12:
return datetime(parsed.year + 1, 1, 1)
else:
return datetime(parsed.year, parsed.month + 1, 1)
else:
today = datetime.now()
return datetime(today.year, today.month, 1)
def resolve_dynamic_tables(sql: str, data_referinta: datetime, months: int = 12) -> str:
"""
Replace vjv2025/vjc2025 with correct year (or UNION ALL if spanning years).
"""
end_year = (data_referinta - timedelta(days=1)).year
start_year = (data_referinta - relativedelta(months=months)).year
if start_year == end_year:
sql = sql.replace('vjv2025', f'vjv{end_year}')
sql = sql.replace('vjc2025', f'vjc{end_year}')
else:
sql = sql.replace('vjv2025', f'(SELECT * FROM vjv{start_year} UNION ALL SELECT * FROM vjv{end_year})')
sql = sql.replace('vjc2025', f'(SELECT * FROM vjc{start_year} UNION ALL SELECT * FROM vjc{end_year})')
return sql
class OracleConnection: class OracleConnection:
"""Context manager for Oracle database connection""" """Context manager for Oracle database connection"""
@@ -315,6 +351,11 @@ def execute_query(connection, query_name: str, query_info: dict) -> pd.DataFrame
try: try:
sql = query_info['sql'] sql = query_info['sql']
params = query_info.get('params', {}) params = query_info.get('params', {})
# Resolve dynamic table names (vjv/vjc year-specific tables)
if 'data_referinta' in params:
months = params.get('months', 12)
sql = resolve_dynamic_tables(sql, params['data_referinta'], months)
print(f" 📊 Executare: {query_name}...", end=" ") print(f" 📊 Executare: {query_name}...", end=" ")
@@ -334,27 +375,31 @@ def execute_query(connection, query_name: str, query_info: dict) -> pd.DataFrame
def generate_reports(args): def generate_reports(args):
"""Main function to generate all reports""" """Main function to generate all reports"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
excel_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.xlsx" excel_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.xlsx"
pdf_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.pdf" pdf_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.pdf"
# Compute reference date
data_referinta = compute_data_referinta(args.end_month)
end_date = data_referinta - timedelta(days=1) # last day of reporting period
start_date = data_referinta - relativedelta(months=args.months)
period_str = f"Perioada: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}"
print("\n" + "="*60) print("\n" + "="*60)
print(" DATA INTELLIGENCE REPORT GENERATOR") print(" DATA INTELLIGENCE REPORT GENERATOR")
print("="*60) print("="*60)
print(f" Perioada: Ultimele {args.months} luni") print(f" {period_str} ({args.months} luni)")
print(f" Output: {OUTPUT_DIR}") print(f" Output: {OUTPUT_DIR}")
print("="*60 + "\n") print("="*60 + "\n")
# Update parameters with command line arguments # Update parameters with command line arguments and inject data_referinta
for query_info in QUERIES.values(): for query_info in QUERIES.values():
if 'months' in query_info.get('params', {}): if 'months' in query_info.get('params', {}):
query_info['params']['months'] = args.months query_info['params']['months'] = args.months
# Inject data_referinta into ALL queries
# Calculate reporting period string query_info.setdefault('params', {})
end_date = datetime.now() query_info['params']['data_referinta'] = data_referinta
start_date = end_date - relativedelta(months=args.months)
period_str = f"Perioada: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}"
# Add period to descriptions for queries with months parameter # Add period to descriptions for queries with months parameter
for query_name, query_info in QUERIES.items(): for query_name, query_info in QUERIES.items():
@@ -1101,6 +1146,13 @@ Exemple:
default=ANALYSIS_MONTHS, default=ANALYSIS_MONTHS,
help=f'Numărul de luni pentru analiză (default: {ANALYSIS_MONTHS})' help=f'Numărul de luni pentru analiză (default: {ANALYSIS_MONTHS})'
) )
parser.add_argument(
'--end-month', '-e',
type=str,
default=REPORT_END_MONTH,
help='Luna finala de raportare YYYY-MM (default: luna completa anterioara). Ex: 2026-01'
)
parser.add_argument( parser.add_argument(
'--output-dir', '-o', '--output-dir', '-o',

View File

@@ -33,7 +33,8 @@ LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip > 0
AND f.tip NOT IN (7, 8, 9, 24) AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire, p.cod_fiscal GROUP BY f.id_part, p.denumire, p.cod_fiscal
ORDER BY marja_bruta DESC ORDER BY marja_bruta DESC
""" """
@@ -58,7 +59,8 @@ SELECT * FROM (
LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire, p.cod_fiscal GROUP BY f.id_part, p.denumire, p.cod_fiscal
HAVING SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > :min_sales HAVING SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > :min_sales
) )
@@ -88,7 +90,8 @@ LEFT JOIN nom_articole art ON d.id_articol = art.id_articol
LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY sg.id_grupa, sg.grupa, art.id_subgrupa, sg.subgrupa GROUP BY sg.id_grupa, sg.grupa, art.id_subgrupa, sg.subgrupa
ORDER BY vanzari_fara_tva DESC ORDER BY vanzari_fara_tva DESC
""" """
@@ -115,7 +118,8 @@ FROM vanzari f
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY CASE GROUP BY CASE
WHEN d.cont IN ('341', '345') THEN 'Producție proprie' WHEN d.cont IN ('341', '345') THEN 'Producție proprie'
WHEN d.cont = '301' THEN 'Materii prime' WHEN d.cont = '301' THEN 'Materii prime'
@@ -145,7 +149,8 @@ WITH preturi_detalii AS (
LEFT JOIN gest_art_sbgr g ON a.id_subgrupa = g.id_subgrupa LEFT JOIN gest_art_sbgr g ON a.id_subgrupa = g.id_subgrupa
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
AND d.pret > 0 AND d.pret > 0
) )
SELECT SELECT
@@ -184,7 +189,8 @@ WITH base_prices AS (
JOIN NOM_PARTENERI p ON f.id_part = p.id_part JOIN NOM_PARTENERI p ON f.id_part = p.id_part
WHERE f.sters = 0 AND d.sters = 0 WHERE f.sters = 0 AND d.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
AND d.pret > 0 AND d.pret > 0
), ),
preturi_medii AS ( preturi_medii AS (
@@ -231,7 +237,8 @@ LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
LEFT JOIN nom_articole art ON d.id_articol = art.id_articol LEFT JOIN nom_articole art ON d.id_articol = art.id_articol
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
AND d.pret_achizitie > 0 AND d.pret_achizitie > 0
AND d.pret > 0 AND d.pret > 0
AND CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END < d.pret_achizitie AND CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END < d.pret_achizitie
@@ -247,17 +254,18 @@ WITH vanzari_perioade AS (
SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */
f.id_part, f.id_part,
p.denumire AS client, p.denumire AS client,
SUM(CASE WHEN f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) SUM(CASE WHEN f.data_act >= ADD_MONTHS(:data_referinta, -12)
THEN d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END ELSE 0 END) AS vanzari_an_curent, THEN d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END ELSE 0 END) AS vanzari_an_curent,
SUM(CASE WHEN f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) SUM(CASE WHEN f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act < ADD_MONTHS(:data_referinta, -12)
THEN d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END ELSE 0 END) AS vanzari_an_trecut THEN d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END ELSE 0 END) AS vanzari_an_trecut
FROM vanzari f FROM vanzari f
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire GROUP BY f.id_part, p.denumire
) )
SELECT SELECT
@@ -292,7 +300,8 @@ WITH total_vanzari AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
), ),
vanzari_client AS ( vanzari_client AS (
SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */
@@ -304,7 +313,8 @@ vanzari_client AS (
LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire GROUP BY f.id_part, p.denumire
), ),
top_clienti AS ( top_clienti AS (
@@ -357,7 +367,8 @@ FROM VANZARI f
JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare
WHERE f.sters = 0 AND d.sters = 0 WHERE f.sters = 0 AND d.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < :data_referinta
GROUP BY TO_CHAR(f.data_act, 'YYYY-MM') GROUP BY TO_CHAR(f.data_act, 'YYYY-MM')
ORDER BY luna ORDER BY luna
""" """
@@ -379,8 +390,8 @@ SELECT
END AS valoare_stoc_vanzare END AS valoare_stoc_vanzare
FROM vstoc s FROM vstoc s
JOIN nom_gestiuni g ON s.id_gestiune = g.id_gestiune JOIN nom_gestiuni g ON s.id_gestiune = g.id_gestiune
WHERE s.an = EXTRACT(YEAR FROM SYSDATE) WHERE s.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND s.luna = EXTRACT(MONTH FROM SYSDATE) AND s.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
AND (s.cants + s.cant - s.cante) > 0 AND (s.cants + s.cant - s.cante) > 0
GROUP BY s.id_gestiune, s.nume_gestiune, g.nr_pag, s.id_grupa, s.grupa, s.id_subgrupa, s.subgrupa GROUP BY s.id_gestiune, s.nume_gestiune, g.nr_pag, s.id_grupa, s.grupa, s.id_subgrupa, s.subgrupa
ORDER BY valoare_stoc_achizitie DESC ORDER BY valoare_stoc_achizitie DESC
@@ -396,12 +407,12 @@ SELECT
(s.cants + s.cant - s.cante) AS cantitate, (s.cants + s.cant - s.cante) AS cantitate,
ROUND((s.cants + s.cant - s.cante) * s.pret, 2) AS valoare, ROUND((s.cants + s.cant - s.cante) * s.pret, 2) AS valoare,
s.dataout AS ultima_iesire, s.dataout AS ultima_iesire,
ROUND(SYSDATE - NVL(s.dataout, s.datain)) AS zile_fara_miscare ROUND((:data_referinta - 1) - NVL(s.dataout, s.datain)) AS zile_fara_miscare
FROM vstoc s FROM vstoc s
WHERE s.an = EXTRACT(YEAR FROM SYSDATE) WHERE s.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND s.luna = EXTRACT(MONTH FROM SYSDATE) AND s.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
AND (s.cants + s.cant - s.cante) > 0 AND (s.cants + s.cant - s.cante) > 0
AND (s.dataout IS NULL OR s.dataout < SYSDATE - 90) AND (s.dataout IS NULL OR s.dataout < (:data_referinta - 1) - 90)
AND (s.cants + s.cant - s.cante) * s.pret > 100 AND (s.cants + s.cant - s.cante) * s.pret > 100
ORDER BY zile_fara_miscare DESC NULLS FIRST ORDER BY zile_fara_miscare DESC NULLS FIRST
FETCH FIRST 100 ROWS ONLY FETCH FIRST 100 ROWS ONLY
@@ -419,7 +430,8 @@ WITH vanzari_articole AS (
JOIN vanzari v ON r.id_fact = v.id_fact JOIN vanzari v ON r.id_fact = v.id_fact
WHERE r.id_tip_rulaj = 0 WHERE r.id_tip_rulaj = 0
AND r.cante <> 0 AND r.cante <> 0
AND r.dataact >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND r.dataact >= ADD_MONTHS(:data_referinta, -12)
AND r.dataact < :data_referinta
GROUP BY r.id_articol GROUP BY r.id_articol
), ),
stoc_curent AS ( stoc_curent AS (
@@ -429,8 +441,8 @@ stoc_curent AS (
s.nume_gestiune, s.nume_gestiune,
SUM((s.cants + s.cant - s.cante) * s.pret) AS valoare_stoc SUM((s.cants + s.cant - s.cante) * s.pret) AS valoare_stoc
FROM vstoc s FROM vstoc s
WHERE s.an = EXTRACT(YEAR FROM SYSDATE) WHERE s.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND s.luna = EXTRACT(MONTH FROM SYSDATE) AND s.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
AND (s.cants + s.cant - s.cante) > 0 AND (s.cants + s.cant - s.cante) > 0
GROUP BY s.id_articol, s.denumire, s.nume_gestiune GROUP BY s.id_articol, s.denumire, s.nume_gestiune
) )
@@ -482,7 +494,8 @@ SELECT
ROUND(SUM((NVL(r.cant, 0) - NVL(r.cante, 0)) * NVL(r.pret, 0)), 2) AS sold_net_valoare ROUND(SUM((NVL(r.cant, 0) - NVL(r.cante, 0)) * NVL(r.pret, 0)), 2) AS sold_net_valoare
FROM vrul r FROM vrul r
WHERE r.cont IN ('301', '341', '345') WHERE r.cont IN ('301', '341', '345')
AND r.dataact >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND r.dataact >= ADD_MONTHS(:data_referinta, -:months)
AND r.dataact < :data_referinta
GROUP BY TO_CHAR(r.dataact, 'YYYY-MM'), GROUP BY TO_CHAR(r.dataact, 'YYYY-MM'),
CASE WHEN r.cont = '301' THEN 'Materii prime' CASE WHEN r.cont = '301' THEN 'Materii prime'
WHEN r.cont = '341' THEN 'Semifabricate' WHEN r.cont = '341' THEN 'Semifabricate'
@@ -506,7 +519,8 @@ WITH base_data AS (
JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare
WHERE f.sters = 0 AND d.sters = 0 WHERE f.sters = 0 AND d.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
), ),
aggregated AS ( aggregated AS (
SELECT SELECT
@@ -586,7 +600,8 @@ LEFT JOIN nom_articole a ON d.id_articol = a.id_articol
LEFT JOIN gest_art_sbgr g ON a.id_subgrupa = g.id_subgrupa LEFT JOIN gest_art_sbgr g ON a.id_subgrupa = g.id_subgrupa
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY d.id_articol, NVL2(d.id_articol, a.denumire, d.explicatie), g.subgrupa, a.um GROUP BY d.id_articol, NVL2(d.id_articol, a.denumire, d.explicatie), g.subgrupa, a.um
ORDER BY valoare_vanzari DESC ORDER BY valoare_vanzari DESC
FETCH FIRST 50 ROWS ONLY FETCH FIRST 50 ROWS ONLY
@@ -612,7 +627,8 @@ LEFT JOIN nom_gestiuni g ON d.id_gestiune = g.id_gestiune
JOIN nom_articole a ON d.id_articol = a.id_articol JOIN nom_articole a ON d.id_articol = a.id_articol
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
AND NVL(a.in_stoc, 1) = 1 AND NVL(a.in_stoc, 1) = 1
GROUP BY d.id_gestiune, g.nume_gestiune GROUP BY d.id_gestiune, g.nume_gestiune
ORDER BY vanzari_fara_tva DESC ORDER BY vanzari_fara_tva DESC
@@ -642,7 +658,8 @@ LEFT JOIN nom_articole art ON d.id_articol = art.id_articol
LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
AND NVL(art.in_stoc, 0) = 0 AND NVL(art.in_stoc, 0) = 0
GROUP BY d.id_articol, art.denumire, d.explicatie, sg.subgrupa, art.um GROUP BY d.id_articol, art.denumire, d.explicatie, sg.subgrupa, art.um
ORDER BY vanzari_fara_tva DESC ORDER BY vanzari_fara_tva DESC
@@ -665,8 +682,8 @@ SELECT
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
JOIN vnom_parteneri p ON b.id_part = p.id_part JOIN vnom_parteneri p ON b.id_part = p.id_part
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
GROUP BY p.id_part, p.denumire, p.cod_fiscal GROUP BY p.id_part, p.denumire, p.cod_fiscal
HAVING SUM(b.solddeb - b.soldcred) <> 0 HAVING SUM(b.solddeb - b.soldcred) <> 0
ORDER BY sold_curent DESC ORDER BY sold_curent DESC
@@ -689,8 +706,8 @@ SELECT
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
JOIN vnom_parteneri p ON b.id_part = p.id_part JOIN vnom_parteneri p ON b.id_part = p.id_part
WHERE b.cont LIKE '401%' WHERE b.cont LIKE '401%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
GROUP BY p.id_part, p.denumire, p.cod_fiscal GROUP BY p.id_part, p.denumire, p.cod_fiscal
HAVING SUM(b.soldcred - b.solddeb) <> 0 HAVING SUM(b.soldcred - b.solddeb) <> 0
ORDER BY sold_curent DESC ORDER BY sold_curent DESC
@@ -702,7 +719,9 @@ ORDER BY sold_curent DESC
# FIX: Filter by last closed calendar period to avoid duplicate invoices # FIX: Filter by last closed calendar period to avoid duplicate invoices
AGING_CREANTE = """ AGING_CREANTE = """
WITH ultima_luna AS ( WITH ultima_luna AS (
SELECT anul, luna FROM calendar ORDER BY anul DESC, luna DESC FETCH FIRST 1 ROW ONLY SELECT EXTRACT(YEAR FROM (:data_referinta - 1)) AS anul,
EXTRACT(MONTH FROM (:data_referinta - 1)) AS luna
FROM dual
), ),
solduri_clienti AS ( solduri_clienti AS (
SELECT SELECT
@@ -716,8 +735,8 @@ solduri_clienti AS (
(r.precdeb + r.debit) - (r.preccred + r.credit) AS sold_ramas, (r.precdeb + r.debit) - (r.preccred + r.credit) AS sold_ramas,
CASE CASE
WHEN r.datascad IS NULL THEN 0 WHEN r.datascad IS NULL THEN 0
WHEN r.datascad >= TRUNC(SYSDATE) THEN 0 WHEN r.datascad >= :data_referinta THEN 0
ELSE ROUND(TRUNC(SYSDATE) - r.datascad) ELSE ROUND((:data_referinta - 1) - r.datascad)
END AS zile_restante END AS zile_restante
FROM vireg_parteneri r, ultima_luna ul FROM vireg_parteneri r, ultima_luna ul
WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%') WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%')
@@ -744,20 +763,22 @@ ORDER BY total_sold DESC
# FIX: Filter by last closed calendar period to avoid duplicate invoices # FIX: Filter by last closed calendar period to avoid duplicate invoices
FACTURI_RESTANTE = """ FACTURI_RESTANTE = """
WITH ultima_luna AS ( WITH ultima_luna AS (
SELECT anul, luna FROM calendar ORDER BY anul DESC, luna DESC FETCH FIRST 1 ROW ONLY SELECT EXTRACT(YEAR FROM (:data_referinta - 1)) AS anul,
EXTRACT(MONTH FROM (:data_referinta - 1)) AS luna
FROM dual
) )
SELECT SELECT
r.nume AS client, r.nume AS client,
r.serie_act || ' ' || r.nract AS nr_factura, r.serie_act || ' ' || r.nract AS nr_factura,
r.dataact AS data_factura, r.dataact AS data_factura,
r.datascad AS data_scadenta, r.datascad AS data_scadenta,
ROUND(TRUNC(SYSDATE) - r.datascad) AS zile_intarziere, ROUND((:data_referinta - 1) - r.datascad) AS zile_intarziere,
ROUND((r.precdeb + r.debit) - (r.preccred + r.credit), 2) AS suma_restanta ROUND((r.precdeb + r.debit) - (r.preccred + r.credit), 2) AS suma_restanta
FROM vireg_parteneri r, ultima_luna ul FROM vireg_parteneri r, ultima_luna ul
WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%') WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%')
AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0 AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0
AND r.datascad IS NOT NULL AND r.datascad IS NOT NULL
AND r.datascad < TRUNC(SYSDATE) AND r.datascad < :data_referinta
AND r.an = ul.anul AND r.luna = ul.luna AND r.an = ul.anul AND r.luna = ul.luna
ORDER BY zile_intarziere DESC ORDER BY zile_intarziere DESC
FETCH FIRST 100 ROWS ONLY FETCH FIRST 100 ROWS ONLY
@@ -770,7 +791,9 @@ FETCH FIRST 100 ROWS ONLY
# FIX: Filter by last closed calendar period to avoid duplicate invoices # FIX: Filter by last closed calendar period to avoid duplicate invoices
AGING_DATORII = """ AGING_DATORII = """
WITH ultima_luna AS ( WITH ultima_luna AS (
SELECT anul, luna FROM calendar ORDER BY anul DESC, luna DESC FETCH FIRST 1 ROW ONLY SELECT EXTRACT(YEAR FROM (:data_referinta - 1)) AS anul,
EXTRACT(MONTH FROM (:data_referinta - 1)) AS luna
FROM dual
), ),
solduri_furnizori AS ( solduri_furnizori AS (
SELECT SELECT
@@ -784,8 +807,8 @@ solduri_furnizori AS (
(r.preccred + r.credit) - (r.precdeb + r.debit) AS sold_ramas, (r.preccred + r.credit) - (r.precdeb + r.debit) AS sold_ramas,
CASE CASE
WHEN r.datascad IS NULL THEN 0 WHEN r.datascad IS NULL THEN 0
WHEN r.datascad >= TRUNC(SYSDATE) THEN 0 WHEN r.datascad >= :data_referinta THEN 0
ELSE ROUND(TRUNC(SYSDATE) - r.datascad) ELSE ROUND((:data_referinta - 1) - r.datascad)
END AS zile_restante END AS zile_restante
FROM vireg_parteneri r, ultima_luna ul FROM vireg_parteneri r, ultima_luna ul
WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%') WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%')
@@ -812,20 +835,22 @@ ORDER BY total_sold DESC
# FIX: Filter by last closed calendar period to avoid duplicate invoices # FIX: Filter by last closed calendar period to avoid duplicate invoices
FACTURI_RESTANTE_FURNIZORI = """ FACTURI_RESTANTE_FURNIZORI = """
WITH ultima_luna AS ( WITH ultima_luna AS (
SELECT anul, luna FROM calendar ORDER BY anul DESC, luna DESC FETCH FIRST 1 ROW ONLY SELECT EXTRACT(YEAR FROM (:data_referinta - 1)) AS anul,
EXTRACT(MONTH FROM (:data_referinta - 1)) AS luna
FROM dual
) )
SELECT SELECT
r.nume AS furnizor, r.nume AS furnizor,
r.serie_act || ' ' || r.nract AS nr_factura, r.serie_act || ' ' || r.nract AS nr_factura,
r.dataact AS data_factura, r.dataact AS data_factura,
r.datascad AS data_scadenta, r.datascad AS data_scadenta,
ROUND(TRUNC(SYSDATE) - r.datascad) AS zile_intarziere, ROUND((:data_referinta - 1) - r.datascad) AS zile_intarziere,
ROUND((r.preccred + r.credit) - (r.precdeb + r.debit), 2) AS suma_restanta ROUND((r.preccred + r.credit) - (r.precdeb + r.debit), 2) AS suma_restanta
FROM vireg_parteneri r, ultima_luna ul FROM vireg_parteneri r, ultima_luna ul
WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%') WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%')
AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0 AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0
AND r.datascad IS NOT NULL AND r.datascad IS NOT NULL
AND r.datascad < TRUNC(SYSDATE) AND r.datascad < :data_referinta
AND r.an = ul.anul AND r.luna = ul.luna AND r.an = ul.anul AND r.luna = ul.luna
ORDER BY zile_intarziere DESC ORDER BY zile_intarziere DESC
FETCH FIRST 100 ROWS ONLY FETCH FIRST 100 ROWS ONLY
@@ -852,8 +877,8 @@ WITH vanzari_12_luni AS (
) AS total_vanzari ) AS total_vanzari
FROM vjv2025 FROM vjv2025
WHERE (an * 12 + luna) BETWEEN WHERE (an * 12 + luna) BETWEEN
(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -12))) (EXTRACT(YEAR FROM ADD_MONTHS(:data_referinta, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(:data_referinta, -12)))
AND (EXTRACT(YEAR FROM SYSDATE) * 12 + EXTRACT(MONTH FROM SYSDATE)) AND (EXTRACT(YEAR FROM (:data_referinta - 1)) * 12 + EXTRACT(MONTH FROM (:data_referinta - 1)))
AND EXTRACT(YEAR FROM dataireg) = an AND EXTRACT(YEAR FROM dataireg) = an
AND EXTRACT(MONTH FROM dataireg) = luna AND EXTRACT(MONTH FROM dataireg) = luna
), ),
@@ -862,8 +887,8 @@ sold_clienti AS (
SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
achizitii_12_luni AS ( achizitii_12_luni AS (
-- Achiziții fără TVA din ultimele 12 luni (jurnal cumpărări vjc2025) -- Achiziții fără TVA din ultimele 12 luni (jurnal cumpărări vjc2025)
@@ -889,8 +914,8 @@ achizitii_12_luni AS (
) AS total_achizitii ) AS total_achizitii
FROM vjc2025 FROM vjc2025
WHERE (an * 12 + luna) BETWEEN WHERE (an * 12 + luna) BETWEEN
(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -12))) (EXTRACT(YEAR FROM ADD_MONTHS(:data_referinta, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(:data_referinta, -12)))
AND (EXTRACT(YEAR FROM SYSDATE) * 12 + EXTRACT(MONTH FROM SYSDATE)) AND (EXTRACT(YEAR FROM (:data_referinta - 1)) * 12 + EXTRACT(MONTH FROM (:data_referinta - 1)))
AND EXTRACT(YEAR FROM dataireg) = an AND EXTRACT(YEAR FROM dataireg) = an
AND EXTRACT(MONTH FROM dataireg) = luna AND EXTRACT(MONTH FROM dataireg) = luna
), ),
@@ -899,8 +924,8 @@ sold_furnizori AS (
SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '401%' WHERE b.cont LIKE '401%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
) )
SELECT SELECT
'DSO (Zile incasare clienti)' AS indicator, 'DSO (Zile incasare clienti)' AS indicator,
@@ -945,8 +970,8 @@ SELECT
END AS valuta END AS valuta
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%') WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
GROUP BY b.cont GROUP BY b.cont
HAVING SUM(b.solddeb - b.soldcred) <> 0 HAVING SUM(b.solddeb - b.soldcred) <> 0
ORDER BY b.cont ORDER BY b.cont
@@ -963,8 +988,8 @@ WITH metrici AS (
(SELECT SUM(b.solddeb - b.soldcred) (SELECT SUM(b.solddeb - b.soldcred)
FROM vbal b FROM vbal b
WHERE b.cont LIKE '3%' WHERE b.cont LIKE '3%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE)) AS stoc_curent, AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))) AS stoc_curent,
-- COGS din facturi (preț achiziție articole vândute) -- COGS din facturi (preț achiziție articole vândute)
(SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ (SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */
SUM(d.cantitate * d.pret_achizitie) SUM(d.cantitate * d.pret_achizitie)
@@ -972,13 +997,14 @@ WITH metrici AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12)) AS cogs_12_luni, AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta) AS cogs_12_luni,
-- Creanțe clienți -- Creanțe clienți
(SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) (SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END)
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE)) AS creante, AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))) AS creante,
-- Vânzări 12 luni din jurnal TVA vânzări (vjv2025) -- Vânzări 12 luni din jurnal TVA vânzări (vjv2025)
(SELECT SUM( (SELECT SUM(
-- Baze impozabile (ro*b) -- Baze impozabile (ro*b)
@@ -993,16 +1019,16 @@ WITH metrici AS (
NVL(wrscdd, 0) + NVL(fodd, 0) + NVL(fofdd, 0) + NVL(wrscfdd, 0) + NVL(wrn, 0)) NVL(wrscdd, 0) + NVL(fodd, 0) + NVL(fofdd, 0) + NVL(wrscfdd, 0) + NVL(wrn, 0))
FROM vjv2025 FROM vjv2025
WHERE (an * 12 + luna) BETWEEN WHERE (an * 12 + luna) BETWEEN
(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -12))) (EXTRACT(YEAR FROM ADD_MONTHS(:data_referinta, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(:data_referinta, -12)))
AND (EXTRACT(YEAR FROM SYSDATE) * 12 + EXTRACT(MONTH FROM SYSDATE)) AND (EXTRACT(YEAR FROM (:data_referinta - 1)) * 12 + EXTRACT(MONTH FROM (:data_referinta - 1)))
AND EXTRACT(YEAR FROM dataireg) = an AND EXTRACT(YEAR FROM dataireg) = an
AND EXTRACT(MONTH FROM dataireg) = luna) AS vanzari_12_luni, AND EXTRACT(MONTH FROM dataireg) = luna) AS vanzari_12_luni,
-- Datorii furnizori -- Datorii furnizori
(SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) (SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END)
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '401%' WHERE b.cont LIKE '401%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE)) AS datorii_furnizori, AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))) AS datorii_furnizori,
-- Achiziții 12 luni din jurnal TVA cumpărări (vjc2025) -- Achiziții 12 luni din jurnal TVA cumpărări (vjc2025)
(SELECT SUM( (SELECT SUM(
-- Baze impozabile domestice (ro*b) -- Baze impozabile domestice (ro*b)
@@ -1025,8 +1051,8 @@ WITH metrici AS (
NVL(cen, 0)) NVL(cen, 0))
FROM vjc2025 FROM vjc2025
WHERE (an * 12 + luna) BETWEEN WHERE (an * 12 + luna) BETWEEN
(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -12))) (EXTRACT(YEAR FROM ADD_MONTHS(:data_referinta, -12)) * 12 + EXTRACT(MONTH FROM ADD_MONTHS(:data_referinta, -12)))
AND (EXTRACT(YEAR FROM SYSDATE) * 12 + EXTRACT(MONTH FROM SYSDATE)) AND (EXTRACT(YEAR FROM (:data_referinta - 1)) * 12 + EXTRACT(MONTH FROM (:data_referinta - 1)))
AND EXTRACT(YEAR FROM dataireg) = an AND EXTRACT(YEAR FROM dataireg) = an
AND EXTRACT(MONTH FROM dataireg) = luna) AS achizitii_12_luni AND EXTRACT(MONTH FROM dataireg) = luna) AS achizitii_12_luni
FROM dual FROM dual
@@ -1081,7 +1107,8 @@ WITH vanzari_detaliate AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
), ),
total AS ( total AS (
SELECT SUM(vanzare) AS total_vanzari, SUM(marja) AS total_marja SELECT SUM(vanzare) AS total_vanzari, SUM(marja) AS total_marja
@@ -1114,7 +1141,8 @@ WITH vanzari_lunare AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < :data_referinta
GROUP BY EXTRACT(MONTH FROM f.data_act), TO_CHAR(f.data_act, 'Month', 'NLS_DATE_LANGUAGE=ROMANIAN'), EXTRACT(YEAR FROM f.data_act) GROUP BY EXTRACT(MONTH FROM f.data_act), TO_CHAR(f.data_act, 'Month', 'NLS_DATE_LANGUAGE=ROMANIAN'), EXTRACT(YEAR FROM f.data_act)
), ),
statistici_luna AS ( statistici_luna AS (
@@ -1155,50 +1183,55 @@ WITH clienti_activi_3_luni AS (
SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -3) AND f.data_act >= ADD_MONTHS(:data_referinta, -3)
AND f.data_act < :data_referinta
), ),
clienti_activi_12_luni AS ( clienti_activi_12_luni AS (
SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
), ),
clienti_noi AS ( clienti_noi AS (
SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
AND f.id_part NOT IN ( AND f.id_part NOT IN (
SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part
FROM vanzari f2 FROM vanzari f2
WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24) WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24)
AND f2.data_act < ADD_MONTHS(TRUNC(SYSDATE), -12) AND f2.data_act < ADD_MONTHS(:data_referinta, -12)
) )
), ),
clienti_pierduti AS ( clienti_pierduti AS (
SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -6) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -6)
AND f.id_part NOT IN ( AND f.id_part NOT IN (
SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part
FROM vanzari f2 FROM vanzari f2
WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24) WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24)
AND f2.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -6) AND f2.data_act >= ADD_MONTHS(:data_referinta, -6)
) )
), ),
clienti_inactivi AS ( clienti_inactivi AS (
SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt SELECT /*+ INDEX(f IDX_VANZARI_NR) */ COUNT(DISTINCT f.id_part) AS cnt
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -6) AND f.data_act >= ADD_MONTHS(:data_referinta, -6)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -3) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -3)
AND f.id_part NOT IN ( AND f.id_part NOT IN (
SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part SELECT /*+ INDEX(f2 IDX_VANZARI_NR) */ DISTINCT f2.id_part
FROM vanzari f2 FROM vanzari f2
WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24) WHERE f2.sters = 0 AND f2.tip > 0 AND f2.tip NOT IN (7, 8, 9, 24)
AND f2.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -3) AND f2.data_act >= ADD_MONTHS(:data_referinta, -3)
) )
) )
SELECT 'Clienti activi (ultimele 3 luni)' AS indicator, cnt AS valoare, 'Au cumparat recent' AS explicatie FROM clienti_activi_3_luni SELECT 'Clienti activi (ultimele 3 luni)' AS indicator, cnt AS valoare, 'Au cumparat recent' AS explicatie FROM clienti_activi_3_luni
@@ -1228,7 +1261,8 @@ WITH frecventa_curenta AS (
LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire GROUP BY f.id_part, p.denumire
), ),
frecventa_anterioara AS ( frecventa_anterioara AS (
@@ -1238,8 +1272,9 @@ frecventa_anterioara AS (
FROM vanzari f FROM vanzari f
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -12)
GROUP BY f.id_part GROUP BY f.id_part
) )
SELECT SELECT
@@ -1270,7 +1305,8 @@ WITH total_vanzari AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
), ),
vanzari_client AS ( vanzari_client AS (
SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */
@@ -1281,7 +1317,8 @@ vanzari_client AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part GROUP BY f.id_part
) )
SELECT SELECT
@@ -1337,7 +1374,8 @@ WITH vanzari_client AS (
LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_parteneri p ON f.id_part = p.id_part
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire GROUP BY f.id_part, p.denumire
) )
SELECT SELECT
@@ -1379,7 +1417,8 @@ LEFT JOIN nom_articole art ON d.id_articol = art.id_articol
LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa LEFT JOIN vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -:months) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months)
AND f.data_act < :data_referinta
GROUP BY f.id_part, p.denumire, sg.id_grupa, sg.grupa GROUP BY f.id_part, p.denumire, sg.id_grupa, sg.grupa
HAVING SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 1000 HAVING SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 1000
ORDER BY p.denumire, vanzari DESC ORDER BY p.denumire, vanzari DESC
@@ -1399,8 +1438,9 @@ WITH preturi_vechi AS (
LEFT JOIN nom_articole a ON d.id_articol = a.id_articol LEFT JOIN nom_articole a ON d.id_articol = a.id_articol
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -6) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -6)
AND d.pret > 0 AND d.pret > 0
GROUP BY d.id_articol, a.denumire GROUP BY d.id_articol, a.denumire
HAVING COUNT(*) >= 5 HAVING COUNT(*) >= 5
@@ -1413,7 +1453,8 @@ preturi_noi AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -6) AND f.data_act >= ADD_MONTHS(:data_referinta, -6)
AND f.data_act < :data_referinta
AND d.pret > 0 AND d.pret > 0
GROUP BY d.id_articol GROUP BY d.id_articol
HAVING COUNT(*) >= 5 HAVING COUNT(*) >= 5
@@ -1441,8 +1482,8 @@ capitaluri AS (
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '101%' OR b.cont LIKE '104%' OR b.cont LIKE '105%' WHERE (b.cont LIKE '101%' OR b.cont LIKE '104%' OR b.cont LIKE '105%'
OR b.cont LIKE '106%' OR b.cont LIKE '117%' OR b.cont LIKE '121%') OR b.cont LIKE '106%' OR b.cont LIKE '117%' OR b.cont LIKE '121%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Datorii totale (16x, 40x, 42x, 44x, 46x) -- Datorii totale (16x, 40x, 42x, 44x, 46x)
datorii AS ( datorii AS (
@@ -1450,8 +1491,8 @@ datorii AS (
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '16%' OR b.cont LIKE '40%' OR b.cont LIKE '42%' WHERE (b.cont LIKE '16%' OR b.cont LIKE '40%' OR b.cont LIKE '42%'
OR b.cont LIKE '44%' OR b.cont LIKE '46%') OR b.cont LIKE '44%' OR b.cont LIKE '46%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Total activ (sold debitor toate conturile de activ) -- Total activ (sold debitor toate conturile de activ)
activ AS ( activ AS (
@@ -1461,8 +1502,8 @@ activ AS (
OR b.cont LIKE '4%' OR b.cont LIKE '5%') OR b.cont LIKE '4%' OR b.cont LIKE '5%')
AND b.cont NOT LIKE '16%' AND b.cont NOT LIKE '40%' AND b.cont NOT LIKE '42%' AND b.cont NOT LIKE '16%' AND b.cont NOT LIKE '40%' AND b.cont NOT LIKE '42%'
AND b.cont NOT LIKE '44%' AND b.cont NOT LIKE '46%' AND b.cont NOT LIKE '47%' AND b.cont NOT LIKE '44%' AND b.cont NOT LIKE '46%' AND b.cont NOT LIKE '47%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Vanzari si profit din ultimele 12 luni -- Vanzari si profit din ultimele 12 luni
vanzari_calc AS ( vanzari_calc AS (
@@ -1473,7 +1514,8 @@ vanzari_calc AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
) )
SELECT SELECT
'Grad indatorare' AS indicator, 'Grad indatorare' AS indicator,
@@ -1586,23 +1628,23 @@ cash AS (
SELECT SUM(b.solddeb - b.soldcred) AS cash_total SELECT SUM(b.solddeb - b.soldcred) AS cash_total
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%') WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Creante (cont 4111) -- Creante (cont 4111)
creante AS ( creante AS (
SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS creante_total SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS creante_total
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Stocuri -- Stocuri
stocuri AS ( stocuri AS (
SELECT SUM((s.cants + s.cant - s.cante) * s.pret) AS stoc_total SELECT SUM((s.cants + s.cant - s.cante) * s.pret) AS stoc_total
FROM vstoc s FROM vstoc s
WHERE s.an = EXTRACT(YEAR FROM SYSDATE) WHERE s.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND s.luna = EXTRACT(MONTH FROM SYSDATE) AND s.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
AND (s.cants + s.cant - s.cante) > 0 AND (s.cants + s.cant - s.cante) > 0
), ),
-- Datorii curente (401, 404, 462) -- Datorii curente (401, 404, 462)
@@ -1610,8 +1652,8 @@ datorii_curente AS (
SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS datorii_total SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS datorii_total
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE (b.cont LIKE '401%' OR b.cont LIKE '404%' OR b.cont LIKE '462%') WHERE (b.cont LIKE '401%' OR b.cont LIKE '404%' OR b.cont LIKE '462%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
) )
SELECT SELECT
'Lichiditate curenta' AS indicator, 'Lichiditate curenta' AS indicator,
@@ -1692,8 +1734,8 @@ WITH datorii_scadenta AS (
(r.preccred + r.credit) - (r.precdeb + r.debit) AS sold_ramas, (r.preccred + r.credit) - (r.precdeb + r.debit) AS sold_ramas,
CASE CASE
WHEN r.datascad IS NULL THEN 'TERMEN_NEDEFINIT' WHEN r.datascad IS NULL THEN 'TERMEN_NEDEFINIT'
WHEN r.datascad <= TRUNC(SYSDATE) + 30 THEN 'TERMEN_SCURT' WHEN r.datascad <= (:data_referinta - 1) + 30 THEN 'TERMEN_SCURT'
WHEN r.datascad <= TRUNC(SYSDATE) + 90 THEN 'TERMEN_MEDIU' WHEN r.datascad <= (:data_referinta - 1) + 90 THEN 'TERMEN_MEDIU'
ELSE 'TERMEN_LUNG' ELSE 'TERMEN_LUNG'
END AS clasificare END AS clasificare
FROM vireg_parteneri r FROM vireg_parteneri r
@@ -1745,23 +1787,23 @@ cash_curent AS (
SELECT SUM(b.solddeb - b.soldcred) AS cash_total SELECT SUM(b.solddeb - b.soldcred) AS cash_total
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%') WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
incasari_asteptate AS ( incasari_asteptate AS (
SELECT SELECT
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 30 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_30, ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 30 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_30,
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 60 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_60, ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 60 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_60,
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 90 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_90 ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 90 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END), 0) AS incasari_90
FROM vireg_parteneri r FROM vireg_parteneri r
WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%') WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%')
AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0 AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0
), ),
plati_scadente AS ( plati_scadente AS (
SELECT SELECT
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 30 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_30, ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 30 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_30,
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 60 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_60, ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 60 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_60,
ROUND(SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 90 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_90 ROUND(SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 90 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END), 0) AS plati_90
FROM vireg_parteneri r FROM vireg_parteneri r
WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%') WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%')
AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0 AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0
@@ -1825,23 +1867,23 @@ cash_curent AS (
SELECT SUM(b.solddeb - b.soldcred) AS cash_total SELECT SUM(b.solddeb - b.soldcred) AS cash_total
FROM vbal b FROM vbal b
WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%') WHERE (b.cont LIKE '512%' OR b.cont LIKE '531%')
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
incasari_programate AS ( incasari_programate AS (
SELECT SELECT
SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 30 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_30, SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 30 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_30,
SUM(CASE WHEN r.datascad > TRUNC(SYSDATE) + 30 AND r.datascad <= TRUNC(SYSDATE) + 60 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_31_60, SUM(CASE WHEN r.datascad > (:data_referinta - 1) + 30 AND r.datascad <= (:data_referinta - 1) + 60 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_31_60,
SUM(CASE WHEN r.datascad > TRUNC(SYSDATE) + 60 AND r.datascad <= TRUNC(SYSDATE) + 90 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_61_90 SUM(CASE WHEN r.datascad > (:data_referinta - 1) + 60 AND r.datascad <= (:data_referinta - 1) + 90 THEN (r.precdeb + r.debit) - (r.preccred + r.credit) ELSE 0 END) AS incasari_61_90
FROM vireg_parteneri r FROM vireg_parteneri r
WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%') WHERE (r.cont LIKE '4111%' OR r.cont LIKE '461%')
AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0 AND (r.precdeb + r.debit) - (r.preccred + r.credit) <> 0
), ),
plati_programate AS ( plati_programate AS (
SELECT SELECT
SUM(CASE WHEN r.datascad <= TRUNC(SYSDATE) + 30 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_30, SUM(CASE WHEN r.datascad <= (:data_referinta - 1) + 30 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_30,
SUM(CASE WHEN r.datascad > TRUNC(SYSDATE) + 30 AND r.datascad <= TRUNC(SYSDATE) + 60 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_31_60, SUM(CASE WHEN r.datascad > (:data_referinta - 1) + 30 AND r.datascad <= (:data_referinta - 1) + 60 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_31_60,
SUM(CASE WHEN r.datascad > TRUNC(SYSDATE) + 60 AND r.datascad <= TRUNC(SYSDATE) + 90 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_61_90 SUM(CASE WHEN r.datascad > (:data_referinta - 1) + 60 AND r.datascad <= (:data_referinta - 1) + 90 THEN (r.preccred + r.credit) - (r.precdeb + r.debit) ELSE 0 END) AS plati_61_90
FROM vireg_parteneri r FROM vireg_parteneri r
WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%') WHERE (r.cont LIKE '401%' OR r.cont LIKE '404%' OR r.cont LIKE '462%')
AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0 AND (r.preccred + r.credit) - (r.precdeb + r.debit) <> 0
@@ -1897,19 +1939,27 @@ FROM cash_curent c, incasari_programate i, plati_programate p
# 39. SUMAR EXECUTIV YoY (cu comparatie an anterior) # 39. SUMAR EXECUTIV YoY (cu comparatie an anterior)
# ============================================================================= # =============================================================================
# OPTIMIZED: Single 24-month scan with CASE-based period partitioning instead of 2 separate view scans # OPTIMIZED: Single 24-month scan with CASE-based period partitioning instead of 2 separate view scans
# f.tip NOT IN (21,22,23,24,25) - excludes avizele de expeditie, si tranzactii similare non-vanzare
SUMAR_EXECUTIV_YOY = """ SUMAR_EXECUTIV_YOY = """
WITH base_data AS ( WITH base_data AS (
SELECT SELECT
f.id_vanzare, f.id_vanzare,
f.id_part, f.id_part,
CASE WHEN f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) THEN 'CURENT' ELSE 'ANTERIOR' END AS perioada, CASE WHEN f.data_act >= ADD_MONTHS(:data_referinta, -12) THEN 'CURENT' ELSE 'ANTERIOR' END AS perioada,
d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS vanzare, (CASE WHEN d.pret_cu_tva = 1 THEN round((ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) / d.proc_tvav, 4) ELSE (ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) END) AS pret_unitar_ron,
d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie) AS marja ROUND(NVL(c.curs, 1) * NVL(d.discount_unitar, 4) / NVL(c.multiplicator, 1), 4) AS discount_unitar_ron,
((CASE WHEN d.pret_cu_tva = 1 THEN round((ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) / d.proc_tvav, 4) ELSE (ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) END) - ROUND(NVL(c.curs, 1) * NVL(d.discount_unitar, 4) / NVL(c.multiplicator, 1), 4)) AS pret_unitar_final,
d.cantitate * ((CASE WHEN d.pret_cu_tva = 1 THEN round((ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) / d.proc_tvav, 4) ELSE (ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) END) - ROUND(NVL(c.curs, 1) * NVL(d.discount_unitar, 4) / NVL(c.multiplicator, 1), 4)) AS vanzare,
d.cantitate * (((CASE WHEN d.pret_cu_tva = 1 THEN round((ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) / d.proc_tvav, 4) ELSE (ROUND(NVL(c.curs, 1) * ROUND(NVL(d.pret, 0), 4) / NVL(c.multiplicator, 1), 4)) END) - ROUND(NVL(c.curs, 1) * NVL(d.discount_unitar, 4) / NVL(c.multiplicator, 1), 4)) - d.pret_achizitie) AS marja
FROM VANZARI f FROM VANZARI f
JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare
LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare
AND d.id_valuta = c.id_valuta
WHERE f.sters = 0 AND d.sters = 0 WHERE f.sters = 0 AND d.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (21,22,23,24,25)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < :data_referinta
), ),
aggregated AS ( aggregated AS (
SELECT SELECT
@@ -2002,27 +2052,29 @@ vanzari_curente AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
), ),
sold_clienti_curent AS ( sold_clienti_curent AS (
SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
achizitii_curente AS ( achizitii_curente AS (
SELECT SUM(ABS(r.cant * r.pret)) AS total_achizitii SELECT SUM(ABS(r.cant * r.pret)) AS total_achizitii
FROM vrul r FROM vrul r
WHERE r.id_tip_rulaj = 1 AND r.cant > 0 WHERE r.id_tip_rulaj = 1 AND r.cant > 0
AND r.dataact >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND r.dataact >= ADD_MONTHS(:data_referinta, -12)
AND r.dataact < :data_referinta
), ),
sold_furnizori_curent AS ( sold_furnizori_curent AS (
SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '401%' WHERE b.cont LIKE '401%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1))
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
-- Metrici anterioare (aproximare - vanzari an anterior) -- Metrici anterioare (aproximare - vanzari an anterior)
vanzari_anterioare AS ( vanzari_anterioare AS (
@@ -2032,30 +2084,32 @@ vanzari_anterioare AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -12)
), ),
achizitii_anterioare AS ( achizitii_anterioare AS (
SELECT SUM(ABS(r.cant * r.pret)) AS total_achizitii SELECT SUM(ABS(r.cant * r.pret)) AS total_achizitii
FROM vrul r FROM vrul r
WHERE r.id_tip_rulaj = 1 AND r.cant > 0 WHERE r.id_tip_rulaj = 1 AND r.cant > 0
AND r.dataact >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND r.dataact >= ADD_MONTHS(:data_referinta, -24)
AND r.dataact < ADD_MONTHS(TRUNC(SYSDATE), -12) AND r.dataact < :data_referinta
AND r.dataact < ADD_MONTHS(:data_referinta, -12)
), ),
-- Solduri anterioare (aproximare - luna curenta anul trecut) -- Solduri anterioare (aproximare - luna curenta anul trecut)
sold_clienti_anterior AS ( sold_clienti_anterior AS (
SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante SELECT SUM(CASE WHEN b.solddeb > b.soldcred THEN b.solddeb - b.soldcred ELSE 0 END) AS total_creante
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '4111%' WHERE b.cont LIKE '4111%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) - 1 AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1)) - 1
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
), ),
sold_furnizori_anterior AS ( sold_furnizori_anterior AS (
SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii SELECT SUM(CASE WHEN b.soldcred > b.solddeb THEN b.soldcred - b.solddeb ELSE 0 END) AS total_datorii
FROM vbalanta_parteneri b FROM vbalanta_parteneri b
WHERE b.cont LIKE '401%' WHERE b.cont LIKE '401%'
AND b.an = EXTRACT(YEAR FROM SYSDATE) - 1 AND b.an = EXTRACT(YEAR FROM (:data_referinta - 1)) - 1
AND b.luna = EXTRACT(MONTH FROM SYSDATE) AND b.luna = EXTRACT(MONTH FROM (:data_referinta - 1))
) )
SELECT SELECT
'DSO (Zile incasare)' AS indicator, 'DSO (Zile incasare)' AS indicator,
@@ -2105,7 +2159,8 @@ vanzari_curent AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act >= ADD_MONTHS(:data_referinta, -12)
AND f.data_act < :data_referinta
GROUP BY f.id_part GROUP BY f.id_part
), ),
ranked_curent AS ( ranked_curent AS (
@@ -2129,8 +2184,9 @@ vanzari_anterior AS (
JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0
WHERE f.sters = 0 WHERE f.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < ADD_MONTHS(TRUNC(SYSDATE), -12) AND f.data_act < :data_referinta
AND f.data_act < ADD_MONTHS(:data_referinta, -12)
GROUP BY f.id_part GROUP BY f.id_part
), ),
ranked_anterior AS ( ranked_anterior AS (
@@ -2220,14 +2276,15 @@ WITH base_data AS (
WHEN d.cont = '301' THEN 'Materii prime' WHEN d.cont = '301' THEN 'Materii prime'
ELSE 'Marfa revanduta' ELSE 'Marfa revanduta'
END AS linie_business, END AS linie_business,
CASE WHEN f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -12) THEN 'CURENT' ELSE 'ANTERIOR' END AS perioada, CASE WHEN f.data_act >= ADD_MONTHS(:data_referinta, -12) THEN 'CURENT' ELSE 'ANTERIOR' END AS perioada,
d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS vanzare, d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS vanzare,
d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie) AS marja d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie) AS marja
FROM VANZARI f FROM VANZARI f
JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare JOIN VANZARI_DETALII d ON d.id_vanzare = f.id_vanzare
WHERE f.sters = 0 AND d.sters = 0 WHERE f.sters = 0 AND d.sters = 0
AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24)
AND f.data_act >= ADD_MONTHS(TRUNC(SYSDATE), -24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)
AND f.data_act < :data_referinta
) )
SELECT SELECT
linie_business, linie_business,