QR-Code IIRS

QR-Code IIRS

Points to be confirmed Vanshika Ma'am

  • For old records also enable qr how we will check for authorize? drop
  • For Stage IirsUsedForCode whereclause like create1 not checked in import Add Errorcode
  • For IirsUsedForCode Z we are checking Notes is mandatory to be filled. But in import we are keeping it as empty drop
  • Insert Sub Trn Logic in import needs to be confirmed Confirmed

Script

ALTER TABLE Mirs1 ADD TrnId NVARCHAR(7),
QtyPerBox NUMERIC (12,3),
NoOfPackets INT;

Doubt

  • Like GRN based on inventory mst do we need to give prefilled value for QtyPerBox Yes prefill it as soon as itemid is selected if QR Enable system parameter is on
  • Button type for New Import will be submit or OnClick? Take Submit and Dummy Values
  • Print also will be added in this branch itself? Yes
  • Import
  1. For Stage should we taken stage from indent for G trnids and for others from their respectivee tables. correct
  2. For BrandId should we take brand from indent for G trnids and for others from their respectivee tables Yes
  3. Condition I am taking hardcoded G. - Correct
  • Old record can they delete? or do we need to check roll back Yes they can delete. Validation comment for now
  • For authorize changes in all the conditions where negsys is checked there we will check enable qr also. In controller also changes made for it. Yes
  • Added 3 left joins in GetIirs1Info for Machine, Process and Shift name in sysgen xl. Ok
  • Update removed columns in import will update for all lines everytime import is done. Remove this query
  • In Final insert done group by stagecode and brandid also. Is that ok? Yes. Check errorcode for Unit not matching
  • YearIirsNo in line level had to declare property for Delete1 rollback. Is that ok? Use docid only for line level

Changed for Print

  • Same like GRN print button needs to be given for Detail and Details1 Receipt IIRS.

Changes in Iirs Details for Authorize

For authorize check NEGATIVESYSPARAMETER = ‘Y’ & ENABLEQR = ‘N’.

Changes in Iirs1Index razor page

  • If Enable QR sysparameter is On then
  1. No Need to show existing Import Button
  2. Need to show Create New button only if IirsTypeCode is I else if IirsTypeCode is O then need to add a new Import Button.

Changes in Iirs1Details razor page

  • If Enable QR sysparameter is On then
  1. Need to show Create New button only if IirsTypeCode is I
  2. If IirsTypeCode is O then need to add show the new Import Button.

Changes for Create1

Changes in Iirs1Create razor page

  • Need to add QtyPerBox field same as Grn1Create if Enable QR sysparameter is on
  • In onintitalize check sysparameter and IirsTypeCode. If it is O then redirect to Iirs1Index page Doubt. Pending to discuss

Changes in Controller for Iirs1ValidateCreate (If System Parameter is On)

  • All the validations same as Grn1ValidateCreate for QtyPerBox needs to be added in Iirs1ValidateCreate for QtyPerBox
    MessageCondition
    Qty Per Box needs to be filled and must be between 1 to 999999999.999_Iirs1.QtyPerBox < 1 OR _Iirs1.QtyPerBox > 999999999.999M
    Qty must be an exact multiple of Qty per box_Iirs1.Qty1 % _Iirs1.QtyPerBox != 0
    No of packets must be between 1 to 300_Iirs1.Qty1 / _Iirs1.QtyPerBox > 300 OR _Iirs1.Qty1 / _Iirs1.QtyPerBox < 1

Changes in Controller for Iirs1Create (If System Parameter is On)

  • M-TrnId will get generated
  • No of packtes will be calculated same like Grn1Create in GrnController below method needs to be added in IIRS
