Simplify CHS - [Income Received in Advance Report]

Simplify CHS - [Income Received in Advance Report]

Income Received in Advance Report

  • For some adv days is > days. Is that correct?
  • It will be a New Report Type in SalesAnalysisReport.
  • We will use SalesAnalysisReport class itself
  • Method Name : IncomeReceivedInAdvReport
  • New properties to be added in SalesAnalysisReport
public int Days { get; set; }
public int AdvDays { get; set; }
public decimal AdvAmount { get; set; }
public DateTime? ComputeAdvFromDate { get; set; } = DateTime.Now;
public string Ind { get; set; } = string.Empty;
  • For New report we will ask for Compute Advance From Date from user.
[HttpPost("{dbname},{yearlabel}")]
public async Task<ActionResult> SalesAnalysisReportOption(SalesAnalysisReport _SalesAnalysisReport, string dbname, string yearlabel)
{
    var fydates = await _IUtilityMethodsRepository.GetFYDates(yearlabel);

    _SalesAnalysisReport.fromdate = fydates.fystart;
    _SalesAnalysisReport.todate = DateTime.Now.Date;
    _SalesAnalysisReport.ComputeAdvFromDate = DateTime.Now.Date;

    if (DateTime.Now.Date < fydates.fystart || DateTime.Now.Date > fydates.fyend)
    {
        _SalesAnalysisReport.todate = fydates.fyend;
        _SalesAnalysisReport.ComputeAdvFromDate = fydates.fyend;
    }

    _SalesAnalysisReport.reporttype = "A";

    return Ok(_SalesAnalysisReport);
}

Summary (Sheet 1)

ColumnProperty
Entity Name :entitydata.entityname
Report Name : Summary
Report Date :DateTime.Now.Date.ToString(“dd-MMM-yy”)
Date Range :{xlfromdate} To {xltodate}
Tariff Codetariffcode
Tariff Nametariffname
Total Advance AmountAdvAmount

Advance_Income_Receipt (Sheet 2)

ColumnProperty
Entity Name :entitydata.entityname
Report Name : Income Received in Advance (Computed From: {_SalesAnalysisReport.ComputeAdvFromDate?.ToString(“dd-MMM-yy”)})
Report Date :DateTime.Now.Date.ToString(“dd-MMM-yy”)
Date Range :{xlfromdate} To {xltodate}
Doc Typedoctype
System Doc Nosysdocno
GST Typegsttypename
Doc Nodocno
Doc Datedocdate
Member Namemembername
Tariff Codetariffcode
Tariff Nametariffname
Amountamount
From Dateinvoicefromdate
To Dateinvoicetodate
DaysDays
Advance DaysAdvDays
Advance AmountAdvAmount

Repository Queries

