Fix product performance grouped JSON build
This commit is contained in:
@@ -3,6 +3,8 @@ bssapp
|
|||||||
|
|
||||||
# Env
|
# Env
|
||||||
.env
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.argebaggi.local
|
||||||
mail.env
|
mail.env
|
||||||
|
|
||||||
# Runtime fonts
|
# Runtime fonts
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
|
|
||||||
var MssqlDB *sql.DB
|
var MssqlDB *sql.DB
|
||||||
var UretimDB *sql.DB
|
var UretimDB *sql.DB
|
||||||
|
var ArgeBaggiDB *sql.DB
|
||||||
|
|
||||||
func envInt(name string, fallback int) int {
|
func envInt(name string, fallback int) int {
|
||||||
raw := strings.TrimSpace(os.Getenv(name))
|
raw := strings.TrimSpace(os.Getenv(name))
|
||||||
@@ -158,3 +159,41 @@ func ConnectMSSQLUretim() error {
|
|||||||
func GetUretimDB() *sql.DB {
|
func GetUretimDB() *sql.DB {
|
||||||
return UretimDB
|
return UretimDB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConnectMSSQLArgeBaggi initializes the optional ArgeBAGGI connection.
|
||||||
|
// Credentials must be supplied through ARGEBAGGI_MSSQL_CONN; never keep them
|
||||||
|
// in source control.
|
||||||
|
func ConnectMSSQLArgeBaggi() error {
|
||||||
|
connString := strings.TrimSpace(os.Getenv("ARGEBAGGI_MSSQL_CONN"))
|
||||||
|
if connString == "" {
|
||||||
|
return fmt.Errorf("ARGEBAGGI_MSSQL_CONN tanimli degil")
|
||||||
|
}
|
||||||
|
|
||||||
|
connectionTimeoutSec := envInt("ARGEBAGGI_MSSQL_CONNECTION_TIMEOUT_SEC", 10)
|
||||||
|
dialTimeoutSec := envInt("ARGEBAGGI_MSSQL_DIAL_TIMEOUT_SEC", connectionTimeoutSec)
|
||||||
|
connString = ensureMSSQLTimeouts(connString, connectionTimeoutSec, dialTimeoutSec)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
ArgeBaggiDB, err = sql.Open("sqlserver", connString)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ArgeBAGGI MSSQL baglanti hatasi: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ArgeBaggiDB.SetMaxOpenConns(envInt("ARGEBAGGI_MSSQL_MAX_OPEN_CONNS", 10))
|
||||||
|
ArgeBaggiDB.SetMaxIdleConns(envInt("ARGEBAGGI_MSSQL_MAX_IDLE_CONNS", 5))
|
||||||
|
ArgeBaggiDB.SetConnMaxLifetime(time.Duration(envInt("ARGEBAGGI_MSSQL_CONN_MAX_LIFETIME_MIN", 30)) * time.Minute)
|
||||||
|
ArgeBaggiDB.SetConnMaxIdleTime(time.Duration(envInt("ARGEBAGGI_MSSQL_CONN_MAX_IDLE_MIN", 10)) * time.Minute)
|
||||||
|
|
||||||
|
if err = ArgeBaggiDB.Ping(); err != nil {
|
||||||
|
_ = ArgeBaggiDB.Close()
|
||||||
|
ArgeBaggiDB = nil
|
||||||
|
return fmt.Errorf("ArgeBAGGI MSSQL erisilemiyor: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("ArgeBAGGI MSSQL baglantisi basarili (connection timeout=%ds, dial timeout=%ds)\n", connectionTimeoutSec, dialTimeoutSec)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetArgeBaggiDB() *sql.DB {
|
||||||
|
return ArgeBaggiDB
|
||||||
|
}
|
||||||
|
|||||||
+10
@@ -1390,6 +1390,7 @@ func main() {
|
|||||||
// (e.g. SSH-tunnel PostgreSQL on 127.0.0.1:15432).
|
// (e.g. SSH-tunnel PostgreSQL on 127.0.0.1:15432).
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
_ = godotenv.Overload(".env.local")
|
_ = godotenv.Overload(".env.local")
|
||||||
|
_ = godotenv.Overload(".env.argebaggi.local")
|
||||||
}
|
}
|
||||||
|
|
||||||
jwtSecret := os.Getenv("JWT_SECRET")
|
jwtSecret := os.Getenv("JWT_SECRET")
|
||||||
@@ -1417,6 +1418,15 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := db.ConnectMSSQLArgeBaggi(); err != nil {
|
||||||
|
if strings.Contains(err.Error(), "ARGEBAGGI_MSSQL_CONN tanimli degil") {
|
||||||
|
log.Println("ArgeBAGGI DB baglantisi atlandi: ARGEBAGGI_MSSQL_CONN tanimli degil")
|
||||||
|
} else {
|
||||||
|
// This source enriches one screen; a temporary outage must not stop
|
||||||
|
// the whole application from starting.
|
||||||
|
log.Println("ArgeBAGGI DB baglantisi basarisiz:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pgDB, err := db.ConnectPostgres()
|
pgDB, err := db.ConnectPostgres()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -12,11 +12,18 @@ type ProductionNoCostProductRow struct {
|
|||||||
SKullaniciAdi string `json:"sKullaniciAdi"`
|
SKullaniciAdi string `json:"sKullaniciAdi"`
|
||||||
SKullaniciGunc string `json:"sKullaniciAdiGunc"`
|
SKullaniciGunc string `json:"sKullaniciAdiGunc"`
|
||||||
MMiktarG float64 `json:"lMMiktar_G"`
|
MMiktarG float64 `json:"lMMiktar_G"`
|
||||||
|
CeketDepoGiris float64 `json:"ceketDepoGiris"`
|
||||||
|
PantolonDepoGiris float64 `json:"pantolonDepoGiris"`
|
||||||
|
YelekDepoGiris float64 `json:"yelekDepoGiris"`
|
||||||
MModelKodu string `json:"sMModelKodu"`
|
MModelKodu string `json:"sMModelKodu"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProductionHasCostProductRow struct {
|
type ProductionHasCostProductRow struct {
|
||||||
UretimSekli string `json:"UretimSekli"`
|
UretimSekli string `json:"UretimSekli"`
|
||||||
|
UrtSiparisNo string `json:"nUrtSiparisNo"`
|
||||||
|
CeketDepoGiris float64 `json:"ceketDepoGiris"`
|
||||||
|
PantolonDepoGiris float64 `json:"pantolonDepoGiris"`
|
||||||
|
YelekDepoGiris float64 `json:"yelekDepoGiris"`
|
||||||
NOnMLNo string `json:"nOnMLNo"`
|
NOnMLNo string `json:"nOnMLNo"`
|
||||||
UrunKodu string `json:"UrunKodu"`
|
UrunKodu string `json:"UrunKodu"`
|
||||||
UrunAdi string `json:"UrunAdi"`
|
UrunAdi string `json:"UrunAdi"`
|
||||||
|
|||||||
@@ -793,6 +793,82 @@ ORDER BY SonIsEmri.dteIslemTarihi DESC, LTRIM(RTRIM(R.sMModelKodu)) ASC
|
|||||||
return uretimDB.QueryContext(ctx, sqlText, fromDate, search)
|
return uretimDB.QueryContext(ctx, sqlText, fromDate, search)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ArgeBaggiDepotEntryTotals struct {
|
||||||
|
Ceket float64
|
||||||
|
Pantolon float64
|
||||||
|
Yelek float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetArgeBaggiDepotEntryTotals returns operation 985/986/987 quantities keyed
|
||||||
|
// by production work order. The requested work orders are queried in one batch
|
||||||
|
// to avoid an ArgeBAGGI round trip for every list row.
|
||||||
|
func GetArgeBaggiDepotEntryTotals(ctx context.Context, argeDB *sql.DB, workOrders []string) (map[string]ArgeBaggiDepotEntryTotals, error) {
|
||||||
|
out := make(map[string]ArgeBaggiDepotEntryTotals)
|
||||||
|
if argeDB == nil || len(workOrders) == 0 {
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
seen := make(map[string]struct{}, len(workOrders))
|
||||||
|
values := make([]string, 0, len(workOrders))
|
||||||
|
for _, raw := range workOrders {
|
||||||
|
value := strings.TrimSpace(raw)
|
||||||
|
if value == "" || value == "0" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, exists := seen[value]; exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
seen[value] = struct{}{}
|
||||||
|
values = append(values, value)
|
||||||
|
}
|
||||||
|
if len(values) == 0 {
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
placeholders := make([]string, 0, len(values))
|
||||||
|
args := make([]any, 0, len(values))
|
||||||
|
for i, value := range values {
|
||||||
|
placeholders = append(placeholders, fmt.Sprintf("@p%d", i+1))
|
||||||
|
args = append(args, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlText := fmt.Sprintf(`
|
||||||
|
SELECT
|
||||||
|
LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi))) AS IsEmriNo,
|
||||||
|
SUM(CASE WHEN O.oper_num = 985 THEN CONVERT(float, B.adet) ELSE 0 END) AS CeketDepoGiris,
|
||||||
|
SUM(CASE WHEN O.oper_num = 986 THEN CONVERT(float, B.adet) ELSE 0 END) AS PantolonDepoGiris,
|
||||||
|
SUM(CASE WHEN O.oper_num = 987 THEN CONVERT(float, B.adet) ELSE 0 END) AS YelekDepoGiris
|
||||||
|
FROM dbo.is_acma_bar B
|
||||||
|
INNER JOIN dbo.is_acma I ON I.is_num = B.is_num
|
||||||
|
INNER JOIN dbo.model_def MD ON I.imdef_num = MD.mdef_num
|
||||||
|
INNER JOIN dbo.oper_urun_no O ON B.oper_num = O.oper_num
|
||||||
|
INNER JOIN dbo.model_num MN ON I.model_num = MN.model_num
|
||||||
|
INNER JOIN dbo.bant_no BN ON I.bant_num = BN.bant_no
|
||||||
|
INNER JOIN dbo.model_oper MO ON O.oper_num = MO.oper_num AND MD.mdef_num = MO.model_num
|
||||||
|
INNER JOIN dbo.model_oper_tkp_def TD ON MO.tkp_cik = TD.tkp_cik
|
||||||
|
WHERE B.tarih >= '2025-01-01'
|
||||||
|
AND TD.tkp_cik IN (1,2,3,4,5)
|
||||||
|
AND O.oper_num IN (985,986,987)
|
||||||
|
AND LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi))) IN (%s)
|
||||||
|
GROUP BY LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi)))
|
||||||
|
`, strings.Join(placeholders, ","))
|
||||||
|
|
||||||
|
rows, err := argeDB.QueryContext(ctx, sqlText, args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
for rows.Next() {
|
||||||
|
var workOrder string
|
||||||
|
var totals ArgeBaggiDepotEntryTotals
|
||||||
|
if err := rows.Scan(&workOrder, &totals.Ceket, &totals.Pantolon, &totals.Yelek); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out[strings.TrimSpace(workOrder)] = totals
|
||||||
|
}
|
||||||
|
return out, rows.Err()
|
||||||
|
}
|
||||||
|
|
||||||
func GetProductionHasCostProducts(
|
func GetProductionHasCostProducts(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
uretimDB *sql.DB,
|
uretimDB *sql.DB,
|
||||||
@@ -816,12 +892,22 @@ WITH SonOnMaliyet AS (
|
|||||||
FROM dbo.spUrtOnMLMas M
|
FROM dbo.spUrtOnMLMas M
|
||||||
WHERE LTRIM(RTRIM(M.UrunKodu)) <> ''
|
WHERE LTRIM(RTRIM(M.UrunKodu)) <> ''
|
||||||
),
|
),
|
||||||
SonSiparis AS (
|
SonSiparisSirali AS (
|
||||||
SELECT
|
SELECT
|
||||||
LTRIM(RTRIM(sMModelKodu)) AS UrunKodu,
|
LTRIM(RTRIM(SD.sMModelKodu)) AS UrunKodu,
|
||||||
MAX(dteIslemTarihi) AS SonSiparisTarihi
|
SD.dteIslemTarihi AS SonSiparisTarihi,
|
||||||
FROM dbo.spUrtSiparisDet
|
SM.nUrtSiparisNo,
|
||||||
GROUP BY LTRIM(RTRIM(sMModelKodu))
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY LTRIM(RTRIM(SD.sMModelKodu))
|
||||||
|
ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC
|
||||||
|
) AS rn
|
||||||
|
FROM dbo.spUrtSiparisDet SD
|
||||||
|
INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID
|
||||||
|
),
|
||||||
|
SonSiparis AS (
|
||||||
|
SELECT UrunKodu, SonSiparisTarihi, nUrtSiparisNo
|
||||||
|
FROM SonSiparisSirali
|
||||||
|
WHERE rn = 1
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
CASE
|
CASE
|
||||||
@@ -831,6 +917,7 @@ SELECT
|
|||||||
THEN N'FASON ICIN URETILEN'
|
THEN N'FASON ICIN URETILEN'
|
||||||
ELSE N'Tanimsiz'
|
ELSE N'Tanimsiz'
|
||||||
END AS UretimSekli,
|
END AS UretimSekli,
|
||||||
|
RTRIM(CONVERT(VARCHAR(32), ISNULL(SS.nUrtSiparisNo, 0))) AS nUrtSiparisNo,
|
||||||
RTRIM(CONVERT(VARCHAR(32), ISNULL(OM.nOnMLNo, 0))) AS nOnMLNo,
|
RTRIM(CONVERT(VARCHAR(32), ISNULL(OM.nOnMLNo, 0))) AS nOnMLNo,
|
||||||
LTRIM(RTRIM(ISNULL(OM.UrunKodu, ''))) AS UrunKodu,
|
LTRIM(RTRIM(ISNULL(OM.UrunKodu, ''))) AS UrunKodu,
|
||||||
ISNULL(OM.UrunAdi, '') AS UrunAdi,
|
ISNULL(OM.UrunAdi, '') AS UrunAdi,
|
||||||
|
|||||||
@@ -158,6 +158,26 @@ func GetProductionNoCostProductsHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if argeDB := db.GetArgeBaggiDB(); argeDB != nil && len(list) > 0 {
|
||||||
|
workOrders := make([]string, 0, len(list))
|
||||||
|
for i := range list {
|
||||||
|
workOrders = append(workOrders, list[i].UrtSiparisNo)
|
||||||
|
}
|
||||||
|
argeCtx, cancelArge := context.WithTimeout(r.Context(), 15*time.Second)
|
||||||
|
totalsByWorkOrder, argeErr := queries.GetArgeBaggiDepotEntryTotals(argeCtx, argeDB, workOrders)
|
||||||
|
cancelArge()
|
||||||
|
if argeErr != nil {
|
||||||
|
log.Printf("[ProductionNoCost] ArgeBAGGI enrichment error: %v", argeErr)
|
||||||
|
} else {
|
||||||
|
for i := range list {
|
||||||
|
totals := totalsByWorkOrder[strings.TrimSpace(list[i].UrtSiparisNo)]
|
||||||
|
list[i].CeketDepoGiris = totals.Ceket
|
||||||
|
list[i].PantolonDepoGiris = totals.Pantolon
|
||||||
|
list[i].YelekDepoGiris = totals.Yelek
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_ = json.NewEncoder(w).Encode(list)
|
_ = json.NewEncoder(w).Encode(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,6 +211,7 @@ func GetProductionHasCostProductsHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
var item models.ProductionHasCostProductRow
|
var item models.ProductionHasCostProductRow
|
||||||
if err := rows.Scan(
|
if err := rows.Scan(
|
||||||
&item.UretimSekli,
|
&item.UretimSekli,
|
||||||
|
&item.UrtSiparisNo,
|
||||||
&item.NOnMLNo,
|
&item.NOnMLNo,
|
||||||
&item.UrunKodu,
|
&item.UrunKodu,
|
||||||
&item.UrunAdi,
|
&item.UrunAdi,
|
||||||
@@ -219,6 +240,26 @@ func GetProductionHasCostProductsHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if argeDB := db.GetArgeBaggiDB(); argeDB != nil && len(list) > 0 {
|
||||||
|
workOrders := make([]string, 0, len(list))
|
||||||
|
for i := range list {
|
||||||
|
workOrders = append(workOrders, list[i].UrtSiparisNo)
|
||||||
|
}
|
||||||
|
argeCtx, cancelArge := context.WithTimeout(r.Context(), 15*time.Second)
|
||||||
|
totalsByWorkOrder, argeErr := queries.GetArgeBaggiDepotEntryTotals(argeCtx, argeDB, workOrders)
|
||||||
|
cancelArge()
|
||||||
|
if argeErr != nil {
|
||||||
|
log.Printf("[ProductionHasCost] ArgeBAGGI enrichment error: %v", argeErr)
|
||||||
|
} else {
|
||||||
|
for i := range list {
|
||||||
|
totals := totalsByWorkOrder[strings.TrimSpace(list[i].UrtSiparisNo)]
|
||||||
|
list[i].CeketDepoGiris = totals.Ceket
|
||||||
|
list[i].PantolonDepoGiris = totals.Pantolon
|
||||||
|
list[i].YelekDepoGiris = totals.Yelek
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_ = json.NewEncoder(w).Encode(list)
|
_ = json.NewEncoder(w).Encode(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -176,6 +176,10 @@ const dateColumns = new Set(['Tarihi', 'dteKayitTarihi', 'dteGuncellemeTarihi',
|
|||||||
const columns = [
|
const columns = [
|
||||||
{ name: 'open', label: '', field: 'open', align: 'center', sortable: false, style: 'width:3%', headerStyle: 'width:3%' },
|
{ name: 'open', label: '', field: 'open', align: 'center', sortable: false, style: 'width:3%', headerStyle: 'width:3%' },
|
||||||
{ name: 'UretimSekli', label: 'Uretim Sekli', field: 'UretimSekli', align: 'left', sortable: true, style: 'width:9%', headerStyle: 'width:9%' },
|
{ name: 'UretimSekli', label: 'Uretim Sekli', field: 'UretimSekli', align: 'left', sortable: true, style: 'width:9%', headerStyle: 'width:9%' },
|
||||||
|
{ name: 'nUrtSiparisNo', label: 'Uretim Siparis No', field: 'nUrtSiparisNo', align: 'left', sortable: true, style: 'width:6%', headerStyle: 'width:6%' },
|
||||||
|
{ name: 'ceketDepoGiris', label: 'C-Ceket Depo Giris', field: 'ceketDepoGiris', align: 'right', sortable: true, format: val => formatMoney(val), style: 'width:6%', headerStyle: 'width:6%' },
|
||||||
|
{ name: 'pantolonDepoGiris', label: 'P-Pantolon Depo Giris', field: 'pantolonDepoGiris', align: 'right', sortable: true, format: val => formatMoney(val), style: 'width:6%', headerStyle: 'width:6%' },
|
||||||
|
{ name: 'yelekDepoGiris', label: 'Y-Yelek Depo Giris', field: 'yelekDepoGiris', align: 'right', sortable: true, format: val => formatMoney(val), style: 'width:6%', headerStyle: 'width:6%' },
|
||||||
{ name: 'nOnMLNo', label: 'nOnMLNo', field: 'nOnMLNo', align: 'left', sortable: true, style: 'width:6%', headerStyle: 'width:6%' },
|
{ name: 'nOnMLNo', label: 'nOnMLNo', field: 'nOnMLNo', align: 'left', sortable: true, style: 'width:6%', headerStyle: 'width:6%' },
|
||||||
{ name: 'UrunKodu', label: 'UrunKodu', field: 'UrunKodu', align: 'left', sortable: true, style: 'width:7%', headerStyle: 'width:7%' },
|
{ name: 'UrunKodu', label: 'UrunKodu', field: 'UrunKodu', align: 'left', sortable: true, style: 'width:7%', headerStyle: 'width:7%' },
|
||||||
{ name: 'UrunAdi', label: 'UrunAdi', field: 'UrunAdi', align: 'left', sortable: true, style: 'width:8%', headerStyle: 'width:8%' },
|
{ name: 'UrunAdi', label: 'UrunAdi', field: 'UrunAdi', align: 'left', sortable: true, style: 'width:8%', headerStyle: 'width:8%' },
|
||||||
@@ -389,7 +393,7 @@ function escapeExcelCsvCell (value) {
|
|||||||
return `"${text.replace(/"/g, '""')}"`
|
return `"${text.replace(/"/g, '""')}"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const excelNumericColumns = new Set(['lTutarTL', 'lTutarUSD', 'lTutarEURO'])
|
const excelNumericColumns = new Set(['ceketDepoGiris', 'pantolonDepoGiris', 'yelekDepoGiris', 'lTutarTL', 'lTutarUSD', 'lTutarEURO'])
|
||||||
|
|
||||||
function formatExcelCsvCell (col, rawValue, displayValue) {
|
function formatExcelCsvCell (col, rawValue, displayValue) {
|
||||||
if (excelNumericColumns.has(col?.name)) {
|
if (excelNumericColumns.has(col?.name)) {
|
||||||
|
|||||||
@@ -5622,48 +5622,20 @@ watch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table__middle) {
|
.pcd-detail-table :deep(.q-table__middle) {
|
||||||
overflow-x: hidden !important;
|
overflow: visible !important;
|
||||||
width: 100% !important;
|
|
||||||
max-width: 100% !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table) {
|
.pcd-detail-table :deep(.q-table) {
|
||||||
table-layout: fixed !important;
|
table-layout: fixed;
|
||||||
width: 100% !important;
|
width: 100%;
|
||||||
min-width: 0 !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table th),
|
.pcd-detail-table :deep(.q-table th),
|
||||||
.pcd-detail-table :deep(.q-table td) {
|
.pcd-detail-table :deep(.q-table td) {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
min-width: 0 !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fit every detail column into one desktop viewport. These percentages also
|
|
||||||
override the old pixel widths carried by a few editable columns. */
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(1)), .pcd-detail-table :deep(.q-table td:nth-child(1)) { width: 3.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(2)), .pcd-detail-table :deep(.q-table td:nth-child(2)) { width: 3% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(3)), .pcd-detail-table :deep(.q-table td:nth-child(3)) { width: 5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(4)), .pcd-detail-table :deep(.q-table td:nth-child(4)) { width: 7% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(5)), .pcd-detail-table :deep(.q-table td:nth-child(5)) { width: 6% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(6)), .pcd-detail-table :deep(.q-table td:nth-child(6)) { width: 8% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(7)), .pcd-detail-table :deep(.q-table td:nth-child(7)) { width: 4.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(8)), .pcd-detail-table :deep(.q-table td:nth-child(8)) { width: 4.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(9)), .pcd-detail-table :deep(.q-table td:nth-child(9)) { width: 5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(10)), .pcd-detail-table :deep(.q-table td:nth-child(10)) { width: 4% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(11)), .pcd-detail-table :deep(.q-table td:nth-child(11)) { width: 3.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(12)), .pcd-detail-table :deep(.q-table td:nth-child(12)) { width: 3% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(13)), .pcd-detail-table :deep(.q-table td:nth-child(13)) { width: 5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(14)), .pcd-detail-table :deep(.q-table td:nth-child(14)) { width: 5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(15)), .pcd-detail-table :deep(.q-table td:nth-child(15)) { width: 4% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(16)), .pcd-detail-table :deep(.q-table td:nth-child(16)) { width: 3.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(17)), .pcd-detail-table :deep(.q-table td:nth-child(17)) { width: 4.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(18)), .pcd-detail-table :deep(.q-table td:nth-child(18)) { width: 5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(19)), .pcd-detail-table :deep(.q-table td:nth-child(19)) { width: 4.5% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(20)), .pcd-detail-table :deep(.q-table td:nth-child(20)) { width: 6% !important; }
|
|
||||||
.pcd-detail-table :deep(.q-table th:nth-child(21)), .pcd-detail-table :deep(.q-table td:nth-child(21)) { width: 3% !important; }
|
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table tbody td) {
|
.pcd-detail-table :deep(.q-table tbody td) {
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
@@ -5682,8 +5654,8 @@ watch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table thead th) {
|
.pcd-detail-table :deep(.q-table thead th) {
|
||||||
font-size: 9px;
|
font-size: 11px;
|
||||||
padding: 2px 2px;
|
padding: 3px 4px;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
@@ -5691,8 +5663,8 @@ watch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table tbody td) {
|
.pcd-detail-table :deep(.q-table tbody td) {
|
||||||
font-size: 9.5px;
|
font-size: 11px;
|
||||||
padding: 1px 2px;
|
padding: 2px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.q-table tbody tr) {
|
.pcd-detail-table :deep(.q-table tbody tr) {
|
||||||
@@ -5748,15 +5720,6 @@ watch(
|
|||||||
|
|
||||||
.pcd-detail-table :deep(.pcd-inline-input .q-field__control) {
|
.pcd-detail-table :deep(.pcd-inline-input .q-field__control) {
|
||||||
min-height: 30px;
|
min-height: 30px;
|
||||||
min-width: 0 !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pcd-detail-table :deep(.pcd-inline-input),
|
|
||||||
.pcd-detail-table :deep(.pcd-inline-input .q-field__inner),
|
|
||||||
.pcd-detail-table :deep(.pcd-inline-input .q-field__control-container) {
|
|
||||||
min-width: 0 !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-detail-table :deep(.pcd-inline-input .q-field__native),
|
.pcd-detail-table :deep(.pcd-inline-input .q-field__native),
|
||||||
@@ -5798,12 +5761,69 @@ watch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pcd-history-table :deep(.q-table thead th) {
|
.pcd-history-table :deep(.q-table thead th) {
|
||||||
font-size: 12px;
|
font-size: 9.5px;
|
||||||
|
line-height: 1.1;
|
||||||
|
white-space: normal;
|
||||||
|
padding: 3px 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-history-table :deep(.q-table tbody td) {
|
.pcd-history-table :deep(.q-table tbody td) {
|
||||||
font-size: 12px;
|
font-size: 9.5px;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
padding: 2px;
|
||||||
|
white-space: normal;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.q-table__middle) {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.q-table) {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.q-table th),
|
||||||
|
.pcd-history-table :deep(.q-table td) {
|
||||||
|
min-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(1)), .pcd-history-table :deep(.q-table td:nth-child(1)) { width: 5% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(2)), .pcd-history-table :deep(.q-table td:nth-child(2)) { width: 6% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(3)), .pcd-history-table :deep(.q-table td:nth-child(3)) { width: 7% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(4)), .pcd-history-table :deep(.q-table td:nth-child(4)) { width: 6% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(5)), .pcd-history-table :deep(.q-table td:nth-child(5)) { width: 8% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(6)), .pcd-history-table :deep(.q-table td:nth-child(6)) { width: 7% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(7)), .pcd-history-table :deep(.q-table td:nth-child(7)) { width: 10% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(8)), .pcd-history-table :deep(.q-table td:nth-child(8)) { width: 5% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(9)), .pcd-history-table :deep(.q-table td:nth-child(9)) { width: 7% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(10)), .pcd-history-table :deep(.q-table td:nth-child(10)) { width: 5% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(11)), .pcd-history-table :deep(.q-table td:nth-child(11)) { width: 7% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(12)), .pcd-history-table :deep(.q-table td:nth-child(12)) { width: 5% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(13)), .pcd-history-table :deep(.q-table td:nth-child(13)) { width: 3% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(14)), .pcd-history-table :deep(.q-table td:nth-child(14)) { width: 5% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(15)), .pcd-history-table :deep(.q-table td:nth-child(15)) { width: 6% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(16)), .pcd-history-table :deep(.q-table td:nth-child(16)) { width: 4% !important; }
|
||||||
|
.pcd-history-table :deep(.q-table th:nth-child(17)), .pcd-history-table :deep(.q-table td:nth-child(17)) { width: 4% !important; }
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.pcd-history-source-chip) {
|
||||||
|
min-width: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pcd-history-table :deep(.q-btn) {
|
||||||
|
min-width: 0;
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
font-size: 9px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pcd-history-table :deep(.pcd-history-row-purchase td) {
|
.pcd-history-table :deep(.pcd-history-row-purchase td) {
|
||||||
|
|||||||
@@ -252,6 +252,9 @@ const columns = [
|
|||||||
style: 'width:7%',
|
style: 'width:7%',
|
||||||
headerStyle: 'width:7%'
|
headerStyle: 'width:7%'
|
||||||
},
|
},
|
||||||
|
{ name: 'ceketDepoGiris', label: 'C-Ceket Depo Giris', field: 'ceketDepoGiris', align: 'right', sortable: true, format: val => formatQuantity(val), style: 'width:7%', headerStyle: 'width:7%' },
|
||||||
|
{ name: 'pantolonDepoGiris', label: 'P-Pantolon Depo Giris', field: 'pantolonDepoGiris', align: 'right', sortable: true, format: val => formatQuantity(val), style: 'width:7%', headerStyle: 'width:7%' },
|
||||||
|
{ name: 'yelekDepoGiris', label: 'Y-Yelek Depo Giris', field: 'yelekDepoGiris', align: 'right', sortable: true, format: val => formatQuantity(val), style: 'width:7%', headerStyle: 'width:7%' },
|
||||||
{
|
{
|
||||||
name: 'sMModelKodu',
|
name: 'sMModelKodu',
|
||||||
label: 'Model Kodu',
|
label: 'Model Kodu',
|
||||||
@@ -312,7 +315,11 @@ function getColumnFilter (name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isNumericColumn (name) {
|
function isNumericColumn (name) {
|
||||||
return name === 'lMMiktar_G'
|
return ['lMMiktar_G', 'ceketDepoGiris', 'pantolonDepoGiris', 'yelekDepoGiris'].includes(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatQuantity (value) {
|
||||||
|
return Number(value || 0).toLocaleString('tr-TR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseNumberFilter (value) {
|
function parseNumberFilter (value) {
|
||||||
@@ -477,7 +484,7 @@ function escapeExcelCsvCell (value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatExcelCsvCell (col, rawValue, displayValue) {
|
function formatExcelCsvCell (col, rawValue, displayValue) {
|
||||||
if (col?.name === 'lMMiktar_G') {
|
if (isNumericColumn(col?.name)) {
|
||||||
const numericValue = Number(rawValue)
|
const numericValue = Number(rawValue)
|
||||||
if (Number.isFinite(numericValue)) return String(numericValue).replace('.', ',')
|
if (Number.isFinite(numericValue)) return String(numericValue).replace('.', ',')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user