public OfficalReceipt GetOfficialReceipt(int salesId) { var result = new OfficalReceipt(); using (var ctx = new posDataContext()) { var isSalesTendered = ctx.TrnCollections.Any(x => x.SalesId == salesId); if (isSalesTendered) { var saleHeader = ctx.TrnSales.FirstOrDefault(x => x.Id == salesId); var collectionInfo = ctx.TrnCollections.FirstOrDefault(x => x.SalesId == salesId); var saleLines = ctx.TrnSalesLines.Where(x => x.SalesId == salesId); result.ORNumber = collectionInfo.CollectionNumber; result.UpdateDateTime = collectionInfo.UpdateDateTime.ToString("MM/dd/yyyy hh:mm tt"); result.Customer = saleHeader.MstCustomer.Customer; result.Terminal = saleHeader.MstTerminal.Terminal; if (saleHeader.Remarks == "NA") { result.Remarks = ""; } else { result.Remarks = saleHeader.Remarks; } result.LineItems = new List <LineItem>(); foreach (var line in saleLines) { var priceDescription = ""; if ((line.Price - line.NetPrice) == 0) { priceDescription = $"{line.MstUnit.Unit} @ P{Math.Round(line.Price, 2)}"; } else { priceDescription = $"{line.MstUnit.Unit} @ P{Math.Round(line.Price, 2)} Less: P{Math.Round(line.Price - line.NetPrice, 2)} - {line.MstTax.Tax}"; } result.LineItems.Add(new LineItem() { ItemDescription = line.MstItem.ItemDescription, Quantity = $"{string.Format("{0:N2}", Math.Round(line.Quantity, 2))}", Amount = $"{string.Format("{0:N2}", Math.Round(line.Amount, 2))}", PriceDescription = priceDescription, }); } result.TotalSales = $"₱{string.Format("{0:N2}", Math.Round(saleLines.Sum(x => x.Amount), 2))}"; result.TotalDiscount = $"₱{string.Format("{0:N2}", Math.Round(saleLines.Sum(x => x.DiscountAmount * x.Quantity), 2))}"; var collections = ctx.TrnCollectionLines.Where(x => x.CollectionId == ctx.TrnCollections.FirstOrDefault(y => y.SalesId == salesId).Id); result.TenderLines = new List <TenderLine>(); foreach (var collection in collections) { if (collection.Amount > 0) { result.TenderLines.Add(new TenderLine() { PayType = collection.MstPayType.PayType, Amount = $"{string.Format("{0:N2}", Math.Round(collection.Amount, 2))}" }); } } result.ChangeAmount = $"₱{string.Format("{0:N2}", Math.Round(ctx.TrnCollections.FirstOrDefault(y => y.SalesId == salesId).ChangeAmount, 2))}"; var taxes = saleLines.GroupBy(x => x.MstTax.Tax) .Select(x => new { Tax = x.Key, Amount = x.Sum(a => a.Amount) - x.Sum(a => a.TaxAmount), TaxAmount = x.Sum(a => a.TaxAmount) }); result.VatLines = new List <VatLine>(); foreach (var tax in taxes) { result.VatLines.Add(new VatLine() { Tax = tax.Tax, AmountLessTax = $"{string.Format("{0:N2}", Math.Round(tax.Amount, 2))}", TotalTaxAmount = $"{string.Format("{0:N2}", Math.Round(tax.TaxAmount, 2))}" }); } result.SeniorCitizenDetail = new SeniorCitizen() { SeniorCitizenId = saleHeader.SeniorCitizenId, Name = saleHeader.SeniorCitizenName, Age = saleHeader.SeniorCitizenAge.GetValueOrDefault(), }; } } return(result); }
private void Print() { var saleID = ((Parent as StackLayout).Parent as SalesTenderPrintContainer).SaleId; if (saleID != 0) { var or = new OfficalReceipt(); Task.Run(async() => { or = await APIOfficialReceipt.GetOfficialReceipt(saleID); }).Wait(); if (or.LineItems != null) { var document = new PdfDocument(); document.PageSettings.Margins.All = 2; document.PageSettings.Size = new SizeF(150, (or.LineItems.Count + or.TenderLines.Count + or.VatLines.Count + 40) * ROW_HEIGHT); //PdfPageSize.A6; var page = document.Pages.Add(); var graphics = page.Graphics; var font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f); #region Header var orHeader = new PdfGrid(); var orHeaderData = new List <object> { new { Col1 = SettingsRepository.GetSettings().StoreName, Col2 = "" }, new { Col1 = SettingsRepository.GetSettings().Address, Col2 = "" }, new { Col1 = "Operated By: " + SettingsRepository.GetSettings().OperatedBy, Col2 = "" }, new { Col1 = "TIN: " + SettingsRepository.GetSettings().TIN, Col2 = "" }, new { Col1 = "P No.: " + SettingsRepository.GetSettings().PermitNo, Col2 = "" }, new { Col1 = "A No.: " + SettingsRepository.GetSettings().AccreditNo, Col2 = "" }, new { Col1 = "S No.: " + SettingsRepository.GetSettings().SerialNo, Col2 = "" }, new { Col1 = "Official Receipt", Col2 = "" }, new { Col1 = or.ORNumber, Col2 = "" }, new { Col1 = or.UpdateDateTime, Col2 = "" }, new { Col1 = or.Remarks, Col2 = "" } }; orHeader.DataSource = orHeaderData; orHeader.Headers.Clear(); for (var x = 0; x < orHeader.Rows.Count; x++) { var member = orHeader.Rows[x].Cells[0]; member.ColumnSpan = 2; member.StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; member.Style.Borders.All = PdfPens.Transparent; orHeader.Rows[x].Height = ROW_HEIGHT; } orHeader.Rows[7].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f, PdfFontStyle.Bold) }; orHeader.Rows[8].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f, PdfFontStyle.Bold) }; orHeader.Draw(page, new PointF(0, 0)); #endregion #region Lines //OR Line Items var orLineItems = new PdfGrid(); var orLineItemsData = new List <object>(); orLineItems.Columns.Add(2); foreach (var line in or.LineItems) { orLineItemsData.Add(new { Col1 = line.ItemDescription, Col2 = line.Amount }); orLineItemsData.Add(new { Col1 = line.Quantity + " " + line.PriceDescription, Col2 = "" }); } orLineItems.DataSource = orLineItemsData; orLineItems.Headers.Clear(); orLineItems.Headers.Add(1); orLineItems.Headers[0].Cells[0].Value = "Item"; orLineItems.Headers[0].Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; orLineItems.Headers[0].Cells[1].Value = "Amount"; orLineItems.Headers[0].Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; foreach (var lineItemsMember in orLineItems.Rows) { if (orLineItems.Rows.IndexOf(lineItemsMember) % 2 == 0) { lineItemsMember.Cells[0].Style.Borders.All = PdfPens.Transparent; lineItemsMember.Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; lineItemsMember.Cells[1].Style.Borders.All = PdfPens.Transparent; } else { lineItemsMember.Cells[0].ColumnSpan = 2; lineItemsMember.Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; lineItemsMember.Cells[0].Style.Borders.All = PdfPens.Transparent; orLineItems.Rows[orLineItems.Rows.IndexOf(lineItemsMember)].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 6f, PdfFontStyle.Bold) }; } orLineItems.Rows[orLineItems.Rows.IndexOf(lineItemsMember)].Height = ROW_HEIGHT; } orLineItems.Columns[0].Width = 90f; orLineItems.Draw(page, new PointF(0, (orHeader.Rows.Count * ROW_HEIGHT) + 5)); page.Graphics.DrawLine(new PdfPen(PdfBrushes.Black), new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count) * ROW_HEIGHT) + 15), new PointF(150, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count) * ROW_HEIGHT) + 15)); //OR Line footer var orORFooter = new PdfGrid(); var orORFooterData = new List <object> { new { Col1 = "Total Sales", Col2 = or.TotalSales }, new { Col1 = "Total Discount", Col2 = or.TotalDiscount } }; orORFooter.DataSource = orORFooterData; orORFooter.Headers.Clear(); orORFooter.Rows[0].Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Left, LineAlignment = PdfVerticalAlignment.Middle }; orORFooter.Rows[0].Cells[0].Style.Borders.All = PdfPens.Transparent; orORFooter.Rows[0].Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; orORFooter.Rows[0].Cells[1].Style.Borders.All = PdfPens.Transparent; orORFooter.Rows[0].Height = ROW_HEIGHT; orORFooter.Rows[0].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f, PdfFontStyle.Bold) }; orORFooter.Rows[1].Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Left, LineAlignment = PdfVerticalAlignment.Middle }; orORFooter.Rows[1].Cells[0].Style.Borders.All = PdfPens.Transparent; orORFooter.Rows[1].Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; orORFooter.Rows[1].Cells[1].Style.Borders.All = PdfPens.Transparent; orORFooter.Rows[1].Height = ROW_HEIGHT; orORFooter.Columns[0].Width = 90f; orORFooter.Draw(page, new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count) * ROW_HEIGHT) + 15)); page.Graphics.DrawLine(new PdfPen(PdfBrushes.Black), new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 15), new PointF(150, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 15)); #endregion #region Pay types var orPayItems = new PdfGrid(); var orPayItemsData = new List <object>(); orPayItems.Columns.Add(2); foreach (var line in or.TenderLines) { orPayItemsData.Add(new { Col1 = line.PayType, Col2 = line.Amount }); } orPayItemsData.Add(new { Col1 = "Change", Col2 = or.ChangeAmount }); orPayItems.DataSource = orPayItemsData; orPayItems.Headers.Clear(); foreach (var payItemsMember in orPayItems.Rows) { payItemsMember.Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; payItemsMember.Cells[0].Style.Borders.All = PdfPens.Transparent; payItemsMember.Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; payItemsMember.Cells[1].Style.Borders.All = PdfPens.Transparent; orPayItems.Rows[orPayItems.Rows.IndexOf(payItemsMember)].Height = ROW_HEIGHT; } orPayItems.Columns[0].Width = 90f; orPayItems.Draw(page, new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 15)); page.Graphics.DrawLine(new PdfPen(PdfBrushes.Black), new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orPayItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 15), new PointF(150, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orPayItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 15)); #endregion #region Vat //Vat Header var orVatHeader = new PdfGrid(); var orVatHeaderData = new List <object>(); orVatHeader.Columns.Add(3); orVatHeaderData.Add(new { Col1 = "VAT Details", Col2 = "", Col3 = "" }); orVatHeaderData.Add(new { Col1 = "Amount", Col2 = "", Col3 = "VAT" }); orVatHeader.DataSource = orVatHeaderData; orVatHeader.Headers.Clear(); var vatHeaderMember1 = orVatHeader.Rows[0].Cells[0]; vatHeaderMember1.ColumnSpan = 3; vatHeaderMember1.StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; vatHeaderMember1.Style.Borders.All = PdfPens.Transparent; orVatHeader.Rows[0].Height = ROW_HEIGHT; orVatHeader.Rows[0].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f, PdfFontStyle.Bold) }; var vatHeaderMember2 = orVatHeader.Rows[1].Cells[0]; vatHeaderMember2.ColumnSpan = 2; vatHeaderMember2.StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; vatHeaderMember2.Style.Borders.All = PdfPens.Transparent; var vatHeaderMember3 = orVatHeader.Rows[1].Cells[2]; vatHeaderMember3.StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; vatHeaderMember3.Style.Borders.All = PdfPens.Transparent; orVatHeader.Rows[1].Height = ROW_HEIGHT; orVatHeader.Rows[1].Style = new PdfGridRowStyle() { Font = new PdfStandardFont(PdfFontFamily.Helvetica, 8f, PdfFontStyle.Bold) }; orVatHeader.Draw(page, new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orPayItems.Rows.Count + orORFooter.Rows.Count) * ROW_HEIGHT) + 20)); //Vat Detail var orVatDetail = new PdfGrid(); var orVatDetailData = new List <object>(); orVatDetail.Columns.Add(3); foreach (var vat in or.VatLines) { orVatDetailData.Add(new { Col1 = vat.Tax, Col2 = vat.AmountLessTax, Col3 = vat.TotalTaxAmount }); } orVatDetail.DataSource = orVatDetailData; orVatDetail.Headers.Clear(); foreach (var vat in orVatDetail.Rows) { vat.Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Left, LineAlignment = PdfVerticalAlignment.Middle }; vat.Cells[0].Style.Borders.All = PdfPens.Transparent; vat.Cells[1].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; vat.Cells[1].Style.Borders.All = PdfPens.Transparent; vat.Cells[2].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Right, LineAlignment = PdfVerticalAlignment.Middle }; vat.Cells[2].Style.Borders.All = PdfPens.Transparent; orVatDetail.Rows[orVatDetail.Rows.IndexOf(vat)].Height = ROW_HEIGHT; } orVatDetail.Draw(page, new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orPayItems.Rows.Count + orORFooter.Rows.Count + orVatHeader.Rows.Count) * ROW_HEIGHT) + 20)); #endregion #region Footer var orFooter = new PdfGrid(); var orFooterData = new List <object>(); orFooter.Columns.Add(1); orFooterData.Add(new { Col1 = "Terminal: " + or.Terminal }); orFooterData.Add(new { Col1 = "Customer: " + or.Customer }); orFooterData.Add(new { Col1 = "Served By: " + SettingsRepository.GetSettings().UserFullName }); orFooterData.Add(new { Col1 = HtmlToPlainText(SettingsRepository.GetSettings().ReceiptFooter) }); orFooter.DataSource = orFooterData; orFooter.Headers.Clear(); foreach (var footerMember in orFooter.Rows) { footerMember.Cells[0].StringFormat = new PdfStringFormat() { Alignment = PdfTextAlignment.Center, LineAlignment = PdfVerticalAlignment.Middle }; footerMember.Cells[0].Style.Borders.All = PdfPens.Transparent; orFooter.Rows[orFooter.Rows.IndexOf(footerMember)].Height = ROW_HEIGHT; } orFooter.Rows[orFooter.Rows.Count - 1].Height = 40; orFooter.Draw(page, new PointF(0, ((orHeader.Rows.Count + orLineItems.Headers.Count + orLineItems.Rows.Count + orPayItems.Rows.Count + orORFooter.Rows.Count + orVatHeader.Rows.Count) * ROW_HEIGHT) + 35)); #endregion var stream = new MemoryStream(); document.Save(stream); document.Close(true); DependencyService.Get <ISave>().Save("Official Receipt.pdf", "application/pdf", stream); Rg.Plugins.Popup.Services.PopupNavigation.Instance.PopAsync(); } } }