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)));
        }
Пример #6
0
 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))
                                                        ))));
        }