6 Commits

Author SHA1 Message Date
1e115bddee public list fertig gestellt 2023-08-02 19:24:48 +02:00
2f2524a5c4 public list fertig gestellt 2023-08-01 14:20:27 +02:00
f4a0af33b0 WIP public list 2023-07-25 09:24:18 +02:00
e44385473f Adresse parser aktualisiert
Es werden nun alle Bestellungen CSV dateien erstellt
ledig nicht alle Rechnungen werden angelegt.
2023-07-23 13:52:37 +02:00
324f01df5e Funktionstüchtig 2023-07-22 20:32:47 +02:00
19e6a43847 Remove old dependency 2023-07-17 19:12:19 +02:00
11 changed files with 242 additions and 52 deletions

View File

@@ -8,14 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RestSharp" Version="110.2.0" />
<PackageReference Include="Selenium.WebDriver" Version="4.10.0" />
</ItemGroup>
<ItemGroup>
<None Update="usedList.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -12,7 +12,6 @@ namespace CardmarketBot
{
private readonly string username;
private readonly string password;
private readonly IUsedRepository _usedRepository;
Dictionary<string, Helper.Porto> portoberechnung = new Dictionary<string, Helper.Porto>()
{
@@ -24,11 +23,10 @@ namespace CardmarketBot
{"3,20 €", Helper.Porto.PRIO270 },
};
public CardMarketParser(string username, string password, IUsedRepository repository)
public CardMarketParser(string username, string password)
{
this.username = username;
this.password = password;
_usedRepository = repository;
}
public List<Kunde> ParseCardMarket()
@@ -64,24 +62,22 @@ namespace CardmarketBot
List<string> ids = new List<string>();
List<Kunde> kunden = new List<Kunde>();
IWebElement element;
try
{
element = cd.FindElement(By.XPath("/html/body/main/section/div[3]/div[3]/div[2]"));
element = cd.FindElement(By.XPath("/html/body/main/section/div[3]/div[4]"));
string content = element.Text;
List<string> bereitsbearbeitet = _usedRepository.Query;
string[] datas = content.Split("\r\n");
for (int i = 0; i < datas.Length; i += 7)
for (int i = 8; i < datas.Length; i += 7)
{
if (bereitsbearbeitet.Find(x => x.Equals(datas[i])) != null) continue;
ids.Add(datas[i]);
}
}
}
catch(OpenQA.Selenium.NotFoundException ex)
{
@@ -91,8 +87,8 @@ namespace CardmarketBot
foreach (string id in ids)
{
Console.WriteLine(id);
//if (id != "1121844928") continue;
//Console.WriteLine(id);
cd.Navigate().GoToUrl(string.Format(@"https://www.cardmarket.com/de/OnePiece/Orders/{0}", id));
element = cd.FindElement(By.XPath("/html/body/main/section/div/div[1]/div/div[3]/div[2]/div[2]/div/div"));
@@ -113,7 +109,7 @@ namespace CardmarketBot
else
{
kunde.OverrideVersandskosten = element.Text;
Console.WriteLine(@"Achtung bei ID {id} wurde kein Richtige Porto berechnet. Liegt es im Ausland?");
Console.WriteLine($"Achtung bei ID {id} wurde kein Richtige Porto berechnet. Liegt es im Ausland?");
}
//kunde.Versandskosten = portoberechnung[element.Text];
kunde.BestellungID = id;
@@ -127,8 +123,9 @@ namespace CardmarketBot
kunden.Add(kunde);
Thread.Sleep(TimeSpan.FromSeconds(5));
Thread.Sleep(TimeSpan.FromSeconds(3));
}
cd.Quit();
return kunden;
}
}

View File

