QR-Code Reports

QR-Code Reports

Doubts

  • How we will get age for Qrstocks?
  • For valuation report how will we compare the records?
  • Notes how we will pick up it will not be similar to Stock_Qty

QR Reports logic

  • Transaction Wise ReportsNew - In Inventory Ledger report if QR is Enable we will add one more report type Transaction type wise.It will show Item Wise transactions details and summary Shared XL in teams

  • Inventory Valuation & MRP Report - where we are dumping from Stock_qty in insertion0Query, if QR is enable we will use query given below

    INSERT INTO #Temp0 
            (Ind,YearLabel,Dated,unitCode,Stage,brandid,ItemState,itemid,
            qty,docno,partyid,storecode,notes)
            SELECT Ind,YearLabel,Dated,unitCode,Stage,brandid,ItemState,itemid,
            qty,docno,partyid,storecode,notes
            FROM stock_qty
    WITH A(trnid,balanceqty) AS
    (
        SELECT
            trnid,
            SUM(balanceqty) AS balanceqty
        FROM qrSubtrn
        WHERE balanceqty > 0
        GROUP BY trnid
    ),
    B(
        Ind,YearLabel,Dated,unitCode,Stage,brandid,ItemState,itemid,
        qty,docno,partyid,storecode,notes
    ) AS
    (
        /* ========================= GRN ========================= */
        SELECT 
            'G' AS Ind,LEFT(G.yeargrnno,4) + '-' + SUBSTRING(G.yeargrnno,5,2) AS YearLabel,
            G.dated,G.unitcode,I1.stage,I1.brandid,'G' AS ItemState,G1.ItemId,
            A.balanceqty AS qty,G.grnno AS docno,G.partyid,G1.storecode,'' AS notes
        FROM A
        LEFT JOIN Grn1 G1 ON A.trnid = G1.trnid
        LEFT JOIN Indent1 I1 ON G1.indent1id = I1.id
        LEFT JOIN Grn G ON G1.yeargrnno = G.yeargrnno
        WHERE LEFT(A.trnid,1) = 'G'
    
        UNION ALL
    
        /* ========================= JOBWORK ========================= */
        SELECT 
            'J' AS Ind,
            LEFT(J.yearjobno,4) + '-' + SUBSTRING(J.yearjobno,5,2) AS YearLabel,
            J1.anexdate AS Dated,J.unitcode,J1.stage,J1.brandid,'G' AS ItemState,
            J1.ItemId,A.balanceqty AS qty,J.jobno AS docno,J.partyid,J1.storecode,'' AS notes
        FROM A
        LEFT JOIN Jobwork1 J1 ON A.trnid = J1.trnid
        LEFT JOIN Jobwork J ON J1.yearjobno = J.yearjobno
        WHERE LEFT(A.trnid,1) = 'J'
    
        UNION ALL
    
        /* ========================= MIRS ========================= */
        SELECT 
            'M' AS Ind,LEFT(M.yearjobno,4) + '-' + SUBSTRING(M.yearjobno,5,2) AS YearLabel,
            M1.dated,M.unitcode,M1.stage,M1.brandid,'G' AS ItemState,M1.ItemId,
            A.balanceqty AS qty,M.jobno AS docno,'' AS partyid,M1.storecode,'' AS notes
        FROM A
        LEFT JOIN Mirs1 M1 ON A.trnid = M1.trnid
        LEFT JOIN Mirs M ON M1.yearjobno = M.yearjobno
        WHERE LEFT(A.trnid,1) = 'M'
          AND M.isauth = 'Y'
    
        UNION ALL
    
        /* ========================= STOCK ADJUSTMENT ========================= */
        SELECT 
            'S' AS Ind,LEFT(Q.trnid,4) + '-' + SUBSTRING(Q.trnid,5,2) AS YearLabel,
            GETDATE(),Q.unitcode,Q.stagecode,Q.brandid,'G' AS ItemState,
            Q.ItemId,SUM(A.balanceqty) AS qty,Q.trnid AS docno,'' AS partyid,Q.storecode,
            '' AS notes
        FROM A
        LEFT JOIN QrStock Q ON A.trnid = Q.trnid
        WHERE LEFT(A.trnid,1) = 'S'
        GROUP BY
            Q.trnid,Q.unitcode,Q.stagecode,Q.brandid,
            Q.ItemId,Q.storecode
    )
    INSERT INTO #Temp0 
            (Ind,YearLabel,Dated,unitCode,Stage,brandid,ItemState,itemid,
            qty,docno,partyid,storecode,notes)
            SELECT Ind,YearLabel,Dated,unitCode,Stage,brandid,ItemState,itemid,
            qty,docno,partyid,storecode,notes
            FROM B

  • Inventory Aging Report - If Qr is Enable we will run logic given below for inventory Aging reports

