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)
| Column | Property |
|---|---|
| Entity Name : | entitydata.entityname |
| Report Name : Summary | |
| Report Date : | DateTime.Now.Date.ToString(“dd-MMM-yy”) |
| Date Range : | {xlfromdate} To {xltodate} |
| Tariff Code | tariffcode |
| Tariff Name | tariffname |
| Total Advance Amount | AdvAmount |
Advance_Income_Receipt (Sheet 2)
| Column | Property |
|---|---|
| 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 Type | doctype |
| System Doc No | sysdocno |
| GST Type | gsttypename |
| Doc No | docno |
| Doc Date | docdate |
| Member Name | membername |
| Tariff Code | tariffcode |
| Tariff Name | tariffname |
| Amount | amount |
| From Date | invoicefromdate |
| To Date | invoicetodate |
| Days | Days |
| Advance Days | AdvDays |
| Advance Amount | AdvAmount |
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);
}