[HttpPost("{dbname},{yearLabel},{userName}")]
public ActionResult Iirs1Create(Iirs1 _Iirs1, string dbname, string yearLabel, string userName)
{
    if (ModelState.IsValid)
    {
        var enableQr = _IUtilityMethodsRepository.GetSysParameterValue(dbname, "EnableQr");
        var isQrEnable = "N";
        if (enableQr.IsActive == "Y")
        {
            var maxTrnId = _IIirsRepository.GetMaxTrnId(dbname);
            int trnIdLength = string.IsNullOrEmpty(maxTrnId) ? 6 : maxTrnId.Length;
            var nextTrnId = _IUtilityMethodsRepository.GetNextDocno(maxTrnId, trnIdLength);

            _Iirs1.TrnId = $"M{nextTrnId}";
            _Iirs1.NoOfPackets = (int)(_Iirs1.Qty1 / _Iirs1.QtyPerBox);
            isQrEnable = "Y";
        }
        else
        {
            _Iirs1.QtyPerBox = 0;
            _Iirs1.NoOfPackets = 0;
        }
        _IIirsRepository.Iirs1Create(_Iirs1, dbname, isQrEnable);
        _IUtilityMethodsRepository.InsertMFGLog(dbname, userName, _Iirs1.IirsNo, "IIRS", "Add line", yearLabel, "");

    }

    return Ok(_Iirs1);
}

Changes in Repository for Iirs1Create and new methods

  • In repository need to create method QrSubTrnInsert like GrnRepository»QrSubTrnInsert
  • Need to create a ScannedSubTrnInsert method with below given query
  • Need to call this QrSubTrnInsert & scannedSubTrnInsert in Iirs1Create only if EnableQr is Y
  • In Iirs1Create insert query need to add 3 more columns for insertion i.e. TrnId, NoOfPackets, QtyPerBox
// Insert Query add trnid,qtyperbox,noofpackets
var query = @"INSERT INTO mirs1 (jobno, dated, inout, condition, itemid, stage, 
qty1, shiftid, machineid, processid, notes,
yearjobno, brandid, storecode,qcok,trnid,qtyperbox,noofpackets) 
VALUES (@jobno, @dated, @inout, @condition, @itemid, @stage, @qty1, @shiftid, @machineid,
@processid, TRIM(@notes), @yearjobno, @brandid, @storecode,@qcok,@trnid,@qtyperbox,@noofpackets); 
" + "SELECT CAST(SCOPE_IDENTITY() as int)";

// If is QrEnable is Y then execute this query
var insertQrSubTrn = @"WITH A(subtrnid) AS
(
    SELECT TOP (CAST(@noofpacket AS INT))
    ROW_NUMBER() OVER (ORDER BY name) AS subtrnid
    FROM master.dbo.spt_values
),
B(trnid, subtrnid, balanceqty) AS
(
    SELECT @mtrnid AS trnid, FORMAT(subtrnid,'000') AS subtrnid,
    ROUND(@qty1/CAST(@noofpacket AS INT),3) AS balanceqty
    FROM A
)
INSERT INTO QrSubTrn (trnid, subtrnid, actualqty, balanceqty, isprinted)
SELECT trnid, subtrnid, balanceqty, balanceqty, @isprinted
FROM B
ORDER BY CONCAT(trnid, subtrnid) ASC";

if (isQrEnable == "Y")
{
    connection.Execute(insertQrSubTrn, new
    {
        mtrnid = _Iirs1.TrnId,
        noofpacket = _Iirs1.NoOfPackets,
        qty1 = _Iirs1.Qty1,
        isprinted = "N"
    });
}
  • For QtyPerBox prefill on ItemId Selection
public decimal GetItemStgPkg(string itemid, string dbname)
{
    var query = @"SELECT Stdpkg AS qtyperbox
    FROM inventorymst
    WHERE itemid = @itemid ";

    using var connection = _DapperContext.SetClientConnection(dbname);
    var data = connection.QuerySingleOrDefault<decimal>(query, new { itemid });
    return data;
}

Validation for Delete

  • If scannedsubtrn count is coming > 0 then don’t allow main delete
  • If scannedsubtrn count is coming as 0 then don’t allow line level delete.
// Main Level
if (_Iirs.IirsTypeCode == "O" && enableQr == "Y")
{
    scannedSubTrnCnt = await _IIirsService.GetScannedSubTrnCnt(0, _Iirs.YearIirsNo, _PostLogin.dbname);
}

