From f6b9793c41f033a736501f60d3f7b2775021c974 Mon Sep 17 00:00:00 2001 From: M_Kececi Date: Fri, 20 Feb 2026 08:49:31 +0300 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- svc/main.go | 2 + svc/models/orderlist.go | 1 + svc/queries/order_write.go | 6 +- svc/queries/orderlist.go | 10 ++ svc/routes/orderlist.go | 7 +- ui/src/css/app.css | 158 +++++++++++++++++++++++++++++-- ui/src/layouts/MainLayout.vue | 5 + ui/src/pages/OrderEntry.vue | 137 ++++++++++++++++++--------- ui/src/pages/OrderList.vue | 8 ++ ui/src/router/routes.js | 14 +++ ui/src/stores/orderentryStore.js | 2 +- 11 files changed, 292 insertions(+), 58 deletions(-) diff --git a/svc/main.go b/svc/main.go index 3b6ffc4..2be629a 100644 --- a/svc/main.go +++ b/svc/main.go @@ -439,6 +439,8 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router {"/api/order/update", "POST", "update", http.HandlerFunc(routes.UpdateOrderHandler)}, {"/api/order/get/{id}", "GET", "view", routes.GetOrderByIDHandler(mssql)}, {"/api/orders/list", "GET", "view", routes.OrderListRoute(mssql)}, + {"/api/orders/production-list", "GET", "update", routes.OrderProductionListRoute(mssql)}, + {"/api/orders/production-items/{id}", "GET", "view", routes.OrderProductionItemsRoute(mssql)}, {"/api/orders/close-ready", "GET", "update", routes.OrderCloseReadyListRoute(mssql)}, {"/api/orders/bulk-close", "POST", "update", routes.OrderBulkCloseRoute(mssql)}, {"/api/orders/export", "GET", "export", routes.OrderListExcelRoute(mssql)}, diff --git a/svc/models/orderlist.go b/svc/models/orderlist.go index b635b5d..7e19fd5 100644 --- a/svc/models/orderlist.go +++ b/svc/models/orderlist.go @@ -21,6 +21,7 @@ type OrderList struct { // ℹ️ Sipariş Durumu CreditableConfirmedDate string `json:"CreditableConfirmedDate"` IsCreditableConfirmed bool `json:"IsCreditableConfirmed"` + HasUretimUrunu bool `json:"HasUretimUrunu"` // 💱 Para Birimi DocCurrencyCode string `json:"DocCurrencyCode"` diff --git a/svc/queries/order_write.go b/svc/queries/order_write.go index b3a1021..5a1853b 100644 --- a/svc/queries/order_write.go +++ b/svc/queries/order_write.go @@ -1114,8 +1114,9 @@ func UpdateOrder(header models.OrderHeader, lines []models.OrderDetail, user *mo DELETE FROM BAGGI_V3.dbo.trOrderLine WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 `, header.OrderHeaderID, lineID); err != nil { - fmt.Printf("[ORDER_UPDATE] hard delete failed, trying soft-close line_id=%s err=%v\n", lineID, err) + fmt.Printf("[ORDER_UPDATE] hard delete failed, trying qty-zero soft-close line_id=%s err=%v\n", lineID, err) + // IsClosed computed olabilir; sadece miktarları sıfırla. if _, err2 := tx.Exec(` UPDATE BAGGI_V3.dbo.trOrderLine SET @@ -1123,12 +1124,11 @@ SET Qty2 = 0, CancelQty1 = 0, CancelQty2 = 0, - IsClosed = 1, LastUpdatedUserName = @p1, LastUpdatedDate = @p2 WHERE OrderHeaderID=@p3 AND OrderLineID=@p4 AND ISNULL(IsClosed,0)=0 `, v3User, now, header.OrderHeaderID, lineID); err2 != nil { - return fmt.Errorf("line delete failed line_id=%s: %v; soft-close failed: %w", lineID, err, err2) + return fmt.Errorf("line delete failed line_id=%s: %v; qty-zero soft-close failed: %w", lineID, err, err2) } } diff --git a/svc/queries/orderlist.go b/svc/queries/orderlist.go index 9e7cbe7..b9af840 100644 --- a/svc/queries/orderlist.go +++ b/svc/queries/orderlist.go @@ -112,6 +112,16 @@ SELECT END AS PackedRatePct, ISNULL(h.IsCreditableConfirmed,0) AS IsCreditableConfirmed, + CASE + WHEN EXISTS ( + SELECT 1 + FROM dbo.trOrderLine l2 + WHERE l2.OrderHeaderID = h.OrderHeaderID + AND ISNULL(l2.ItemCode,'') LIKE 'U%%' + ) + THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS HasUretimUrunu, ISNULL(h.Description,'') AS Description, usd.Rate AS ExchangeRateUSD diff --git a/svc/routes/orderlist.go b/svc/routes/orderlist.go index 09d9f83..bf74494 100644 --- a/svc/routes/orderlist.go +++ b/svc/routes/orderlist.go @@ -58,7 +58,7 @@ func OrderListRoute(mssql *sql.DB) http.Handler { count := 0 // ================================================== - // 🧠 SCAN — SQL SELECT ile BİRE BİR (17 kolon) + // 🧠 SCAN — SQL SELECT ile BİRE BİR (18 kolon) // ================================================== for rows.Next() { @@ -85,9 +85,10 @@ func OrderListRoute(mssql *sql.DB) http.Handler { &o.PackedRatePct, // 14 &o.IsCreditableConfirmed, // 15 - &o.Description, // 16 + &o.HasUretimUrunu, // 16 + &o.Description, // 17 - &o.ExchangeRateUSD, // 17 + &o.ExchangeRateUSD, // 18 ) if err != nil { diff --git a/ui/src/css/app.css b/ui/src/css/app.css index 2a742bc..7dbf31d 100644 --- a/ui/src/css/app.css +++ b/ui/src/css/app.css @@ -21,7 +21,7 @@ } .q-page { - margin-top: 5px; + margin-top: 0; } @media (max-width: 768px) { @@ -288,6 +288,11 @@ body { overflow-y: auto; overflow-x: visible; background: #fff; + padding-top: 0 !important; +} +/* Quasar header offsetunu sadece order sayfasında sıfırla */ +.q-page-container .order-page { + margin-top: calc(-1 * var(--header-h) - 58px); } .body--drawer-left-open .q-page-container { @@ -344,16 +349,33 @@ body { .filter-bar { background: #fafafa; border-bottom: 1px solid #ddd; - padding: 12px 24px; + padding: 8px 12px; margin-top:0 !important; } +.filter-bar .q-field__label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.1; + font-size: 12px; +} +.filter-bar .q-field__control, +.filter-bar .q-field__native, +.filter-bar .q-field__marginal { + min-height: 36px; +} +.filter-bar-desc { + padding: 0 12px 6px; + background: #fafafa; + border-bottom: 1px solid #ddd; +} /* 🔹 Save toolbar */ .save-toolbar { background: var(--baggi-gold-pale); border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; - padding: 10px 16px; + padding: 6px 10px; display: flex; justify-content: space-between; align-items: center; @@ -454,8 +476,9 @@ body { .order-grid-header .total-row { display: flex; align-items: stretch; - justify-content: space-between; + justify-content: flex-start; background: #fff59d; + grid-column: 7 / -1; } .order-grid-header .total-cell { width: var(--col-adet); @@ -469,6 +492,9 @@ body { font-weight: 700; font-size: 12px; } +.order-grid-header .total-cell:last-child { + width: var(--col-termin); +} /* =========================================================== 6️⃣ SUB-HEADER (ÜRÜN GRUBU BAR) — TAM HİZALANMIŞ =========================================================== */ @@ -614,6 +640,108 @@ body { padding-top: var(--sub-header-h); z-index: 100; } +.order-scroll-y.compact-grid-header { + --grid-header-h: var(--beden-h); +} +.order-scroll-y.compact-grid-header .order-grid-header .col-fixed { + writing-mode: horizontal-tb; + transform: none; + height: var(--grid-header-h); + font-size: 10px; + line-height: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 4px; +} +.order-scroll-y.compact-grid-header .order-grid-header .total-cell { + writing-mode: horizontal-tb; + transform: none; + height: var(--grid-header-h); + font-size: 10px; + line-height: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 4px; +} +.order-grid-header.compact { + height: var(--beden-h); +} +.order-grid-header.compact .beden-block { + height: var(--beden-h); +} +.order-grid-header.compact .col-fixed, +.order-grid-header.compact .total-cell { + writing-mode: horizontal-tb; + transform: none; + height: var(--beden-h); + font-size: 10px; + line-height: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 4px; +} +.order-grid-header.compact .total-cell { + width: var(--col-adet); +} +.order-grid-header.compact .total-cell:nth-child(2) { + width: var(--col-fiyat); +} +.order-grid-header.compact .total-cell:nth-child(3) { + width: var(--col-pb); +} +.order-grid-header.compact .total-cell:nth-child(4) { + width: var(--col-tutar); +} +.order-grid-header.compact .total-cell:nth-child(5) { + width: var(--col-termin); +} +.order-grid-header.compact .grp-row { + height: var(--beden-h); +} +.order-grid-header.compact .grp-row:not(:first-child) { + display: none; +} +.order-grid-header.compact .grp-title { + display: none; +} +.order-grid-header.compact .grp-row:first-child .grp-title { + display: block; + font-size: 10px; + line-height: 1; + white-space: nowrap; + padding-right: 4px; +} +.order-grid-header.compact .grp-body { + height: var(--beden-h); + align-items: center; +} +.order-grid-header.compact .grp-cell.hdr { + height: var(--beden-h); + font-size: 10px; +} +.order-scroll-y.compact-grid-header .order-grid-header .grp-title { + display: none; +} +.order-scroll-y.compact-grid-header .order-grid-header .grp-row { + align-items: center; + height: var(--beden-h); +} +.order-scroll-y.compact-grid-header .order-grid-header .grp-body { + grid-template-rows: var(--beden-h); + align-items: center; +} +.order-scroll-y.compact-grid-header .order-grid-header .grp-cell.hdr { + height: var(--beden-h); +} +.order-scroll-y.compact-grid-header .order-grid-header .total-row { + align-items: center; +} +.order-scroll-y.compact-grid-header .order-grid-body { + padding-top: var(--sub-header-h); +} .summary-row { display: grid; @@ -1086,7 +1214,7 @@ body { z-index: 600; background: #fff; border-bottom: 1px solid #ddd; - padding: 10px 16px; + padding: 6px 10px; box-shadow: 0 1px 2px rgba(0,0,0,0.06); min-height: var(--ol-filter-h); display: flex; @@ -1309,7 +1437,7 @@ body { z-index: 620; background: #fff; border-bottom: 1px solid #ddd; - padding: 10px 16px; + padding: 6px 10px; box-shadow: 0 1px 2px rgba(0,0,0,0.06); } @@ -1530,3 +1658,21 @@ body { gap: 2px; } +/* =========================================================== + ORDER ENTRY POPUP EDITOR + =========================================================== */ +.order-editor-card { + width: 98vw; + max-width: 1900px; +} +.order-editor-card .editor { + max-height: 76vh; + overflow: auto; +} +.order-editor-dialog .q-dialog__inner--minimized { + max-width: 98vw; +} +.order-editor-dialog .q-dialog__inner > div { + width: 98vw; + max-width: 1900px; +} diff --git a/ui/src/layouts/MainLayout.vue b/ui/src/layouts/MainLayout.vue index 36e2f86..551fca7 100644 --- a/ui/src/layouts/MainLayout.vue +++ b/ui/src/layouts/MainLayout.vue @@ -209,6 +209,11 @@ const menuItems = [ to: '/app/order-gateway', permission: 'order:view' }, + { + label: 'Üretime Verilen Siparişleri Güncelle', + to: '/app/orderproductionupdate', + permission: 'order:update' + }, { label: 'Tamamlanan Siparişleri Toplu Kapatma', to: '/app/order-bulk-close', diff --git a/ui/src/pages/OrderEntry.vue b/ui/src/pages/OrderEntry.vue index 6ea63a8..9e529a4 100644 --- a/ui/src/pages/OrderEntry.vue +++ b/ui/src/pages/OrderEntry.vue @@ -1,4 +1,4 @@ -