Aging Reports logic

-- picking records from Qrsubtrn and joining with documents for getting itemid and docdate
WITH A(trnid,itemid,stage,docdate,qty)AS
(
    /* GRN */
    SELECT QS.trnid,G1.itemid,I1.stage,G.dated AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Grn1 G1 ON QS.trnid = G1.trnid
    LEFT JOIN Grn G ON G1.yeargrnno = G.yeargrnno
    LEFT JOIN Indent1 I1 ON G1.indent1id = I1.id
    WHERE LEFT(QS.trnid,1) = 'G'
    GROUP BY QS.trnid, G1.itemid, I1.stage, G.dated

    UNION ALL

    /* MIRS */
    SELECT QS.trnid,M1.itemid,M1.stage,M1.dated AS docdate,
        SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Mirs1 M1 ON QS.trnid = M1.trnid
    LEFT JOIN Mirs M ON M1.yearjobno = M.yearjobno
    WHERE LEFT(QS.trnid,1) = 'M'
    GROUP BY QS.trnid, M1.itemid, M1.stage, M1.dated

    UNION ALL

    /* Jobwork */
    SELECT QS.trnid,J1.itemid,J1.stage, J1.anexdate AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Jobwork1 J1 ON QS.trnid = J1.trnid
    WHERE LEFT(QS.trnid,1) = 'J'
    GROUP BY QS.trnid, J1.itemid, J1.stage, J1.anexdate

    UNION ALL

    /* Stock Adjustment */
    SELECT QS.trnid,Q.itemid,Q.StageCode,GETDATE() AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN QRStock Q
        ON QS.trnid = Q.trnid
    WHERE LEFT(QS.trnid,1) = 'S'
    GROUP BY QS.trnid, Q.itemid, Q.StageCode
), 
B(trnid,itemid,stage,docdate,qty,age) AS
(
    SELECT A.trnid,A.itemid,A.stage,A.docdate,A.qty,
        DATEDIFF(DAY, A.docdate, '30-Dec-25') AS age
    FROM A
    WHERE qty > 0
),
D(trnid,itemid,stage,docdate,qty,age,rate,value) AS
(
    SELECT B.trnid,B.itemid,B.stage,B.docdate,B.qty,B.age,
    IR.warate AS rate,B.qty * IR.warate AS value
    FROM B
    LEFT JOIN ItemRates IR ON B.itemid = IR.itemid AND B.stage  = IR.stage
),
E(itemid,stage,qtyupto15,qtyupto30,qtyupto60,qtyupto90,qtyupto180,qtyupto365,qtyabove365,
valueupto15,valueupto30,valueupto60,valueupto90,valueupto180,valueupto365,valueabove365
)AS
(
    SELECT itemid,stage,
        ROUND(SUM(IIF(age BETWEEN 0  AND 15 , qty , 0)),3)  AS qtyupto15,
        ROUND(SUM(IIF(age BETWEEN 16 AND 30 , qty , 0)),3)  AS qtyupto30,
        ROUND(SUM(IIF(age BETWEEN 31 AND 60 , qty , 0)),3)  AS qtyupto60,
        ROUND(SUM(IIF(age BETWEEN 61 AND 90 , qty , 0)),3)  AS qtyupto90,
        ROUND(SUM(IIF(age BETWEEN 91 AND 180, qty , 0)),3)  AS qtyupto180,
        ROUND(SUM(IIF(age BETWEEN 181 AND 365,qty , 0)),3)  AS qtyupto365,
        ROUND(SUM(IIF(age > 365, qty , 0)),3)               AS qtyabove365,

        ROUND(SUM(IIF(age BETWEEN 0  AND 15 , value , 0)),2) AS valueupto15,
        ROUND(SUM(IIF(age BETWEEN 16 AND 30 , value , 0)),2) AS valueupto30,
        ROUND(SUM(IIF(age BETWEEN 31 AND 60 , value , 0)),2) AS valueupto60,
        ROUND(SUM(IIF(age BETWEEN 61 AND 90 , value , 0)),2) AS valueupto90,
        ROUND(SUM(IIF(age BETWEEN 91 AND 180, value , 0)),2) AS valueupto180,
        ROUND(SUM(IIF(age BETWEEN 181 AND 365,value , 0)),2) AS valueupto365,
        ROUND(SUM(IIF(age > 365, value , 0)),2)  AS valueabove365
    FROM D
    GROUP BY itemid,stage
)

