55 lines
3.7 KiB
MySQL
55 lines
3.7 KiB
MySQL
|
|
-- Tamamlanan siparişli alım ürünün tedarikçi fiyat listesini (Inv_T_ProductSupplier) günceller: tedarikçi × ürün × birim ×
|
|||
|
|
-- para birimi başına tek satır tutulur. Alınan miktara uyan kademe (MinQuantity ≤ miktar olan en büyüğü) siparişin
|
|||
|
|
-- birim fiyatı ve son alım tarihiyle güncellenir; uyan satır yoksa yeni satır açılır (temin süresi = onaydan alıma gün).
|
|||
|
|
-- Fiyatı sipariş verir: siparişsiz alım, iade ve fiyatı 0 olan kalem yazmaz.
|
|||
|
|
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferSupplierPrice]
|
|||
|
|
@Id uniqueidentifier,
|
|||
|
|
@UserId uniqueidentifier = NULL
|
|||
|
|
AS
|
|||
|
|
BEGIN
|
|||
|
|
SET NOCOUNT ON;
|
|||
|
|
DECLARE @Now datetime = GETUTCDATE();
|
|||
|
|
DECLARE @Buy TABLE (TenantId uniqueidentifier NULL, ProductId uniqueidentifier NOT NULL, ContactId uniqueidentifier NOT NULL,
|
|||
|
|
UomId nvarchar(64) NOT NULL, CurrencyId nvarchar(64) NOT NULL, Quantity decimal(18, 4) NOT NULL,
|
|||
|
|
Price decimal(18, 4) NOT NULL, LeadTimeDays int NOT NULL, TargetId uniqueidentifier NULL,
|
|||
|
|
PRIMARY KEY (ProductId, ContactId, UomId, CurrencyId));
|
|||
|
|
|
|||
|
|
INSERT INTO @Buy (TenantId, ProductId, ContactId, UomId, CurrencyId, Quantity, Price, LeadTimeDays)
|
|||
|
|
SELECT b.TenantId, b.ProductId, b.SupplierId, b.UomId, b.CurrencyId, SUM(b.Quantity),
|
|||
|
|
ROUND(SUM(b.Quantity * b.UnitPrice) / SUM(b.Quantity), 4), MAX(b.LeadTimeDays)
|
|||
|
|
FROM (SELECT t.TenantId, ol.ProductId, o.SupplierId, ol.UomId, o.CurrencyId, ol.UnitPrice,
|
|||
|
|
dbo.Inv_F_UomConvert(l.Quantity, l.UomId, ol.UomId) AS Quantity,
|
|||
|
|
CASE WHEN o.ConfirmDate IS NULL OR o.ConfirmDate > @Now THEN 0 ELSE DATEDIFF(day, o.ConfirmDate, @Now) END AS LeadTimeDays
|
|||
|
|
FROM Inv_T_Transfer t
|
|||
|
|
INNER JOIN Inv_T_TransferLine l ON l.TransferId = t.Id AND l.IsDeleted = 0 AND l.Quantity > 0
|
|||
|
|
INNER JOIN Prc_T_PurchaseOrderLine ol ON ol.Id = l.PurchaseOrderLineId AND ol.UnitPrice > 0
|
|||
|
|
INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId
|
|||
|
|
WHERE t.Id = @Id AND t.OperationKind = 'Receipt' AND t.ReturnOfId IS NULL) b
|
|||
|
|
GROUP BY b.TenantId, b.ProductId, b.SupplierId, b.UomId, b.CurrencyId
|
|||
|
|
HAVING SUM(b.Quantity) > 0;
|
|||
|
|
|
|||
|
|
UPDATE b SET TargetId = (SELECT TOP 1 ps.Id
|
|||
|
|
FROM Inv_T_ProductSupplier ps
|
|||
|
|
INNER JOIN Inv_T_Product p ON p.Id = ps.ProductId
|
|||
|
|
WHERE ps.ProductId = b.ProductId AND ps.ContactId = b.ContactId AND ps.IsDeleted = 0 AND ps.VariantKey IS NULL
|
|||
|
|
AND ISNULL(ps.UomId, p.UomId) = b.UomId AND ISNULL(ps.CurrencyId, b.CurrencyId) = b.CurrencyId
|
|||
|
|
AND ps.MinQuantity <= b.Quantity
|
|||
|
|
AND (ps.TenantId = b.TenantId OR (ps.TenantId IS NULL AND b.TenantId IS NULL))
|
|||
|
|
ORDER BY ps.MinQuantity DESC)
|
|||
|
|
FROM @Buy b;
|
|||
|
|
|
|||
|
|
UPDATE ps SET Price = b.Price, UomId = b.UomId, CurrencyId = b.CurrencyId, LastPurchaseDate = @Now,
|
|||
|
|
LastModificationTime = @Now, LastModifierId = @UserId
|
|||
|
|
FROM Inv_T_ProductSupplier ps
|
|||
|
|
INNER JOIN @Buy b ON b.TargetId = ps.Id;
|
|||
|
|
|
|||
|
|
-- Miktarı 1'in altındaki alımda 1'lik kademe uymaz; yeni kademe alınan miktardan başlar.
|
|||
|
|
INSERT INTO Inv_T_ProductSupplier (Id, TenantId, ProductId, ContactId, MinQuantity, UomId, Price, CurrencyId, LeadTimeDays,
|
|||
|
|
LastPurchaseDate, CreationTime, CreatorId, IsDeleted)
|
|||
|
|
SELECT NEWID(), b.TenantId, b.ProductId, b.ContactId, CASE WHEN b.Quantity < 1 THEN b.Quantity ELSE 1 END, b.UomId, b.Price,
|
|||
|
|
b.CurrencyId, b.LeadTimeDays, @Now, @Now, @UserId, 0
|
|||
|
|
FROM @Buy b
|
|||
|
|
WHERE b.TargetId IS NULL;
|
|||
|
|
END
|
|||
|
|
GO
|