Skip to content

Commit 4473ccd

Browse files
* sync 12/19/2023 version: 2024.1.2
1 parent f05b4bf commit 4473ccd

File tree

57 files changed

+7656
-93
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+7656
-93
lines changed

Extras/Core/FastReport.Data/FastReport.Data.Json/Shared.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<Import Project="..\Connections.props" />
99

1010
<ItemGroup>
11-
<PackageReference Include="Newtonsoft.Json" Version="[11.0.2,)" />
11+
<PackageReference Include="Newtonsoft.Json" Version="[13.0.3,)" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

Extras/Core/FastReport.Data/FastReport.Data.MongoDB/Shared.props

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="MongoDB.Bson" Version="[2.11.0,)" />
16-
<PackageReference Include="MongoDB.Driver" Version="[2.11.0,)" />
17-
<PackageReference Include="MongoDB.Driver.Core" Version="[2.11.0,)" />
15+
<PackageReference Include="MongoDB.Bson" Version="[2.20.0,)" />
16+
<PackageReference Include="MongoDB.Driver" Version="[2.20.0,)" />
17+
<PackageReference Include="MongoDB.Driver.Core" Version="[2.20.0,)" />
1818
</ItemGroup>
1919

2020
<ItemGroup>

Extras/Core/FastReport.Data/FastReport.Data.MsSql/Shared.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<Import Project="..\Connections.props" />
99

1010
<ItemGroup>
11-
<PackageReference Include="System.Data.SqlClient" Version="4.4.3" />
11+
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

Extras/Core/FastReport.Data/WPF.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<FastReportWPFProj>..\..\..\..\FastReport.WPF\FastReport.WPF.csproj</FastReportWPFProj>
1313
<FastReportWPFPackage>FastReport.WPF.Demo</FastReportWPFPackage>
1414

15-
<FastReportFormsWPFProj>..\..\..\..\..\FastReport.Forms.WPF\src\FastReport.Forms.WPF.csproj</FastReportFormsWPFProj>
15+
<FastReportFormsWPFProj>..\..\..\..\FastReport.Forms.WPF\src\FastReport.Forms.WPF.csproj</FastReportFormsWPFProj>
1616
<FastReportFormsWPFPackage>FastReport.Forms.WPF.Demo</FastReportFormsWPFPackage>
1717
</PropertyGroup>
1818

Extras/Core/FastReport.Plugin/FastReport.Plugins.WebP/Shared.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<Import Project="..\Plugins.props" />
99

1010
<ItemGroup>
11-
<PackageReference Include="SkiaSharp" Version="2.88.3" />
11+
<PackageReference Include="SkiaSharp" Version="2.88.6" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

FastReport.Base/Barcode/BarcodeObject.cs

+26-5
Original file line numberDiff line numberDiff line change
@@ -644,12 +644,33 @@ public override void GetData()
644644
}
645645
}
646646

647-
// without the second condition Text.StartsWith("SPC") the method will be executed for any QR
648-
// according to my observations, this does not break anything
647+
if (Barcode is BarcodeQR)
648+
{
649+
//QRData.Parse(Text);
650+
651+
//QRSwiss qRSwiss = new QRSwiss(Text);
652+
//Text = qRSwiss.Pack();
653+
654+
QRData qr = QRData.Parse(Text);
649655

650-
if (Barcode is BarcodeQR/* && Text.StartsWith("SPC")*/)
651-
{
652-
QRData.Parse(Text);
656+
if (qr is QRSwiss)
657+
{
658+
QRSwiss _qr = qr as QRSwiss;
659+
660+
QRSwissParameters parameters = new QRSwissParameters();
661+
parameters.Iban = _qr._Iban;
662+
parameters.Creditor = _qr.Creditor;
663+
parameters.Reference = _qr._Reference;
664+
parameters.AlternativeProcedure1 = _qr.AlternativeProcedure1;
665+
parameters.AlternativeProcedure2 = _qr.AlternativeProcedure2;
666+
parameters.AdditionalInformation = _qr._AdditionalInformation;
667+
parameters.Amount = _qr.Amount;
668+
parameters.Currency = _qr._Currency;
669+
parameters.Debitor = _qr.Debitor;
670+
QRSwiss swissQR = new QRSwiss(parameters);
671+
672+
Text = swissQR.Pack();
673+
}
653674
}
654675
}
655676
#endregion

FastReport.Base/Barcode/QRCode/QRData.cs