// Line Level
var scannedSubTrnCnt = 1; // dummy value
if (_Iirs.IirsTypeCode == "O" && enableQr == "Y")
{
    scannedSubTrnCnt = await _IIirsService.GetScannedSubTrnCnt(_Iirs1.Id, _Iirs.YearIirsNo, _PostLogin.dbname);
}

// Repository Query
public int GetScannedSubTrnCnt(int id, string yearIirsNo, string dbname)
{
    string? query;
    if (id == 0)
    {
        query = @"SELECT COUNT(*) FROM Mirs1 M1
        WHERE NOT EXISTS (SELECT trnId FROM ScannedSubTrn S
        WHERE docType = 'M' AND S.yeardocno = @yearIirsNo
        AND S.isrolledback = 'N' AND M1.id = S.docId)
        AND yearjobno = @yearIirsNo";
    }
    else
    {
        query = @"SELECT COUNT(*) FROM ScannedSubTrn
        WHERE docType = 'M' AND yeardocno = @yearIirsNo AND docId = @id
        AND isrolledback = 'N'";
    }

    using var connection = _DapperContext.SetClientConnection(dbname);
    var data = connection.QuerySingleOrDefault<int>(query, new { id, yearIirsNo });
    return data;
}

Changes in Controller for IirsDelete

  • M-TrnId generated will also get deleted if document is delete, so need to make IirsDelete method as given below
[HttpDelete("{id},{dbname},{userName},{yearLabel}")]
public void IirsDelete(int id, string dbname, string userName,string yearLabel,[FromBody] DeleteRequest req)
{
    var data = _IIirsRepository.GetIirsInfo(id, dbname);
    var enableQr = _IUtilityMethodsRepository.GetSysParameterValue(dbname, "EnableQr");

    if (enableQr.IsActive == "Y" && data.IirsTypeCode == "I")
    {
        _IQrPrintRepository.SubTrnDelete(dbname, data.YearIirsNo, "0", "M");
    }

    if (enableQr.IsActive == "Y" && data.IirsTypeCode == "O")
    {
        _IIirsRepository.RollBack(0, data.YearIirsNo, dbname);
    }
    _IIirsRepository.IirsDelete(data.YearIirsNo, dbname);
    _IUtilityMethodsRepository.InsertMFGLog(dbname, userName, data.IirsNo, "IIRS", "Delete", yearLabel, req.DeleteReason);
}

Changes in Controller for Iirs1Delete

  • M-TrnId generated will also get deleted if document is delete, so need to take Iirs1Delete method as below
[HttpDelete("{id},{dbname},{userName},{yearLabel}")]
public void Iirs1Delete(int id, string dbname, string userName, string yearLabel,[FromBody] DeleteRequest req)
{
    var data = _IIirsRepository.GetIirs1Info(id, dbname);
    var enableQr = _IUtilityMethodsRepository.GetSysParameterValue(dbname, "EnableQr");
    if (enableQr.IsActive == "Y" && !string.IsNullOrEmpty(data.TrnId))
    {
        _IQrPrintRepository.SubTrnDelete(dbname, "0", data.TrnId.Replace("-", ""), "M");
    }

    if (enableQr.IsActive == "Y" && string.IsNullOrEmpty(data.TrnId))
    {
        _IIirsRepository.RollBack(id, "0", dbname);
    }
    _IIirsRepository.Iirs1Delete(id, dbname);
    _IUtilityMethodsRepository.InsertMFGLog(dbname, userName, data.IirsNo, "IIRS", "Delete line", yearLabel, req.DeleteReason);

}
  • Rollback query for main and line delete
