diff --git a/MAPPING_SQL_SHEETS.md b/MAPPING_SQL_SHEETS.md new file mode 100644 index 0000000..248cfd2 --- /dev/null +++ b/MAPPING_SQL_SHEETS.md @@ -0,0 +1,77 @@ +# Mapare Query SQL -> Sheet Excel -> Sectiune + +Acest fisier mapeaza fiecare query SQL din `queries.py` cu sheet-ul si sectiunea corespunzatoare din raportul Excel. + +## Sheet-uri Consolidate + +### Dashboard Complet +Sheet principal care contine 12 sectiuni: + +| Sectiune | Query Sursa | Sheet Sursa (daca e consolidat) | +|----------|-------------|--------------------------------| +| KPIs cu Comparatie YoY | `SUMAR_EXECUTIV` + `SUMAR_EXECUTIV_YOY` | vedere_ansamblu | +| Recomandari Prioritare | (din recommendations.py) | - | +| Venituri per Linie Business | `INDICATORI_AGREGATI_VENITURI` + `INDICATORI_AGREGATI_VENITURI_YOY` | indicatori_venituri | +| Portofoliu Clienti | `PORTOFOLIU_CLIENTI` | - | +| Concentrare Risc YoY | `CONCENTRARE_RISC` + `CONCENTRARE_RISC_YOY` | clienti_risc | +| Indicatori Generali | `INDICATORI_GENERALI` | tablou_financiar | +| Indicatori Lichiditate | `INDICATORI_LICHIDITATE` | tablou_financiar | +| Ciclu Conversie Cash | `CICLU_CONVERSIE_CASH` | - | +| Solduri Clienti (Top 10) | `SOLDURI_CLIENTI` | - | +| Solduri Furnizori (Top 10) | `SOLDURI_FURNIZORI` | - | +| Clasificare Datorii | `CLASIFICARE_DATORII` | tablou_financiar | +| Proiectie Lichiditate | `PROIECTIE_LICHIDITATE` | tablou_financiar | + +## Sheet-uri de Detaliu (dupa consolidare) + +| Sheet Excel | Query SQL | Descriere | +|-------------|-----------|-----------| +| Sezonalitate Lunara | `SEZONALITATE_LUNARA` | Analiza vanzari pe luni | +| Vanzari Sub Cost | `VANZARI_SUB_COST` | Alerta: vanzari sub costul de achizitie | +| Clienti Marjă Mică | `CLIENTI_MARJA_MICA` | Alerta: clienti cu marja sub prag | +| Ciclu Conversie Cash | `CICLU_CONVERSIE_CASH` | DSO, DPO, DIO, CCC | +| Marjă Per Client | `MARJA_PER_CLIENT` | Analiza marjei per client | +| Clienţi Ranking Profit | `CLIENTI_RANKING_PROFIT` | Top clienti dupa profit | +| Frecvenţa Clienţi | `FRECVENTA_CLIENTI` | Frecventa cumparari per client | +| Concentrare Clienţi | `CONCENTRARE_CLIENTI` | Concentrare pe primii clienti | +| Trending Clienţi | `TRENDING_CLIENTI` | Tendinta clienti (nou/crescator/stabil) | +| Marjă Client Categorie | `MARJA_CLIENT_CATEGORIE` | Marja per client per categorie | +| Top Produse | `TOP_PRODUSE` | Top produse vandute | +| Marjă Per Categorie | `MARJA_PER_CATEGORIE` | Marja per categorie articol | +| Marjă Per Gestiune | `MARJA_PER_GESTIUNE` | Marja per gestiune | +| Articole Negestionabile | `ARTICOLE_NEGESTIONABILE` | Articole fara miscare | +| Productie Vs Revanzare | `PRODUCTIE_VS_REVANZARE` | Producție proprie vs revanzare | +| Dispersie Preturi | `DISPERSIE_PRETURI` | Variatie preturi | +| Clienţi Sub Medie | `CLIENTI_SUB_MEDIE` | Clienti sub vanzarea medie | +| Evolutie Discount | `EVOLUTIE_DISCOUNT` | Evolutie discounturi | +| Dso Dpo | `DSO_DPO` | Zile incasare/plata | +| Dso Dpo Yoy | `DSO_DPO_YOY` | DSO/DPO cu comparatie YoY | +| Solduri Clienti | `SOLDURI_CLIENTI` | Creante 4111 | +| Aging Creante | `AGING_CREANTE` | Creante pe intervale varsta | +| Facturi Restante | `FACTURI_RESTANTE` | Facturi neincasate | +| Solduri Furnizori | `SOLDURI_FURNIZORI` | Datorii 401 | +| Aging Datorii | `AGING_DATORII` | Datorii pe intervale varsta | +| Facturi Restante Furnizori | `FACTURI_RESTANTE_FURNIZORI` | Facturi neplatite | +| Pozitia Cash | `POZITIA_CASH` | Pozitia de trezorerie | +| Vanzari Lunare | `VANZARI_LUNARE` | Istoric vanzari lunare | +| Stoc Curent | `STOC_CURENT` | Stocuri curente | +| Stoc Lent | `STOC_LENT` | Stocuri fara miscare | +| Rotatie Stocuri | `ROTATIE_STOCURI` | Indicatori rotatie stocuri | +| Analiza Prajitorie | `ANALIZA_PRAJITORIE` | Analiza productie cafea | + +## Sheet-uri Eliminate (acum in Dashboard Complet) + +Urmatoarele sheet-uri au fost consolidate in Dashboard Complet si nu mai apar ca sheet-uri separate: + +| Sheet Veche | Date integrate in | +|-------------|-------------------| +| Vedere Ansamblu | Dashboard Complet - sectiunea KPIs | +| Indicatori Venituri | Dashboard Complet - sectiunea Venituri | +| Clienti si Risc | Dashboard Complet - sectiunea Concentrare Risc | +| Tablou Financiar | Dashboard Complet - 5 sectiuni financiare | + +## Observatii + +1. Query-urile cu sufix `_YOY` sunt folosite pentru comparatie Year-over-Year +2. Consolidarile combina date curente + anterioare pentru analiza tendintelor +3. Sheet-ul "Dashboard Complet" este principalul sheet cu toate informatiile consolidate diff --git a/queries.py b/queries.py index 045cdd6..8201586 100644 --- a/queries.py +++ b/queries.py @@ -7,7 +7,7 @@ OPTIMIZED: All queries use base tables (vanzari, vanzari_detalii) with Oracle hi IMPORTANT: Price calculation considers pret_cu_tva flag: - If pret_cu_tva = 1: price includes VAT, must divide by (1 + proc_tvav/100) - If pret_cu_tva = 0: price is already without VAT -Formula: CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END +Formula: ((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)) """ # ============================================================================= @@ -19,16 +19,18 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ p.denumire AS client, p.cod_fiscal, COUNT(DISTINCT f.id_vanzare) AS nr_facturi, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, ROUND(SUM(d.cantitate * d.pret_achizitie), 2) AS cost_total, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 @@ -47,22 +49,24 @@ SELECT * FROM ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ p.denumire AS client, p.cod_fiscal, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) 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 - 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 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))) > :min_sales ) WHERE procent_marja < :margin_threshold ORDER BY vanzari_fara_tva DESC @@ -76,16 +80,18 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ NVL(sg.grupa, 'NECLASIFICAT') AS grupa, NVL(sg.subgrupa, 'NECLASIFICAT') AS subgrupa, COUNT(DISTINCT f.id_vanzare) AS nr_facturi, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, ROUND(SUM(d.cantitate * d.pret_achizitie), 2) AS cost_total, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta 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 WHERE f.sters = 0 @@ -106,16 +112,18 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ WHEN d.cont = '301' THEN 'Materii prime' ELSE 'Marfă revândută' END AS tip_produs, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, ROUND(SUM(d.cantitate * d.pret_achizitie), 2) AS cost_total, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months) @@ -139,11 +147,13 @@ WITH preturi_detalii AS ( g.subgrupa, f.id_part, p.denumire as client, - CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS pret_fara_tva, + ((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_fara_tva, d.cantitate, - MIN(CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) OVER (PARTITION BY d.id_articol) AS pret_min_global + MIN(((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))) OVER (PARTITION BY d.id_articol) AS pret_min_global FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part 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 @@ -182,10 +192,12 @@ WITH base_prices AS ( d.id_articol, f.id_part, p.denumire AS client, - CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS pret_fara_tva, + ((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_fara_tva, d.cantitate FROM VANZARI f 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 JOIN NOM_PARTENERI p ON f.id_part = p.id_part WHERE f.sters = 0 AND d.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -228,11 +240,13 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ p.denumire AS client, NVL2(d.id_articol, art.denumire, d.explicatie) AS produs, d.cantitate, - ROUND(CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END, 2) AS pret_vanzare, + ROUND(((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)), 2) AS pret_vanzare, ROUND(d.pret_achizitie, 2) AS cost, - ROUND((CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie) * d.cantitate, 2) AS pierdere + ROUND((((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) * d.cantitate, 2) AS pierdere FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part LEFT JOIN nom_articole art ON d.id_articol = art.id_articol WHERE f.sters = 0 @@ -241,7 +255,7 @@ WHERE f.sters = 0 AND f.data_act < :data_referinta AND d.pret_achizitie > 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 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 ORDER BY pierdere ASC FETCH FIRST 100 ROWS ONLY """ @@ -255,12 +269,14 @@ WITH vanzari_perioade AS ( f.id_part, p.denumire AS client, 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 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)) ELSE 0 END) AS vanzari_an_curent, SUM(CASE WHEN f.data_act >= ADD_MONTHS(:data_referinta, -24) 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 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)) ELSE 0 END) AS vanzari_an_trecut FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -295,9 +311,11 @@ ORDER BY variatie_procent DESC NULLS LAST CONCENTRARE_CLIENTI = """ WITH total_vanzari AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS total + SUM(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 total FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months) @@ -306,10 +324,12 @@ WITH total_vanzari AS ( vanzari_client AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ p.denumire AS client, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari, - ROW_NUMBER() OVER (ORDER BY SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) DESC) AS rn + SUM(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 vanzari, + ROW_NUMBER() OVER (ORDER BY SUM(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))) DESC) AS rn FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -359,12 +379,14 @@ ORDER BY rn VANZARI_LUNARE = """ SELECT TO_CHAR(f.data_act, 'YYYY-MM') AS luna, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, + ROUND(SUM(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)), 2) AS marja_bruta, COUNT(DISTINCT f.id_vanzare) AS nr_facturi, COUNT(DISTINCT f.id_part) AS nr_clienti FROM VANZARI f 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 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24) @@ -513,10 +535,12 @@ WITH base_data AS ( SELECT f.id_vanzare, f.id_part, - d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END AS vanzare_fara_tva, - 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 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_fara_tva, + 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 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 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -12) @@ -587,15 +611,17 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ NVL(g.subgrupa, 'NECLASIFICAT') AS subgrupa, a.um, ROUND(SUM(d.cantitate), 2) AS cantitate_vanduta, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS valoare_vanzari, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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))), 2) AS valoare_vanzari, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta 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 WHERE f.sters = 0 @@ -614,15 +640,17 @@ MARJA_PER_GESTIUNE = """ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ g.nume_gestiune, COUNT(DISTINCT f.id_vanzare) AS nr_facturi, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_gestiuni g ON d.id_gestiune = g.id_gestiune JOIN nom_articole a ON d.id_articol = a.id_articol WHERE f.sters = 0 @@ -644,16 +672,18 @@ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ art.um, COUNT(DISTINCT f.id_vanzare) AS nr_facturi, ROUND(SUM(d.cantitate), 2) AS cantitate_vanduta, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari_fara_tva, + ROUND(SUM(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))), 2) AS vanzari_fara_tva, ROUND(SUM(d.cantitate * d.pret_achizitie), 2) AS cost_total, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja_bruta, + ROUND(SUM(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)), 2) AS marja_bruta, ROUND( - CASE WHEN SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) > 0 - THEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) + CASE WHEN SUM(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))) > 0 + THEN SUM(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)) * 100.0 / SUM(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))) ELSE 0 END , 2) AS procent_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta 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 WHERE f.sters = 0 @@ -1101,10 +1131,12 @@ WITH vanzari_detaliate AS ( WHEN d.cont = '301' THEN 'Materii prime' ELSE 'Marfa revanduta' END AS linie_business, - 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 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 JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months) @@ -1136,9 +1168,11 @@ WITH vanzari_lunare AS ( EXTRACT(MONTH FROM f.data_act) AS nr_luna, TO_CHAR(f.data_act, 'Month', 'NLS_DATE_LANGUAGE=ROMANIAN') AS luna, EXTRACT(YEAR FROM f.data_act) AS an, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari + SUM(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 vanzari FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24) @@ -1255,9 +1289,11 @@ WITH frecventa_curenta AS ( p.denumire AS client, COUNT(DISTINCT f.id_vanzare) AS comenzi_12_luni, ROUND(COUNT(DISTINCT f.id_vanzare) / 12.0, 2) AS comenzi_pe_luna, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS valoare_12_luni + ROUND(SUM(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))), 2) AS valoare_12_luni FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -1300,9 +1336,11 @@ ORDER BY fc.valoare_12_luni DESC CONCENTRARE_RISC = """ WITH total_vanzari AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS total + SUM(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 total FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months) @@ -1311,10 +1349,12 @@ WITH total_vanzari AS ( vanzari_client AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ f.id_part, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari, - ROW_NUMBER() OVER (ORDER BY SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) DESC) AS rn + SUM(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 vanzari, + ROW_NUMBER() OVER (ORDER BY SUM(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))) DESC) AS rn FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -:months) @@ -1366,11 +1406,13 @@ WITH vanzari_client AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ f.id_part, p.denumire AS client, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari_fara_tva, + SUM(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 vanzari_fara_tva, SUM(d.cantitate * d.pret_achizitie) AS cost_total, - SUM(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 profit_brut + SUM(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 profit_brut FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_parteneri p ON f.id_part = p.id_part WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -1398,20 +1440,22 @@ MARJA_CLIENT_CATEGORIE = """ SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ p.denumire AS client, NVL(sg.grupa, 'NECLASIFICAT') AS categoria, - ROUND(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 2) AS vanzari, - ROUND(SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)), 2) AS marja, + ROUND(SUM(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))), 2) AS vanzari, + ROUND(SUM(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)), 2) AS marja, ROUND( - SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / - NULLIF(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 0) + SUM(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)) * 100.0 / + NULLIF(SUM(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))), 0) , 2) AS procent_marja, CASE - WHEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) < 0 THEN 'PIERDERE' - WHEN SUM(d.cantitate * (CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END - d.pret_achizitie)) * 100.0 / - NULLIF(SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END), 0) < 15 THEN 'MARJA MICA' + WHEN SUM(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)) < 0 THEN 'PIERDERE' + WHEN SUM(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)) * 100.0 / + NULLIF(SUM(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))), 0) < 15 THEN 'MARJA MICA' ELSE 'OK' END AS status_marja FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta 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 vgest_art_sbgr sg ON art.id_subgrupa = sg.id_subgrupa @@ -1420,7 +1464,7 @@ WHERE f.sters = 0 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 -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 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))) > 1000 ORDER BY p.denumire, vanzari DESC """ @@ -1432,9 +1476,11 @@ WITH preturi_vechi AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ d.id_articol, a.denumire, - AVG(CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS pret_mediu_vechi + AVG(((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_mediu_vechi FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta LEFT JOIN nom_articole a ON d.id_articol = a.id_articol WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) @@ -1448,9 +1494,11 @@ WITH preturi_vechi AS ( preturi_noi AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ d.id_articol, - AVG(CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS pret_mediu_nou + AVG(((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_mediu_nou FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -6) @@ -1508,10 +1556,12 @@ activ AS ( -- Vanzari si profit din ultimele 12 luni vanzari_calc AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS total_vanzari, - SUM(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 profit_brut + SUM(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 total_vanzari, + SUM(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 profit_brut FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -12) @@ -2047,9 +2097,11 @@ WITH -- Metrici curente vanzari_curente AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS total_vanzari + SUM(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 total_vanzari FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -12) @@ -2079,9 +2131,11 @@ sold_furnizori_curent AS ( -- Metrici anterioare (aproximare - vanzari an anterior) vanzari_anterioare AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS total_vanzari + SUM(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 total_vanzari FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24) @@ -2154,9 +2208,11 @@ WITH vanzari_curent AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ f.id_part, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari + SUM(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 vanzari FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -12) @@ -2179,9 +2235,11 @@ metrics_curent AS ( vanzari_anterior AS ( SELECT /*+ LEADING(f d) USE_NL(d) INDEX(f IDX_VANZARI_NR) */ f.id_part, - SUM(d.cantitate * CASE WHEN d.pret_cu_tva = 1 THEN d.pret / (1 + d.proc_tvav/100) ELSE d.pret END) AS vanzari + SUM(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 vanzari FROM vanzari f JOIN vanzari_detalii d ON d.id_vanzare = f.id_vanzare AND d.sters = 0 + LEFT JOIN VANZARI_CURSURI c ON d.id_vanzare = c.id_vanzare + AND d.id_valuta = c.id_valuta WHERE f.sters = 0 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24) @@ -2277,10 +2335,12 @@ WITH base_data AS ( ELSE 'Marfa revanduta' END AS linie_business, 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 - d.pret_achizitie) AS marja + 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 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 AND f.tip > 0 AND f.tip NOT IN (7, 8, 9, 24) AND f.data_act >= ADD_MONTHS(:data_referinta, -24)