private SalaryTaxData GetSalaryData(int year, int month, Organization organization, int[] yearBreakpoints) { SalaryTaxData result = new SalaryTaxData(); Salaries salaries = Salaries.ForOrganization(organization, true); foreach (Salary salary in salaries) { if (salary.PayoutDate.Year == year && salary.PayoutDate.Month == month) { int employeeBirthYear = salary.PayrollItem.Person.Birthdate.Year; int ageBracket = 0; // main if (employeeBirthYear >= yearBreakpoints[2]) { ageBracket = 1; // youth rebate } else if (employeeBirthYear < yearBreakpoints[1]) { ageBracket = 2; // pensioners } result.Salary[ageBracket] += salary.GrossSalaryCents / 100.0; result.SalaryTotal += salary.GrossSalaryCents / 100.0; result.TaxSubtractiveTotal += salary.SubtractiveTaxCents / 100.0; result.TaxAdditive[ageBracket] += salary.AdditiveTaxCents / 100.0; result.TaxAdditiveTotal += salary.AdditiveTaxCents / 100.0; result.TaxTotal += salary.TaxTotalCents / 100.0; } } return(result); }
protected void Page_Load(object sender, EventArgs e) { string monthString = Request.QueryString["Month"]; if (String.IsNullOrEmpty(monthString)) { monthString = "201004"; } int year = Int32.Parse(monthString.Substring(0, 4)); int month = Int32.Parse(monthString.Substring(4)); // never mind input checking Organization organization = Organization.PPSE; monthString = new DateTime(year, month, 1).ToString("MMMM yyyy", new CultureInfo("sv-SE")); SalaryTaxData data = GetSalaryData(year, month, organization); Response.ContentType = "image/jpeg"; Image form = Image.FromFile(MapPath("/Data/ImageTemplates/salarytaxes-se.png")); using (Graphics graphics = Graphics.FromImage(form)) { StringFormat rightAlign = new StringFormat(); rightAlign.Alignment = StringAlignment.Far; Font fontHandwriting = new Font("Courier New", 64, FontStyle.Bold); Font fontPreprinted = new Font("Courier New", 30, FontStyle.Bold); Brush brushHandwriting = Brushes.Blue; Brush brushPreprinted = Brushes.Red; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.DrawString(organization.Name, fontPreprinted, brushPreprinted, 150, 170); graphics.DrawString(monthString, fontPreprinted, brushPreprinted, 680, 292); graphics.DrawString(monthString, fontPreprinted, brushPreprinted, 620, 1460); graphics.DrawString(String.Format("{0,4}-{1:D2}-{2:D2}", year, month + 1, 12), fontPreprinted, brushPreprinted, 820, 160); graphics.DrawString("802430-4514", fontPreprinted, brushPreprinted, 1110, 160); graphics.DrawString(data.SalaryTotal.ToString("F0"), fontHandwriting, brushHandwriting, 792, 358, rightAlign); // Salary total sub graphics.DrawString(data.SalaryTotal.ToString("F0"), fontHandwriting, brushHandwriting, 792, 558, rightAlign); // Salary total total graphics.DrawString(data.SalaryMain.ToString("F0"), fontHandwriting, brushHandwriting, 792, 692, rightAlign); // Salary age main graphics.DrawString(data.SalaryTotal.ToString("F0"), fontHandwriting, brushHandwriting, 792, 1524, rightAlign); // Salary total again graphics.DrawString(data.SalaryTotal.ToString("F0"), fontHandwriting, brushHandwriting, 792, 1725, rightAlign); // Salary total again graphics.DrawString(data.TaxAdditiveMain.ToString("F0"), fontHandwriting, brushHandwriting, 1510, 692, rightAlign); // Emp fee main graphics.DrawString(data.TaxAdditiveTotal.ToString("F0"), fontHandwriting, brushHandwriting, 1510, 1326, rightAlign); // Emp fee total graphics.DrawString(data.TaxSubtractive.ToString("F0"), fontHandwriting, brushHandwriting, 1510, 1525, rightAlign); // Deducted main graphics.DrawString(data.TaxSubtractive.ToString("F0"), fontHandwriting, brushHandwriting, 1510, 1726, rightAlign); // Deducted total graphics.DrawString(data.TaxTotal.ToString("F0"), fontHandwriting, brushHandwriting, 1510, 1793, rightAlign); // Tax cost total } using (Stream responseStream = Response.OutputStream) { form.Save(responseStream, ImageFormat.Jpeg); } }
private SalaryTaxData GetSalaryData(int year, int month, Organization organization) { SalaryTaxData result = new SalaryTaxData(); Salaries salaries = Salaries.ForOrganization(organization, true); foreach (Salary salary in salaries) { if (salary.PayoutDate.Year == year && salary.PayoutDate.Month == month) { result.SalaryTotal += salary.GrossSalaryCents / 100.0; result.SalaryMain += salary.GrossSalaryCents / 100.0; result.TaxSubtractive += salary.SubtractiveTaxCents / 100.0; result.TaxAdditiveMain += salary.AdditiveTaxCents / 100.0; result.TaxAdditiveTotal += salary.AdditiveTaxCents / 100.0; result.TaxTotal += salary.TaxTotalCents / 100.0; } } return(result); }
private SalaryTaxData GetSalaryData (int year, int month, Organization organization) { SalaryTaxData result = new SalaryTaxData(); Salaries salaries = Salaries.ForOrganization(organization, true); foreach (Salary salary in salaries) { if (salary.PayoutDate.Year == year && salary.PayoutDate.Month == month) { result.SalaryTotal += salary.GrossSalaryCents / 100.0; result.SalaryMain += salary.GrossSalaryCents / 100.0; result.TaxSubtractive += salary.SubtractiveTaxCents / 100.0; result.TaxAdditiveMain += salary.AdditiveTaxCents / 100.0; result.TaxAdditiveTotal += salary.AdditiveTaxCents / 100.0; result.TaxTotal += salary.TaxTotalCents / 100.0; } } return result; }
protected void Page_Load(object sender, EventArgs e) { string monthString = Request.QueryString["YearMonth"]; AuthenticationData authData = GetAuthenticationDataAndCulture(); Organization organization = authData.CurrentOrganization; int year = Int32.Parse(monthString.Substring(0, 4)); int month = Int32.Parse(monthString.Substring(4)); // never mind input checking int[] yearBreakpoints = { 1938, year - 65, year - 26 }; double[] taxRates = { 10.21, 15.49, 31.42 }; // will need to adapt this when some of the rates change SalaryTaxData data = GetSalaryData(year, month, organization, yearBreakpoints); Response.ContentType = "image/png"; int formVersion = 2015; if (year < 2015) { formVersion = 2010; } Dictionary <int, Dictionary <GraphicsElement, int> > coord = new Dictionary <int, Dictionary <GraphicsElement, int> >(); // Coordinates for various elements on the form versions coord[2010] = new Dictionary <GraphicsElement, int>(); coord[2015] = new Dictionary <GraphicsElement, int>(); coord[2010][GraphicsElement.LeftColumnX] = 775; coord[2010][GraphicsElement.RightColumnX] = 1492; coord[2015][GraphicsElement.LeftColumnX] = 800; coord[2015][GraphicsElement.RightColumnX] = 1512; coord[2010][GraphicsElement.AgeBracketMainY] = 694; coord[2010][GraphicsElement.AgeBracketDistY] = 67; coord[2015][GraphicsElement.AgeBracketMainY] = 770; coord[2015][GraphicsElement.AgeBracketDistY] = 65; coord[2010][GraphicsElement.SalaryY] = 360; coord[2010][GraphicsElement.SalaryTotalY] = 560; coord[2010][GraphicsElement.AdditiveTaxTotalY] = 1329; coord[2010][GraphicsElement.DeductedTaxY] = 1529; coord[2010][GraphicsElement.DeductedTaxTotalY] = 1727; coord[2010][GraphicsElement.SummaryTotalY] = 1795; coord[2015][GraphicsElement.SalaryY] = 440; coord[2015][GraphicsElement.SalaryTotalY] = 640; coord[2015][GraphicsElement.AdditiveTaxTotalY] = 1395; coord[2015][GraphicsElement.DeductedTaxY] = 1560; coord[2015][GraphicsElement.DeductedTaxTotalY] = 1759; coord[2015][GraphicsElement.SummaryTotalY] = 1825; Image form = Image.FromFile(MapPath(".") + "/MonthlyTaxForm-SE-" + formVersion + ".png"); // the "." says "in same folder as this file" CultureInfo swedishCulture = CultureInfo.CreateSpecificCulture("sv-SE"); monthString = new DateTime(year, month, 1).ToString("MMMM yyyy", swedishCulture); string orgNumber = authData.CurrentOrganization.GovernmentRegistrationId; string sansFontName = "Liberation Sans"; string courierFontName = "Liberation Mono"; int smallSize = 18; int regularSize = 24; int handWriteSize = 36; if (Debugger.IsAttached) { sansFontName = "Arial"; // yeahyeah... courierFontName = "Courier New"; orgNumber = "DEBUGGER ATTACHED"; smallSize = 24; regularSize = 30; handWriteSize = 48; } using (Graphics graphics = Graphics.FromImage(form)) { StringFormat rightAlign = new StringFormat(); rightAlign.Alignment = StringAlignment.Far; _fontHandwriting = new Font(sansFontName, handWriteSize, FontStyle.Bold); Font fontPreprinted = new Font(courierFontName, regularSize, FontStyle.Bold); Font fontPreprintedSmall = new Font(courierFontName, smallSize, FontStyle.Bold); Font fontPreprintedSans = new Font(sansFontName, regularSize, FontStyle.Bold); _brushHandwriting = Brushes.Blue; Brush brushPreprinted = Brushes.Red; Brush brushPreprintedDiscreet = Brushes.DarkRed; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.SmoothingMode = SmoothingMode.AntiAlias; // Draw the header and monthname - things to pay attention to when looking at cheat sheet if (year <= 2014) { graphics.DrawString(organization.Name, fontPreprinted, brushPreprinted, 150, 170); graphics.DrawString(monthString, fontPreprinted, brushPreprinted, 676, 288); graphics.DrawString(monthString, fontPreprinted, brushPreprinted, 610, 1455); graphics.DrawString(String.Format("{0,4}-{1:D2}-{2:D2}", year, month + 1, 12), fontPreprinted, brushPreprinted, 820, 160); graphics.DrawString(orgNumber, fontPreprinted, brushPreprinted, 1110, 160); // Draw the years and tax rates and other on-form constants more discreetly graphics.DrawString(taxRates[2].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 840, 729); graphics.DrawString(taxRates[1].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 840, 796); graphics.DrawString(taxRates[0].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 840, 863); graphics.DrawString(string.Format("{0} - {1}", yearBreakpoints[1], yearBreakpoints[2] - 1), fontPreprintedSmall, brushPreprintedDiscreet, 190, 729); graphics.DrawString(string.Format("{0} -", yearBreakpoints[2] - 1), fontPreprintedSmall, brushPreprintedDiscreet, 190, 796); graphics.DrawString(string.Format("{0}", yearBreakpoints[1] - 1), fontPreprintedSmall, brushPreprintedDiscreet, 250, 859); } else // the latest revision of the tax form { graphics.DrawString(organization.Name.ToUpperInvariant(), fontPreprinted, brushPreprinted, 840, 255); graphics.DrawString(monthString, fontPreprintedSans, brushPreprinted, 702, 363); graphics.DrawString(monthString, fontPreprintedSans, brushPreprinted, 639, 1485); graphics.DrawString(String.Format("{0,4}-{1:D2}-{2:D2}", year, month + 1, 12), fontPreprinted, brushPreprinted, 840, 180); graphics.DrawString(orgNumber, fontPreprinted, brushPreprinted, 1125, 180); // Draw the years and tax rates and other on-form constants more discreetly graphics.DrawString(taxRates[2].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 855, 798); graphics.DrawString(taxRates[1].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 855, 864); graphics.DrawString(taxRates[0].ToString("F2", swedishCulture), fontPreprintedSmall, brushPreprintedDiscreet, 855, 929); graphics.DrawString(string.Format("{0}-{1}", yearBreakpoints[1], yearBreakpoints[2] - 1), fontPreprintedSmall, brushPreprintedDiscreet, 215, 800); graphics.DrawString(string.Format("{0}-", yearBreakpoints[2]), fontPreprintedSmall, brushPreprintedDiscreet, 215, 866); graphics.DrawString(string.Format("1938-{0}", yearBreakpoints[1] - 1), fontPreprintedSmall, brushPreprintedDiscreet, 215, 932); } // Draw the actual numbers: First, salary totals DrawWrittenNumber(data.SalaryTotal, coord[formVersion][GraphicsElement.LeftColumnX], coord[formVersion][GraphicsElement.SalaryY], graphics); DrawWrittenNumber(data.SalaryTotal, coord[formVersion][GraphicsElement.LeftColumnX], coord[formVersion][GraphicsElement.SalaryTotalY], graphics); // Additive tax for (int ageBracket = 0; ageBracket <= 2; ageBracket++) { if (data.Salary[ageBracket] > 0.0) { DrawWrittenNumber(data.Salary[ageBracket], coord[formVersion][GraphicsElement.LeftColumnX], coord[formVersion][GraphicsElement.AgeBracketMainY] + coord[formVersion][GraphicsElement.AgeBracketDistY] * ageBracket, graphics); DrawWrittenNumber(data.TaxAdditive[ageBracket], coord[formVersion][GraphicsElement.RightColumnX], coord[formVersion][GraphicsElement.AgeBracketMainY] + coord[formVersion][GraphicsElement.AgeBracketDistY] * ageBracket, graphics); } } DrawWrittenNumber(data.TaxAdditiveTotal, coord[formVersion][GraphicsElement.RightColumnX], coord[formVersion][GraphicsElement.AdditiveTaxTotalY], graphics); // Deducted taxes DrawWrittenNumber(data.SalaryTotal, coord[formVersion][GraphicsElement.LeftColumnX], coord[formVersion][GraphicsElement.DeductedTaxY], graphics); DrawWrittenNumber(data.SalaryTotal, coord[formVersion][GraphicsElement.LeftColumnX], coord[formVersion][GraphicsElement.DeductedTaxTotalY], graphics); DrawWrittenNumber(data.TaxSubtractiveTotal, coord[formVersion][GraphicsElement.RightColumnX], coord[formVersion][GraphicsElement.DeductedTaxY], graphics); DrawWrittenNumber(data.TaxSubtractiveTotal, coord[formVersion][GraphicsElement.RightColumnX], coord[formVersion][GraphicsElement.DeductedTaxTotalY], graphics); // Grand total DrawWrittenNumber(data.TaxTotal, coord[formVersion][GraphicsElement.RightColumnX], coord[formVersion][GraphicsElement.SummaryTotalY], graphics); } // Write graphics buffer as PNG stream to Response object using (Stream responseStream = Response.OutputStream) { form.Save(responseStream, ImageFormat.Png); } }