@@ -0,0 +1,118 @@
using ConsoleApp3.Contracts;
using OpenQA.Selenium.DevTools;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace CardMarketBot
{
internal class CheckSevDeskPublicList : ICheckSevDesk
{
private static readonly object _lock = new object();
private static bool _closed;
enum EResult
{
FAILED,
AVAIBLE,
OK,
WRITTEN
}
private static void Write(TcpClient client, string str)
{
try
{
SocketShutdown reason = SocketShutdown.Send;
lock (_lock)
{
BinaryWriter writer = new BinaryWriter(client.GetStream());
writer.Write(str);
if (_closed)
{
reason = SocketShutdown.Both;
}
}
//client.Client.Shutdown(reason);
}
catch (IOException e)
{
Console.WriteLine($"IOException writing to socket: {e.Message}");
}
}
private static EResult Read(TcpClient client)
{
try
{
//while(true)
//{
try
{
if (!client.Connected)
{
lock (_lock)
{
_closed = true;
//break;
}
}
BinaryReader reader = new BinaryReader(client.GetStream());
string res = reader.ReadString();
if (res.Contains("OK"))
return EResult.OK;
return EResult.FAILED;
}
catch (EndOfStreamException)
{
lock (_lock)
{
_closed = true;
}
return EResult.FAILED;
}
//client.Client.Shutdown(SocketShutdown.Receive);
//}
}
catch (IOException e)
{
Console.WriteLine(e.Message);
return EResult.FAILED;
}
}
public bool AlreadyKnown(string verkaufsnummer)
{
try
{
TcpClient client = new TcpClient("nas.cosysda.de", 4000);
Write(client, string.Format("#TEST#{0}", verkaufsnummer));
EResult result = Read(client);
client.Client.Shutdown(SocketShutdown.Both);
client.Close();
return result == EResult.OK;
}
catch(SocketException e)
{
throw new SocketException();
}
}
public bool Write(string verkaufsnummer)
{
TcpClient client = new TcpClient("nas.cosysda.de", 4000);
Write(client, string.Format("#WRITE#{0}", verkaufsnummer));
EResult result = Read(client);
client.Client.Shutdown(SocketShutdown.Both);
client.Close();
return result == EResult.OK;
}
}
}

View File

@@ -0,0 +1,8 @@
namespace ConsoleApp3.Contracts
{
internal interface ICheckSevDesk
{
bool AlreadyKnown(string verkaufsnummer);
bool Write(string verkaufsnummer);
}
}

View File

@@ -86,7 +86,7 @@ namespace ConsoleApp3.DataContracts
/// <value>time left for paying the invoice, use format dd.MM.yyyy or number for number of days left</value>
[DataMember(Name = "timeToPay", EmitDefaultValue = false)]
[JsonProperty(PropertyName = "timeToPay")]
public DateTime? TimeToPay { get; set; }
public int? TimeToPay { get; set; }
/// <summary>
///

View File