SELECT E.itemid,I0.shortname AS itemshortname,
    I0.itemname,IT.groupname AS itemgroupname,
    S.description AS segmentname,U.uomname,ST.stagename,
    E.qtyupto15,E.qtyupto30,E.qtyupto60,E.qtyupto90,
    E.qtyupto180,E.qtyupto365,E.qtyabove365,
    E.valueupto15,E.valueupto30,E.valueupto60,E.valueupto90,
    E.valueupto180,E.valueupto365,E.valueabove365,
    E.stage
FROM E
LEFT JOIN Inventorymst I0 ON E.itemid = I0.itemid
LEFT JOIN ItemGroupmst IT ON I0.itemgroupid = IT.groupcode
LEFT JOIN segmentmst S ON I0.segmentcode = S.segmentcode
LEFT JOIN Uom U ON I0.uomid = U.uomcode
LEFT JOIN stages ST ON E.stage = ST.stage
  • Reconcilation Report New - It will be similar to DPR stock comparison reports
  • It will involve two steps 1. Importing trnids, 2. Comparing it with existing physical records
/////import query

        var createtemp = @"CREATE TABLE #temp
        (
            trnid  NVARCHAR(7) COLLATE DATABASE_DEFAULT,
            subtrnid NVARCHAR(3) COLLATE DATABASE_DEFAULT
        )";

        var inserttempquery = @"INSERT INTO #temp (trnid, subtrnid) VALUES (@trnid, @subtrnid)";

        var finalinsertquery = @"INSERT INTO QrSubTrnComparison (trnid, subtrnid, inventorytype, qty, qty1)
        SELECT DISTINCT trnid,subtrnid,'P' AS inventoryype, 0 AS qty, 0 AS qty1 FROM #temp";

        // need to discuss short close part in details
        var trnIdList = @"WITH A(trnid, subtrnid,balanceqty) AS
        (
            SELECT trnid,subtrnid, balanceqty FROM QrSubTrn
            WHERE ABS(balanceqty) > 0
        )";

        // Updated bal. for existing records
        var updateqtyquery = $@"{trnIdList}
        UPDATE QrSubTrnComparison SET qty = B.balanceqty FROM B
        WHERE QrSubTrnComparison.trnid = B.trnid AND QrSubTrnComparison.subtrnid = B.subtrnid";

        // Insert those records which is in System but not in comparison table
        var insertSystemRecords = $@"{trnIdList},
        C(trnid, subtrnid, balanceqty) AS
        (
            SELECT trnid, subtrnid, balanceqty FROM B
            WHERE NOT EXISTS (SELECT trnid, subtrnid FROM QrSubTrnComparison D
            WHERE B.trnid = D.trnid AND B.subtrnid = D.subtrnid )
        )
        INSERT INTO QrSubTrnComparison (trnid, subtrnid, inventorytype, qty, qty1)
        SELECT trnid, subtrnid, 'S' AS inventoryType, balanceqty FROM C";
