Retail_manager/RMDataManagerLibrary/DataAcccess/SaleData.cs
s459315 f118635029 Added admin endpoints
Added inventory and sales api endpoints
2022-08-02 19:32:39 +02:00

95 lines
2.8 KiB
C#

using RMDataManagerLibrary.Internal.DataAccess;
using RMDataManagerLibrary.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RMDataManagerLibrary.DataAcccess
{
public class SaleData
{
//TODO: Make this SOLID/DRY/BETTER
public void SaveSale(SaleModel saleInfo, string cashierId)
{
List<SaleDetailDBModel> details = new List<SaleDetailDBModel>();
ProductData products = new ProductData();
decimal taxRate = ConfigHelper.GetTaxRate()/100;
foreach (var item in saleInfo.SaleDetails)
{
var detail = new SaleDetailDBModel
{
ProductId = item.ProductId,
Quantity = item.Quantity
};
// get the information about this product
var productInfo = products.GetProductById(item.ProductId);
if (productInfo == null)
{
throw new Exception($"Product with Id {item.ProductId} could not be found in DB");
}
detail.PurchasePrice = productInfo.RetailPrice * detail.Quantity;
if (productInfo.IsTaxable)
{
detail.Tax = detail.PurchasePrice * taxRate;
}
details.Add(detail);
}
SaleDBModel sale = new SaleDBModel
{
SubTotal = details.Sum(x => x.PurchasePrice),
Tax = details.Sum(x => x.Tax),
CashierId = cashierId
};
sale.Total = sale.SubTotal + sale.Tax;
//save
using (SqlDataAccess sql = new SqlDataAccess())
{
try
{
sql.StartTransaction("RMData");
sql.SaveDataInTransaction("spSaleInsert", sale);
sale.Id = sql.LoadDataInTransaction<int, dynamic>("spSaleLookUp", new { sale.CashierId, sale.SaleDate }).FirstOrDefault();
// finish filling up sale details
foreach (var item in details)
{
item.SaleId = sale.Id;
sql.SaveDataInTransaction("dbo.spSaleDetailInsert", item);
}
sql.CommitTransaction();
}
catch
{
sql.RollBackTransaction();
throw;
}
}
}
public List<SaleReportModel> GetSaleReport()
{
SqlDataAccess sql = new SqlDataAccess();
var output = sql.LoadData<SaleReportModel, dynamic>("dbo.spSaleSaleReport", new { }, "RMData");
return output;
}
}
}