+93-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using FastReport.Utils;
22
using System;
33
using System.Collections.Generic;
4+
using System.Globalization;
5+
using System.Linq;
46
using System.Security.Policy;
57
using System.Text;
68
using System.Text.RegularExpressions;
@@ -704,7 +706,7 @@ class QRSwiss : QRData
704706
private Iban iban;
705707
private string amount;
706708
private Contact creditor, ultimateCreditor, debitor;
707-
private Currency currency;
709+
private string currency;
708710
private Reference reference;
709711
private AdditionalInformation additionalInformation;
710712
private MyRes res;
@@ -713,7 +715,7 @@ class QRSwiss : QRData
713715
public Contact Creditor { get { return creditor; } set { creditor = value; } }
714716
public Contact Debitor { get { return debitor; } set { debitor = value; } }
715717
public string Amount { get { return amount; } }
716-
public Currency _Currency { get { return currency; } set { currency = value; } }
718+
public string _Currency { get { return currency; } set { currency = value; } }
717719
public Reference _Reference { get { return reference; } set { reference = value; } }
718720
public AdditionalInformation _AdditionalInformation { get { return additionalInformation; } set { additionalInformation = value; } }
719721
public string AlternativeProcedure1 { get { return alternativeProcedure1; } set { alternativeProcedure1 = value; } }
@@ -743,11 +745,53 @@ public QRSwiss(QRSwissParameters parameters)
743745

744746
if (!String.IsNullOrEmpty(parameters.Amount))
745747
if (!parameters.Amount.StartsWith("[") || !parameters.Amount.EndsWith("]"))
746-
if (parameters.Amount.Length > 12)
747-
throw new SwissQrCodeException(res.Get("SwissAmountLength"));
748+
{
749+
//Amount has to use . as decimal separator in any case. See https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf page 27.
750+
decimal.TryParse(parameters.Amount, NumberStyles.Number, CultureInfo.InvariantCulture, out decimal decAmount);
751+
decimal roundedAmount = decimal.Round(decAmount, 2, MidpointRounding.AwayFromZero);
752+
753+
// if the parameters.Amount contains "0", or "0.", or ".0"
754+
if (Regex.IsMatch(parameters.Amount, @"^0(\.0+)?$"))
755+
{
756+
roundedAmount = 0m;
757+
}
758+
else
759+
{
760+
// If the rounded number is less than or equal to 0, then set it to the minimum allowed value
761+
if (roundedAmount <= 0)
762+
{
763+
roundedAmount = 0.01m;
764+
}
765+
766+
// If the rounded number is greater than 999999999.99, then set it to the maximum allowed value
767+
if (roundedAmount > 999999999.99m)
768+
{
769+
roundedAmount = 999999999.99m;
770+
}
771+
}
772+
773+
parameters.Amount = roundedAmount.ToString("0.00", CultureInfo.InvariantCulture);
774+
775+
// in theory, this check is no longer needed
776+
// if (parameters.Amount.Length > 12)
777+
// throw new SwissQrCodeException(res.Get("SwissAmountLength"));
778+
}
748779
this.amount = parameters.Amount;
749780

750-
this.currency = parameters.Currency.Value;
781+
switch (parameters.Currency)
782+
{
783+
case nameof(Currency.EUR):
784+
parameters.Currency = Currency.EUR.ToString();
785+
break;
786+
case nameof(Currency.CHF):
787+
parameters.Currency = Currency.CHF.ToString();
788+
break;
789+
default:
790+
if (!parameters.Currency.StartsWith("[") || !parameters.Currency.EndsWith("]"))
791+
parameters.Currency = Currency.EUR.ToString();
792+
break;
793+
}
794+
this.currency = parameters.Currency;
751795
this.debitor = parameters.Debitor;
752796

753797
if (iban.IsQrIban && parameters.Reference.RefType != Reference.ReferenceType.QRR)
@@ -799,17 +843,30 @@ public override void Unpack(string data)
799843
}
800844
counter += 7;
801845
if (!datas[counter].StartsWith("[") || !datas[counter].EndsWith("]"))
802-
amount = datas[counter] == String.Empty ? amount = null : Decimal.Parse(datas[counter].Replace('.', ',')).ToString();
846+
{
847+
//Amount has to use . as decimal separator in any case. See https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf page 27.
848+
string invariantSeparator = CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
849+
string clearQRSwissAmount = datas[counter].Replace(",", invariantSeparator).Replace("/", invariantSeparator);
850+
851+
decimal.TryParse(clearQRSwissAmount, NumberStyles.Number, CultureInfo.InvariantCulture, out decimal decAmount);
852+
amount = datas[counter] == String.Empty ? amount = null : decAmount.ToString(CultureInfo.InvariantCulture);
853+
}
803854
else amount = datas[counter] == String.Empty ? amount = null : datas[counter];
804855
counter++;
805856