WITH A (trnid, id, inventorytype) AS 
(
    -- Physical Stocks
    SELECT trnid, id, inventorytype 
    FROM QrSubTrnComparison
    WHERE inventorytype = 'P'

    UNION ALL 

    -- Added by System but trnid exists in Physical Stock
    SELECT trnid, id, inventorytype  
    FROM QrSubTrnComparison 
    WHERE inventorytype = 'S' 
      AND trnid IN (
            SELECT trnid 
            FROM QrSubTrnComparison 
            WHERE inventorytype = 'P'
      )
),
B (trnid) AS
(
    SELECT DISTINCT trnid FROM A
),
C (trnid, rowno) AS
(
    SELECT trnid,
           ROW_NUMBER() OVER (ORDER BY trnid) AS rowno
    FROM B
),
D (trnid, id, inventorytype, rowno, newrowno) AS
(
    SELECT A.trnid,A.id,A.inventorytype,
        C.rowno,
        IIF(A.inventorytype = 'P', C.rowno, C.rowno + 0.1) AS newrowno
    FROM A
    LEFT JOIN C ON A.trnid = C.trnid
),
E (maxrowno) AS 
(
    SELECT MAX(rowno) + 1 FROM C
),
F (trnid, id, inventorytype, newrowno) AS
(
    SELECT trnid,id,inventorytype,
    newrowno
    FROM D

    UNION ALL

    SELECT DS.trnid,DS.id,DS.inventorytype,
    E.maxrowno AS newrowno
    FROM QrSubTrnComparison DS
    LEFT JOIN E ON 1 = 1
    LEFT JOIN D ON DS.trnid = D.trnid
    WHERE DS.inventorytype = 'S'
    AND D.trnid IS NULL
),

/* =========================================================
   Document & Item Resolution using QRSubTrn
   ========================================================= */
G(trnid,itemid,docno,docdate,qty) AS
(
    /* ---------------- GRN ---------------- */
    SELECT QS.trnid,G1.itemid,G.grnno AS docno,G.dated AS docdate,
        SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Grn1 G1 ON QS.trnid = G1.trnid
    LEFT JOIN Grn  G  ON G1.yeargrnno = G.yeargrnno
    WHERE LEFT(QS.trnid,1) = 'G'
    GROUP BY QS.trnid, G1.itemid, G.grnno, G.dated

    UNION ALL

    /* ---------------- MIRS ---------------- */
    SELECT QS.trnid,M1.itemid,M.jobno AS docno,M1.dated AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Mirs1 M1 ON QS.trnid = M1.trnid
    LEFT JOIN Mirs  M  ON M1.yearjobno = M.yearjobno
    WHERE LEFT(QS.trnid,1) = 'M'
      AND M.isauth = 'Y'
    GROUP BY QS.trnid, M1.itemid, M.jobno, M1.dated

    UNION ALL

    /* ---------------- JOBWORK ---------------- */
    SELECT QS.trnid,J1.itemid,J.jobno AS docno,J1.anexdate AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN Jobwork1 J1 ON QS.trnid = J1.trnid
    LEFT JOIN Jobwork  J  ON J1.yearjobno = J.yearjobno
    WHERE LEFT(QS.trnid,1) = 'J'
    GROUP BY QS.trnid, J1.itemid, J.jobno, J1.anexdate

    UNION ALL

    /* ---------------- STOCK ADJUSTMENT ---------------- */
    SELECT QS.trnid,Q.itemid,Q.trnid AS docno,Q.dated AS docdate,
    SUM(QS.balanceqty) AS qty
    FROM QRSubTrn QS
    LEFT JOIN QRStock Q ON QS.trnid = Q.trnid
    WHERE LEFT(QS.trnid,1) = 'S'
    GROUP BY QS.trnid, Q.itemid, Q.trnid, Q.dated
),

/* =========================================================
   Final Presentation Layer
   ========================================================= */
H(itemname,trnid,docno,docdate,qty) AS
(
    SELECT I.itemname,CONCAT_WS('-', LEFT(F.trnid,1), RIGHT(F.trnid,6)) AS trnid,
    G.docno,G.docdate,G.qty
    FROM F
    LEFT JOIN G        ON F.trnid = G.trnid
    LEFT JOIN DprItem I ON G.itemid = I.itemid
)

SELECT itemname,trnid,docno,docdate,qty
FROM H
ORDER BY trnid;";