public async Task<Tuple<List<SalesAnalysisReport>, List<SalesAnalysisReport>>> IncomeReceivedInAdvReport
(SalesAnalysisReport _SalesAnalysisReport,string dbname)
{
    // temp table creation
    var query = @"CREATE TABLE #salesreport
    (
        doctype NVARCHAR(3) COLLATE DATABASE_DEFAULT,
        sysdocno NVARCHAR(6) COLLATE DATABASE_DEFAULT,
        docno NVARCHAR (6) COLLATE DATABASE_DEFAULT,
        docdate DATETIME,
        memberid NVARCHAR(6) COLLATE DATABASE_DEFAULT,
        tariffcode NVARCHAR(6) COLLATE DATABASE_DEFAULT,
        gsttypecode  NVARCHAR(2) COLLATE DATABASE_DEFAULT,
        amount NUMERIC(11,2),
        invoicefromdate DATETIME,
        invoicetodate DATETIME,
        days INT,
        AdvDays INT,
        AdvAmount NUMERIC(9,0)
    )";

    // for insertion of data
    var query1 = @"WITH A(doctype,sysdocno,docno,docdate,memberid,tariffcode,
    gsttypecode,amount,invoicefromdate,invoicetodate ) AS
    (
        SELECT 'INV' AS doctype,I.Invoiceno AS sysdocno,subno AS docno,I.dated AS docdate,
        I.memberid,I1.tariffcode,gsttype AS gsttypecode,
        I1.amount AS amount,
        fromdate AS invoicefromdate,todate AS invoicetodate
        FROM invoicechs I
        LEFT JOIN invoicechs1 I1 ON I.yearinvoiceno = I1.yearinvoiceno
        WHERE CONVERT(DATE,I.dated) BETWEEN @fromdate AND @todate
        UNION ALL
        SELECT 'SCN' AS doctype,scnno AS sysdocno,invoiceno AS docno,S.dated AS docdate,S.memberid,S1.tariffcode,
        gsttype AS gsttypecode, COALESCE(S1.amount,0)*(-1) AS amount,
        fromdate AS invoicefromdate,
        todate AS invoicetodate
        FROM salescreditnote S
        LEFT JOIN salescreditnote1 S1 ON S.yearscnno = S1.yearscnno
        LEFT JOIN Invoicechs I ON S.yearinvoiceno = I.yearinvoiceno
        WHERE CONVERT(DATE,S.dated) BETWEEN @fromdate AND @todate
    ),
    B (doctype,sysdocno,docno,docdate,memberid,tariffcode,
    gsttypecode,amount,invoicefromdate,invoicetodate, days, AdvDays) AS
    (
        SELECT doctype,sysdocno,docno,docdate,memberid,A.tariffcode,
        gsttypecode,amount,invoicefromdate,invoicetodate,
        DATEDIFF(day, invoicefromdate, DATEADD(DAY, 1, invoicetodate)) AS Days,
        DATEDIFF(day, @ComputeAdvFromDate, invoicetodate) AS AdvDays
        FROM A
    ),
    C (doctype,sysdocno,docno,docdate,memberid,tariffcode,
    gsttypecode,amount,invoicefromdate,invoicetodate, days, AdvDays,AdvAmount) AS
    (
        SELECT doctype,sysdocno,docno,docdate,memberid,tariffcode,
        gsttypecode,amount,invoicefromdate,invoicetodate, days, AdvDays,
        ROUND((AdvDays * 1.0 / days) * amount, 2) AS AdvAmount
        FROM B
        WHERE AdvDays > 0 AND days > 0
    )
    INSERT INTO #salesreport (doctype,sysdocno,docno,docdate,memberid,tariffcode,gsttypecode,
    amount,invoicefromdate,invoicetodate, days, AdvDays,AdvAmount)
    SELECT doctype,sysdocno,docno,docdate,memberid,tariffcode,gsttypecode,amount,
    invoicefromdate,invoicetodate, days, AdvDays,AdvAmount FROM C";

    var deleteQuery = @"DELETE FROM #salesreport WHERE EXISTS
    (
        SELECT SG1.tariffcode FROM ServiceGroupMst1 SG1
        LEFT JOIN ServiceGroupMst SG ON SG1.groupcode = SG.GroupCode
        WHERE #salesreport.tariffcode = SG1.tariffcode AND SG.isactive ='Y'
        AND SG.validitydays = 0
    )";

    // Summary Sheet
    var query2 = @"WITH A (ind, tariffcode,AdvAmount) AS
    (
        SELECT 'X' AS ind, tariffcode, SUM(AdvAmount) AS AdvAmount
        FROM #salesreport
        GROUP BY tariffcode

        UNION ALL

        SELECT 'Y' AS ind, '000000' AS tariffcode, SUM(AdvAmount) AS AdvAmount
        FROM #salesreport
    )
    SELECT ind, A.tariffcode,IIF(ind = 'Y', 'Grand Total',tariffname) AS tariffname,
    AdvAmount
    FROM A
    LEFT JOIN StdTariffMst ST ON A.tariffcode = ST.tariffcode
    ORDER BY ind,tariffname";

    // Details Sheet
    var query3 = @"SELECT S.doctype,sysdocno,GT.Description AS gsttypename,docno,docdate,
    LTRIM(
        CONCAT_WS('/',
        NULLIF(LTRIM(RTRIM(M.Wing)), ''),
        NULLIF(LTRIM(RTRIM(M.Bldg)), ''),
        NULLIF(LTRIM(RTRIM(M.Flatno)), '')
        ) + ' ') + M.Name AS MemberName,
    S.tariffcode, ST.tariffname,S.amount,invoicefromdate,invoicetodate,
    Days, AdvDays, AdvAmount
    FROM #salesreport S
    LEFT JOIN StdTariffMst ST ON S.tariffcode = ST.tariffcode
    LEFT JOIN Membermst M ON S.memberid = M.memberid
    LEFT JOIN GstType GT ON S.gsttypecode = GT.type
    ORDER BY S.doctype ,S.sysdocno";

    using var connection = _DapperContext.SetClientConnection(dbname);
    connection.Open();
    connection.Execute(query);
    connection.Execute(query1,
    new 
    { 
        fromdate = _SalesAnalysisReport.fromdate?.Date, 
        todate = _SalesAnalysisReport.todate?.Date, 
        ComputeAdvFromDate = _SalesAnalysisReport.ComputeAdvFromDate?.Date 
    });
    connection.Execute(deleteQuery);

    // for Summary
    var dataquery2 = await connection.QueryAsync<SalesAnalysisReport>(query2);
    var data2 = dataquery2.ToList();

    // for Details
    var dataquery3 = await connection.QueryAsync<SalesAnalysisReport>(query3);
    var data3 = dataquery3.ToList();

    return new Tuple<List<SalesAnalysisReport>, List<SalesAnalysisReport>>(data2, data3);
}