public void RollBack(int docId, string yearIirsNo, string dbname)
{
    var IdWhereClause = docId == 0 ? "AND yeardocno = @yearIirsNo" : "AND docid = @docId";

    var query = $@"WITH A (trnid, subtrnid, qty) AS
    (
        SELECT S.trnid, S.subtrnid, SUM(S.qty) AS qty
        FROM ScannedSubTrn S
        WHERE docType = 'M'
        AND S.isrolledback = 'N'
        {IdWhereClause}
        GROUP BY S.trnid, S.subtrnid
    )
    UPDATE QrSubTrn SET balanceqty = balanceqty + qty FROM A 
    WHERE QrSubTrn.trnid+QrSubTrn.subtrnid = A.trnid+A.subtrnid";

    var query1 = $@"UPDATE ScannedSubTrn SET isrolledback = 'Y'
    WHERE docType = 'M'
    {IdWhereClause}";

    using var connection = _DapperContext.SetClientConnection(dbname);
    connection.Execute(query, new { docId, yearIirsNo });
    connection.Execute(query1, new { docId, yearIirsNo });
} 

Iirs1ImportIssueQr

Iirs1ImportIssueQr (New Razor Page)

  • Redirect if IirsTypeCode is I or sysparameter is off
  • Create a new page Iirs1ImportIssueQr, similar to Iirs1Import.razor
  • In this page Iirs No will be shown as readonly like Iirs1Import.razor page.
  • User can select Machine, Process and Shift. Mud Select Combos will be given for Machine, Process, Shift same like Iirs1Create.razor page.
  • It will contain 3 buttons similar to Iirs1Import.razor
  1. Import
  2. Download Model
  3. Back
  • Import Page Fields
    Column
    Iirs No Readonly
    Shift Mud Select
    Machine Mud Select
    Process Mud Select
  • Dummy Values to be initialized on oninitialize.
    _Iirs1.ItemStateCode =“G”;
    _Iirs1.ItemId = “000000”;
    _Iirs1.Qty1 = 1;
    _Iirs1.Stage = “00”;
    _Iirs1.BrandId = “000”;

Iirs1IssueQrDownloadModel

ColumnInstruction
Issue QtyMust be in proper number format for partial issue, keep blank for full issue, use ‘D’ to exclude the record.
QR DescriptionQR Description can be upto 500 characters only

Validations for ImportIssueQr

