private static ITry <Amount, IEnumerable <string> > GetReportedValueV1(Dto.Archive archive) { var totals = archive.Totals.ToTry(_ => "Totals file not found.".ToEnumerable()); var data = totals.FlatMap(t => Try.Aggregate(t.Rows.Select(row => Parser.ParseDecimal(row.Values[3])))); return(data.FlatMap(values => Amount.Create(values.Sum(), "EUR"))); }
private static ITry <Amount, IEnumerable <string> > GetReportedValueV4(Dto.Archive archive) { var invoiceFooter = archive.InvoiceFooter.ToTry(_ => "Invoice footer file not found.".ToEnumerable()); var values = invoiceFooter.FlatMap(i => Try.Aggregate(i.Rows.Select(row => Parser.ParseAmount(row.Values[18])))); return(values.Map(v => Amount.Sum(v))); }
public static ITry <ArchiveMetadata, IEnumerable <string> > Create(Dto.Archive archive) { var rawMetadata = Try.Create <Dto.ArchiveMetadata, Exception>(_ => JsonConvert.DeserializeObject <Dto.ArchiveMetadata>(archive.Metadata.Content)); return(rawMetadata.MapError(_ => $"Invalid data ({archive.Metadata.Name}).".ToEnumerable()).FlatMap(metadata => { var version = metadata.Version.Match( "1.0", _ => Try.Success <ArchiveVersion, IEnumerable <string> >(ArchiveVersion.v100), "4.0", _ => Try.Success <ArchiveVersion, IEnumerable <string> >(ArchiveVersion.v400), _ => Try.Error <ArchiveVersion, IEnumerable <string> >("Archive version is not supported.".ToEnumerable()) ); var archiveType = version.FlatMap(v => v.Match( ArchiveVersion.v100, u => Try.Success <ArchiveType, IEnumerable <string> >(ArchiveType.Archiving), ArchiveVersion.v400, u => metadata.ArchiveType.Match( "DAY", _ => Try.Success <ArchiveType, IEnumerable <string> >(ArchiveType.Day), "MONTH", _ => Try.Success <ArchiveType, IEnumerable <string> >(ArchiveType.Month), "FISCALYEAR", _ => Try.Success <ArchiveType, IEnumerable <string> >(ArchiveType.FiscalYear), _ => Try.Error <ArchiveType, IEnumerable <string> >($"{nameof(Model.ArchiveType)} is not supported.".ToEnumerable()) ) )); var previousRecordSignature = metadata.PreviousRecordSignature.ToOption().Match( s => Signature.Create(s), _ => Try.Success <Signature, IEnumerable <string> >(null) ); return Try.Aggregate( version, previousRecordSignature, archiveType, (v, s, t) => new ArchiveMetadata(metadata.TerminalIdentification, s.ToOption(), metadata.Created, v, t) ); })); }
public static ITry <TaxSummary, IEnumerable <string> > Create(Dto.Archive archive, ArchiveVersion version) { return(version.Match( ArchiveVersion.v100, _ => GetV1TaxSummary(archive), ArchiveVersion.v400, _ => GetV4TaxSummary(archive) )); }
public static ITry <ReportedValue, IEnumerable <string> > Create(Dto.Archive archive, ArchiveVersion version) { var reportedValue = version.Match( ArchiveVersion.v100, _ => GetReportedValueV1(archive), ArchiveVersion.v400, _ => GetReportedValueV4(archive) ); return(reportedValue.Map(value => new ReportedValue(value))); }
public static ITry <Archive, IEnumerable <string> > Parse(Dto.Archive archive) { return(ArchiveMetadata.Create(archive).FlatMap(metadata => { return Try.Aggregate( TaxSummary.Create(archive, metadata.Version), ReportedValue.Create(archive, metadata.Version), Signature.Create(archive.Signature.Content), (taxSummary, reportedValue, signature) => new Archive(metadata, signature, taxSummary, reportedValue) ); })); }
private static ITry <TaxSummary, IEnumerable <string> > GetV4TaxSummary(Dto.Archive archive) { var invoiceFooter = archive.InvoiceFooter.ToTry(_ => "Invoice footer file not found.".ToEnumerable()); return(invoiceFooter.FlatMap(f => { var taxBreakdownNet = Try.Aggregate(f.Rows.Select(row => ParseLineTaxSummary(row.Values[1]))); var taxBreakdownTax = Try.Aggregate(f.Rows.Select(row => ParseLineTaxSummary(row.Values[2]))); return Try.Aggregate( taxBreakdownNet, taxBreakdownTax, (net, tax) => TaxSummary.Sum(net.Concat(tax)) ); })); }
private static ITry <TaxSummary, IEnumerable <string> > GetV1TaxSummary(Dto.Archive archive) { var taxTotals = archive.TaxTotals.ToTry(_ => "Tax totals file not found.".ToEnumerable()); var data = taxTotals.FlatMap(t => Try.Aggregate(t.Rows.Select(row => { return(Try.Aggregate( Parser.ParseDecimal(row.Values[4]), Parser.ParseDecimal(row.Values[10]).FlatMap(v => Amount.Create(v, "EUR")), (r, v) => (TaxRate: new TaxRate(r), TaxValue: v) )); }))); return(data.Map(lines => new TaxSummary(lines.GroupBy(l => l.TaxRate).ToDictionary( g => g.Key, g => Amount.Sum(g.Select(value => value.TaxValue)) )))); }