@@ -1,9 +1,13 @@
// See https://aka.ms/new-console-template for more information
using System.Diagnostics;
using System.Text.RegularExpressions;
static class Helper
{
public enum Porto
{
FAILED,
BRIEF085,
BRIEF100,
BRIEF160,
@@ -16,9 +20,9 @@ static class Helper
string[] datas = text.Split("\r\n");
string name = datas[0];
string adresseUNDHausnummer = datas[1];
string plzUNDOrt = datas[2];
string land = datas[3];
string adresseUNDHausnummer = datas[datas.Length-3];
string plzUNDOrt = datas[datas.Length-2];
string land = datas[datas.Length-1];
datas = plzUNDOrt.Split(" ");
string plz = datas[0];
@@ -26,13 +30,25 @@ static class Helper
datas = adresseUNDHausnummer.Split(" ");
string strasse = "";
for (int i = 0; i < datas.Length - 1; i++)
string hausnummer = "";
Trace.WriteLine(datas.Length);
if (datas.Length <= 1)
{
strasse += datas[i] + " ";
Regex myRegex = new Regex("[0-9]*$");
var matched = myRegex.Match(adresseUNDHausnummer);
strasse = adresseUNDHausnummer.Substring(0, matched.Index);
hausnummer = adresseUNDHausnummer.Substring(matched.Index);
}
else
{
for (int i = 0; i < datas.Length - 1; i++)
{
strasse += datas[i] + " ";
}
strasse = strasse.Trim();
hausnummer = datas[datas.Length - 1];
}
strasse = strasse.Trim();
string hausnummer = datas[datas.Length - 1];
return new Kunde(name, strasse, hausnummer, plz, ort, land);
}

View File

@@ -1,6 +1,7 @@
// See https://aka.ms/new-console-template for more information
using ConsoleApp3.DataContracts;
using System.Diagnostics;
/*
*
@@ -48,6 +49,12 @@ namespace CardmarketBot
{
List<ModelRechnung> result = new List<ModelRechnung>();
// 1 => Deutschland
// 2 => Schweiz
// 11 => Frankreich
foreach (Kunde kunde in kunden)
{
ModelRechnung temp = new ModelRechnung();
@@ -57,16 +64,16 @@ namespace CardmarketBot
//rechnung.InvoiceNumber = string.Format("RE-{0}", await GetNextInvoiceNumber()); => Should be done by services.
rechnung.InvoiceDate = kunde.Bezahldatum;
rechnung.Header = string.Format("Verkauf #{0}",kunde.BestellungID);
rechnung.HeadText = "Sehr geehrte Damen und Herren," +
"Wir stellen Ihnen für Ihre bestellung folgende Rechnung." +
"Bitte Beachte, dass der Lieferdatum die Bestelldatum entspricht.";
rechnung.HeadText = "Sehr geehrte Damen und Herren, " +
"wir stellen Ihnen für ihre Bestellung folgende Rechnung. " +
"Bitte Beachte, dass das Lieferdatum dem Bestelldatum entspricht.";
rechnung.FootText = "Ihre Rechnung ist bereits über Cardmarket beglichen worden.";
rechnung.TimeToPay = new DateTime(0);
rechnung.TimeToPay = 14;
rechnung.Discount = 0;
rechnung.Address = string.Format("{0}\n{1} {2}\n{3} {4}", kunde.Name, kunde.Strasse, kunde.Hausnummer, kunde.Plz, kunde.Ort); //"Damian Wessels\nDät Haartje 27A\n26683 Saterland";
rechnung.AddressCountry = new ModelStaticCountry()
{
Id = 1
Id = 2
};
//rechnung.PayDate = new DateTime(2019, 08, 24, 14, 15, 22);
rechnung.DeliveryDate = kunde.Bezahldatum;
@@ -110,14 +117,22 @@ namespace CardmarketBot
Id = null,
MapAll = true,
Quantity = 1,
Price = PortoPreis[kunde.Versandskosten],
Name = "Versandskosten",
PositionNumber = 0,
Discount = 0,
TaxRate = 19,
PriceGross = PortoPreis[kunde.Versandskosten],
PriceTax = 19
};
if(kunde.OverrideVersandskosten != null)
{
temp.InvoicePosSaves[temp.InvoicePosSaves.Length - 1].Price = Convert.ToDecimal(kunde.OverrideVersandskosten);
temp.InvoicePosSaves[temp.InvoicePosSaves.Length - 1].Price = Convert.ToDecimal(kunde.OverrideVersandskosten);
}
else
{
temp.InvoicePosSaves[temp.InvoicePosSaves.Length - 1].Price = PortoPreis[kunde.Versandskosten];
temp.InvoicePosSaves[temp.InvoicePosSaves.Length - 1].PriceGross = PortoPreis[kunde.Versandskosten];
}
result.Add(temp);
}

View File

@@ -11,6 +11,7 @@ class Kunde
string plz;
string ort;
string land;
List<Artikel> artikels = new List<Artikel>();
public DateTime Bezahldatum { get; set; }
@@ -48,5 +49,6 @@ class Kunde
plz = PLZ;
ort = Ort;
land = Land;
Versandskosten = Helper.Porto.FAILED;
}
}

View File

@@ -1,20 +1,30 @@
using ConsoleApp3.DataContracts;
using ConsoleApp3;
using ConsoleApp3.Contracts;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using OpenQA.Selenium.DevTools.V112.Network;
using OpenQA.Selenium.DevTools.V112.Debugger;
using CardMarketBot;
namespace CardmarketBot
{
internal class Programm
{
static void Main(string[] args)
{
IUsedRepository usedRepository = new UsedRepository();
ICheckSevDesk checkSevDesk = new CheckSevDeskPublicList();
// Kunden aus Cardmarket erstellen
List<Kunde> kunden = new List<Kunde>();
CardMarketParser cardMarketParser = new CardMarketParser("More-Tcg", "Magnatpower310!!", usedRepository);
CardMarketParser cardMarketParser = new CardMarketParser("More-Tcg", "Magnatpower310!!");
kunden = cardMarketParser.ParseCardMarket();
@@ -24,24 +34,44 @@ namespace CardmarketBot
InvoiceParser invoiceParser = new InvoiceParser(kunden);
rechnungen = invoiceParser.GetInvoices();
foreach (var item in rechnungen)
foreach (ModelRechnung item in rechnungen)
{
SevdeskService sevdeskService = new SevdeskService("7251554968610b78ca865b2b774b4134");
sevdeskService.Create(item);
var str_header = item.Invoice.Header;
if (str_header != null)
{
Regex regex = new Regex("[0-9]*$");
Match matched = regex.Match(str_header);
string verkaufnummer = str_header.Substring(matched.Index);
Console.Write($"Teste {verkaufnummer} : ");
if (checkSevDesk.AlreadyKnown(verkaufnummer))
{
Console.Write("wurde noch nicht in Sevdesk erfasst ");
SevdeskService sevdeskService = new SevdeskService("7251554968610b78ca865b2b774b4134");
sevdeskService.Create(item);
Console.WriteLine("nun in Sevdesk eingetragen");
checkSevDesk.Write(verkaufnummer);
}
else
{
Console.WriteLine("wurde bereits in Sevdesk erfasst, wird somit übersprungen. Jedoch wird PostCSV erstellt");
}
}
}
// Post CSV Erstellen
DeutschePost deutschePost = new DeutschePost(kunden);
deutschePost.GenerateCSV();
usedRepository.Insert(kunden);
Console.WriteLine("Fertig");
Console.ReadLine();
}
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CardMarketBot
{
internal class SocketClient
{
}
}

View File

@@ -1 +0,0 @@