806857
switch (datas[counter])
807858
{
808-
case "EUR":
809-
this.currency = Currency.EUR;
859+
case nameof(Currency.EUR):
860+
this.currency = Currency.EUR.ToString();
861+
break;
862+
case nameof(Currency.CHF):
863+
this.currency = Currency.CHF.ToString();
810864
break;
811-
case "CHF":
812-
this.currency = Currency.CHF;
865+
default:
866+
if (datas[counter].StartsWith("[") && datas[counter].EndsWith("]"))
867+
currency = datas[counter];
868+
else
869+
currency = Currency.EUR.ToString();
813870
break;
814871
}
815872
counter++;
@@ -837,10 +894,20 @@ public override void Unpack(string data)
837894
iban.TypeIban = Iban.IbanType.Iban;
838895
if (!String.IsNullOrEmpty(reference.ReferenceText))
839896
{
840-
if (reference.ChecksumMod10(reference.ReferenceText))
841-
reference._ReferenceTextType = Reference.ReferenceTextType.QrReference;
842-
else if (Regex.IsMatch(reference.ReferenceText, "^[a-zA-Z0-9 ]+$"))
843-
reference._ReferenceTextType = Reference.ReferenceTextType.CreditorReferenceIso11649;
897+
if (reference.ReferenceText.StartsWith("[") && reference.ReferenceText.EndsWith("]"))
898+
{
899+
if (reference.RefType == Reference.ReferenceType.QRR)
900+
reference._ReferenceTextType = Reference.ReferenceTextType.QrReference;
901+
else
902+
reference._ReferenceTextType = Reference.ReferenceTextType.CreditorReferenceIso11649;
903+
}
904+
else
905+
{
906+
if (reference.ChecksumMod10(reference.ReferenceText))
907+
reference._ReferenceTextType = Reference.ReferenceTextType.QrReference;
908+
else if (Regex.IsMatch(reference.ReferenceText, "^[a-zA-Z0-9 ]+$"))
909+
reference._ReferenceTextType = Reference.ReferenceTextType.CreditorReferenceIso11649;
910+
}
844911
}
845912

846913
if (!iban._Iban.StartsWith("[") || !iban._Iban.EndsWith("]"))
@@ -892,18 +959,8 @@ public override string Pack()
892959

893960

894961
//CcyAmtDate "logical" element
895-
//Amoutn has to use . as decimal seperator in any case. See https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf page 27.
896-
//SwissQrCodePayload += (amount != null ? amount.ToString().Replace(",", ".") : string.Empty) + br; //Amt
897962
if (amount != null)
898-
{
899-
string strAmount = amount;
900-
if (!strAmount.StartsWith("[") || !strAmount.EndsWith("]"))
901-
if (!strAmount.Contains("."))
902-
strAmount = amount.ToString().Replace(",", ".");
903-
else
904-
strAmount += ".00";
905-
SwissQrCodePayload += strAmount;
906-
}
963+
SwissQrCodePayload += amount;
907964
else
908965
SwissQrCodePayload += string.Empty;
909966
SwissQrCodePayload += br;
@@ -922,7 +979,17 @@ public override string Pack()
922979

923980
//RmtInf "logical" element
924981
SwissQrCodePayload += reference.RefType.ToString() + br; //Tp
925-
SwissQrCodePayload += (!string.IsNullOrEmpty(reference.ReferenceText) ? reference.ReferenceText : string.Empty) + br; //Ref
982+
if (!string.IsNullOrEmpty(reference.ReferenceText))
983+
{
984+
if (reference.ReferenceText.StartsWith("[") && reference.ReferenceText.EndsWith("]"))
985+
SwissQrCodePayload += reference.ReferenceText + br;
986+
else
987+
SwissQrCodePayload += new string(reference.ReferenceText.Where(c => char.IsLetterOrDigit(c)).ToArray()).ToUpper() + br; //Ref
988+
}
989+
else
990+
{
991+
SwissQrCodePayload += string.Empty + br; //Ref
992+
}
926993

927994

928995
//AddInf "logical" element

0 commit comments

Comments
 (0)