Files
FA/TofasIdocToEdiInvoice/EdiInvoiceGenerator.cs
2024-07-16 13:42:52 +02:00

89 lines
4.7 KiB
C#

using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Xml.Serialization;
using TofasIdocToEdiInvoice.Edifact;
namespace TofasIdocToEdiInvoice
{
internal class EdiInvoiceGenerator
{
public void Process()
{
string filename =
"C:\\Users\\pkus\\Desktop\\Invoices\\O_500_0000000002045042.txt" /*Console.ReadLine()?.Trim('"')*/;
string outFilename =
Path.Combine(AppContext.BaseDirectory, $"{DateTime.Now:yyyyMMddHHmmssffff}_INVOICE.edi");
string xml = File.ReadAllText(filename, Encoding.UTF8);
XmlSerializer serializer = new XmlSerializer(typeof(INVOIC01));
using StringReader reader = new StringReader(xml);
INVOIC01 invoice = (INVOIC01)serializer.Deserialize(reader)!;
EdifactGenerator edifact = new EdifactGenerator();
edifact.CreateHeader();
edifact.AddLine("UNB", new Group("UNOC", 3), new Group(invoice.IDOC.EDIDC40.SNDPRN),
new Group(invoice.IDOC.EDIDC40.RCVPFC),
new Group(DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HHmm")),
new Group(invoice.IDOC.EDIDC40.DOCNUM), null, new Group("INVOIC"));
edifact.AddLine("UNH", new Group("1"), new Group("INVOIC", "D", "96A", "UN"));
edifact.AddLine("BGM", new Group("380", invoice.IDOC.EDIDC40.DOCNUM, 9));
edifact.AddLine("DTM", new Group("137", invoice.IDOC.EDIDC40.CREDAT, 102));
edifact.AddLine("NAD", new Group("BY"), new Group(invoice.IDOC.EDIDC40.RCVPFC, null, 9));
edifact.AddLine("NAD", new Group("SE"), new Group(invoice.IDOC.E1EDKA1.First(x => x.PARVW == "RS").PARTN),
null, null, null, null, null, null, new Group("KR"));
edifact.AddLine("CUX", new Group(2, invoice.IDOC.E1EDK01.CURCY, 4));
edifact.AddLine("TDT", new Group("12"), new Group(invoice.IDOC.E1EDK29.FirstOrDefault()?.EXNUM),
new Group("T") /*ToConfirm*/);
edifact.AddLine("TOD", new Group(6), null, new Group("CIF"));
edifact.AddLine("PAC", new Group(invoice.IDOC.E1EDP01.Count), null, new Group(invoice.IDOC.E1EDP01.FirstOrDefault()?.MENEE));
edifact.AddLine("MEA", new Group("WT"), new Group("G"),
new Group(invoice.IDOC.E1EDP01.FirstOrDefault()?.GEWEI),
new Group(invoice.IDOC.E1EDP01.Sum(x => decimal.Parse(x.BRGEW, new CultureInfo("en-us")))));
edifact.AddLine("MEA", new Group("WT"), new Group("N"),
new Group(invoice.IDOC.E1EDP01.FirstOrDefault()?.GEWEI),
new Group(invoice.IDOC.E1EDP01.Sum(x => decimal.Parse(x.NTGEW, new CultureInfo("en-us")))));
int itemCounter = 0;
decimal totalPrice = 0M;
foreach (E1EDP01 item in invoice.IDOC.E1EDP01)
{
totalPrice += decimal.Parse(item.E1EDP26.First(x => x.QUALF == "001").BETRG, new CultureInfo("en-us"));
edifact.AddLine("LIN", new Group(++itemCounter), null, new Group(item.POSEX, "BP"));
edifact.AddLine("PIA", new Group(1), new Group(item.POSEX, "SA", null, 92));
edifact.AddLine("AMD", new Group("F"), new Group("ANM"), new Group(null, null, 9, item.POSEX));
edifact.AddLine("MEA", new Group("AAI"), new Group("G"), new Group(item.GEWEI),
new Group(invoice.IDOC.E1EDP01.Sum(x => decimal.Parse(x.BRGEW, CultureInfo.InvariantCulture))));
edifact.AddLine("MEA", new Group("AAI"), new Group("N"), new Group(item.GEWEI),
new Group(invoice.IDOC.E1EDP01.Sum(x => decimal.Parse(x.NTGEW, new CultureInfo("en-us")))));
edifact.AddLine("QTY", new Group("47", item.MENGE, item.MENEE));
edifact.AddLine("FTX", new Group("ZZZ"), null, null, new Group(item.POSEX));
edifact.AddLine("MOA",
new Group(203,
double.Parse(item.E1EDP26.First(x => x.QUALF == "001").BETRG, new CultureInfo("en-us"))));
edifact.AddLine("PRI",
new Group("AAA",
double.Parse(item.E1EDP26.First(x => x.QUALF == "002").BETRG, new CultureInfo("en-us"))));
edifact.AddLine("UNS", new Group("S"));
}
var pr = ConvertDecimal(totalPrice);
edifact.AddLine("MOA", new Group("77", pr));
edifact.CreateFooter();
edifact.Parse(outFilename);
}
private string ConvertDecimal(decimal value)
{
string replace = value.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
return replace;
}
}
}