Z-Series Validations (C# Logic in Controller)
ErrorcodeMessage
Z1QR Description cannot exceed 500 characters.
Z2Issue Qty must be in proper number format (Need to check only if it is not D or Blank. If it is D then exclude those records before sending them to repository.)
Repository-Level Validations
ErrorcodeMessage
AOnly GRN, JobWork, IIRS and Stock transactions can be imported (validate using QrDescription's first character: must be G, J, M, or S).
BInvalid Transaction Id / Sub Transaction Id.
CSub Transaction Balance Qty is zero.
DTrnId and Sub Trn Id must be unique.
EIssue Qty must be between 1 to 999999.999
FIssue Qty cannot be more than balance Qty
GIirs Unit and Transaction Document Unit is not matching
HRejected Stock Items cannot be issued.
IIirs Type and Transaction Document Stage Type is not matching

Repository Query

public async Task<Tuple<List<Iirs1>, string>> Iirs1ImportIssueQr
(int mainId, List<Iirs1> listdata, string dbname, string machineCode, string shiftCode, string processCode, string userName, string yearLabel)
{
    var tempcreate = @"CREATE TABLE #temp
    (
        id INT PRIMARY KEY IDENTITY(1,1),
        qrdescription NVARCHAR (500)  COLLATE DATABASE_DEFAULT,
        trnid NVARCHAR (7) COLLATE DATABASE_DEFAULT,
        subtrnid NVARCHAR (3) COLLATE DATABASE_DEFAULT,
        qty NUMERIC(12,3),
        errorcode NVARCHAR(50) COLLATE DATABASE_DEFAULT,
        itemid NVARCHAR(6) COLLATE DATABASE_DEFAULT,
        stagecode NVARCHAR(2) COLLATE DATABASE_DEFAULT,
        brandid NVARCHAR(3) COLLATE DATABASE_DEFAULT
    )";

    var tempinsert = @"INSERT INTO #temp(QrDescription, qty, trnid, subtrnid)
    VALUES(@QrDescription, @qty, @trnid, @subtrnid)";

    var updateQty = @"UPDATE #temp SET qty = Q.balanceqty
    FROM QrSubTrn Q
    WHERE #temp.trnid = Q.trnid AND #temp.subtrnid = Q.subtrnid AND COALESCE(#temp.qty, 0) = 0";

    var updateOtherFields = @"WITH A(trnid , itemid, stagecode, brandid) AS
    (
        SELECT G1.TrnId, G1.ItemId,
        I1.stage AS stagecode, I1.brandid
        FROM #temp Z
        LEFT JOIN Grn1 G1 ON Z.TrnId = G1.TrnId
        LEFT JOIN indent1 I1 ON G1.indent1id = I1.id
        WHERE LEFT(Z.trnid,1) = 'G'

        UNION ALL 

        SELECT J1.TrnId, J1.ItemId,
        J1.stage AS stagecode, J1.brandid
        FROM #temp Z
        LEFT JOIN Jobwork1 J1 ON Z.TrnId = J1.TrnId
        WHERE LEFT(Z.trnid,1) = 'J'

        UNION ALL 

        SELECT M1.TrnId, M1.ItemId,
        M1.stage AS stagecode, M1.brandid
        FROM #temp Z
        LEFT JOIN Mirs1 M1 ON Z.TrnId = M1.TrnId
        WHERE LEFT(Z.trnid,1) = 'M'

        UNION ALL 

        SELECT S.TrnId, S.ItemId,
        S.stagecode, S.brandid
        FROM #temp Z
        LEFT JOIN QrStock S ON Z.TrnId = S.TrnId
        WHERE LEFT(Z.trnid,1) = 'S'
    )
    UPDATE #temp SET itemid = A.itemid,
    stagecode = A.stagecode, brandid = A.brandid
    FROM A
    WHERE #temp.trnid = A.trnid";

    // Error Code A: Only GRN, JobWork, Mirs, and Stock transactions
    var errorcodeA = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(errorcode),'')+ 'A'
    WHERE LEFT(trnid, 1) NOT IN ('G','J','M','S')";

    // Error Code B: Invalid Transaction ID or Sub-Transaction ID
    var errorcodeB = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' B' 
    WHERE NOT EXISTS (SELECT trnid + subtrnid FROM QrSubTrn 
    WHERE #temp.trnid + #temp.subtrnid = QrSubTrn.trnid + QrSubTrn.subtrnid)";

    // Error Code C: SubTrn ID has zero balance
    var errorcodeC = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' C'
    WHERE EXISTS (SELECT trnid + subtrnid FROM QrSubTrn 
    WHERE #temp.trnid + #temp.subtrnid = QrSubTrn.trnid + QrSubTrn.subtrnid
    AND QrSubTrn.balanceqty = 0)";

    // Error code D: Trnid and subtrnid must be unique
    var errorcodeD = @"WITH A(trnid, subtrnid) AS 
    (
        SELECT trnid, subtrnid
        FROM #temp
        GROUP BY trnid,subtrnid
        HAVING COUNT(*) > 1
    )
    UPDATE #temp
    SET errorcode = COALESCE(RTRIM(errorcode), '') + ' D'
    FROM A
    WHERE #temp.trnid = A.trnid AND #temp.subtrnid = A.subtrnid";

    // Error Code E: Issue Qty must be between 1 and 999999.999
    var errorcodeE = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' E'
    FROM #temp 
    WHERE qty NOT BETWEEN 1 AND 999999.999";

    // Error Code F: Issue Qty cannot be more than balance Qty
    var errorcodeF = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' F'
    FROM QrSubTrn Q 
    WHERE #temp.trnid = Q.trnid AND #temp.subtrnid = Q.subtrnid
    AND #temp.qty > Q.balanceqty";

    // Error Code G: Iirs Unit and Transaction Document Unit is not matching
    var errorcodeG = @"WITH A(id, unitcode) AS
    (
        SELECT Z.id, G.unitcode
        FROM #temp Z
        LEFT JOIN Grn1 G1 ON Z.TrnId = G1.TrnId
        LEFT JOIN Grn G ON G1.yeargrnno = G.yeargrnno
        WHERE LEFT(Z.trnid,1) = 'G'

        UNION ALL 

        SELECT Z.id, J.Unitcode
        FROM #temp Z
        LEFT JOIN Jobwork1 J1 ON Z.TrnId = J1.TrnId
        LEFT JOIN jobwork J ON J1.yearjobno = J.yearjobno 
        WHERE LEFT(Z.trnid,1) = 'J'

        UNION ALL 

        SELECT Z.id, M.Unitcode
        FROM #temp Z
        LEFT JOIN Mirs1 M1 ON Z.TrnId = M1.TrnId
        LEFT JOIN mirs M ON M1.yearjobno = M.yearjobno
        WHERE LEFT(Z.trnid,1) = 'M'

        UNION ALL 

        SELECT Z.id, S.unitcode
        FROM #temp Z
        LEFT JOIN QrStock S ON Z.TrnId = S.TrnId
        WHERE LEFT(Z.trnid,1) = 'S'
    )
    UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' G'
    FROM A
    WHERE A.unitcode != @unitcode AND #temp.id = A.id AND COALESCE(A.unitcode,'') != ''";

    // Error Code H: Rejected Stock Items cannot be issued.
    var errorcodeH = @"UPDATE #temp SET errorcode = COALESCE(RTRIM(ERRORCODE), '') + ' H'
    WHERE EXISTS (SELECT S.TrnId FROM QrStock S WHERE #temp.TrnId = S.TrnId
    AND S.itemstate != 'G') 
    AND LEFT(#temp.trnid,1) = 'S'";

    var cnterrorcode = @"SELECT COUNT(errorcode) AS CNT FROM #temp 
    WHERE COALESCE(errorcode,'') != ''";

    var data = @"SELECT Z.QrDescription, Z.qty AS qty1,
    COALESCE(Z.errorcode,'') AS errorcode
    FROM #temp Z
    ORDER BY Z.id ASC";

    var newTempCreate = @"CREATE TABLE #NewMirs 
    (
        mirsid INT,
        itemid NVARCHAR(6) COLLATE DATABASE_DEFAULT,
        brandid NVARCHAR(3) COLLATE DATABASE_DEFAULT,
        stagecode NVARCHAR(2) COLLATE DATABASE_DEFAULT
    )";

    var finalinsert = @"WITH A (itemid, stagecode, brandid, qty1) AS 
    (
        SELECT itemid, stagecode, brandid, SUM(qty) AS qty1
        FROM #temp
        GROUP by itemid, stagecode, brandid
    )
    INSERT INTO Mirs1 (jobno, dated, inout, condition,
    itemid, stage, shiftid, machineid, processid, notes, qty1, yearjobno,
    brandid, storecode, qcok, qtyperbox, noofpackets, trnid)
    OUTPUT INSERTED.Id, INSERTED.itemid, INSERTED.brandid, INSERTED.stage
    INTO #NewMirs
    SELECT @jobno, @dated, @inout, @condition,
    itemid, stagecode, @shiftid, @machineid, @processid, @notes, qty1, @yearjobno,
    brandid, @storecode, @qcok, @qtyperbox, @noofpackets, @trnid
    FROM A"; 

    // var updateRemovedColumns = @"UPDATE mirs1 SET mkrckrno = @mkrckrno, qty2 = @qty2,
    // rmbatchcode = @rmbatchcode, locked = @locked, partyid = @partyid
    // FROM #temp
    // WHERE Mirs1.yearjobno = @yearjobno"; 

    // var insertScannedSubTrn = @"WITH A(trnid, subtrnid, qty,docid) AS 
    // (
    //     SELECT Z.trnid, Z.subtrnid, Z.qty, M1.id AS docid FROM #temp Z
    //     LEFT JOIN Mirs1 M1 ON Z.itemid = M1.itemid AND Z.stagecode = M1.Stage AND Z.brandid = M1.brandid
    //     WHERE NOT EXISTS (SELECT docId FROM ScannedSubTrn S
    //     WHERE M1.id = S.docid AND S.doctype = 'M' AND S.yeardocno = @yearjobno)
    //     AND M1.id IS NOT NULL AND M1.yearjobno = @yearjobno
    // )
    // INSERT INTO ScannedSubTrn (docType, yeardocno, trnid, subtrnid, qty, isrolledback, docid)
    // SELECT 'M', @yearjobno, trnid, subtrnid, qty, 'N', docid FROM A";

    var insertScannedSubTrn = @"INSERT INTO ScannedSubTrn (docType, yeardocno, trnid, subtrnid, qty, isrolledback, docid)
    SELECT 'M', @yearjobno, trnid, subtrnid, qty, 'N',  N.MirsId 
    FROM #temp T
    JOIN #NewMirs N ON N.itemid = T.itemid AND N.brandid = T.brandid AND N.stagecode = T.stagecode;";

    var updateQrSubTrnQty = @"WITH A(trnid, subtrnid, qty) AS 
    (
        SELECT trnid, subtrnid, qty FROM #temp
    )
    UPDATE QrSubTrn SET BalanceQty = BalanceQty - A.qty FROM A
    WHERE QrSubTrn.TrnId + QrSubTrn.SubTrnId = A.TrnId + A.subtrnid";

    using var connection = _DapperContext.SetClientConnection(dbname);
    connection.Open();
    connection.Execute(tempcreate);
    foreach (var dataLine in listdata)
    {
        connection.Execute(tempinsert, new
        {
            dataLine.QrDescription, 
            qty = dataLine.QrIssueQty,
            trnid = dataLine.QrDescription.Trim().Substring(0, 7),
            subtrnid = dataLine.QrDescription.Trim().Substring(8, 3)
        });
    }

    connection.Execute(updateQty);
    connection.Execute(updateOtherFields);

    connection.Execute(errorcodeA);
    connection.Execute(errorcodeB);
    connection.Execute(errorcodeC);
    connection.Execute(errorcodeD);
    connection.Execute(errorcodeE);
    connection.Execute(errorcodeF);
    var iirsInfo = GetIirsInfo(mainId, dbname);
    connection.Execute(errorcodeG, new { iirsInfo.UnitCode });
    connection.Execute(errorcodeH);

    var errorcount = connection.QuerySingleOrDefault<int>(cnterrorcode);
    string? msg;
    if (errorcount == 0)
    {
        connection.Execute(newTempCreate);
        connection.Execute(finalinsert , 
        new 
        { 
            jobno = iirsInfo.IirsNo,
            dated = DateTime.Now.Date,
            inout = iirsInfo.IirsTypeCode,
            condition = "G",
            shiftid = shiftCode,
            machineid = machineCode,
            processid = processCode,
            notes = "",
            yearjobno = iirsInfo.YearIirsNo,
            storecode = iirsInfo.MainLocation,
            qcok = "N",
            qtyperbox = 0, 
            noofpackets = 0,
            trnid = ""
        });

        // string? nullValue = null;

        // connection.Execute(updateRemovedColumns  , 
        // new 
        // { 
        //     mkrckrno = nullValue,
        //     qty2 = 0,
        //     rmbatchcode = nullValue,
        //     locked = nullValue,
        //     partyid = nullValue,
        //     yearjobno = iirsInfo.YearIirsNo,
        // });

        connection.Execute(insertScannedSubTrn, new { yearjobno = iirsInfo.YearIirsNo });
        connection.Execute(updateQrSubTrnQty);

        _IUtilityMethodsRepository.InsertMFGLog(dbname, yearLabel, iirsInfo.IirsNo, "IIRS", "Issue QR Import", userName, "");
        msg = "Import Successfully";
    }
    else
    {
        msg = "Import could not succeeded";
    }

    var dataQuery = await connection.QueryAsync<Iirs1>(data);
    var data1 = dataQuery.ToList();

    return new Tuple<List<Iirs1>, string>(data1, msg);
}