Billing: Create credit notes only for members who receive a payment
This commit is contained in:
@@ -80,7 +80,7 @@ namespace Elwig.Helpers.Billing {
|
|||||||
LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr)
|
LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr)
|
||||||
LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr)
|
LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr)
|
||||||
LEFT JOIN payment_custom x ON (x.year, x.mgnr) = (s.year, m.mgnr)
|
LEFT JOIN payment_custom x ON (x.year, x.mgnr) = (s.year, m.mgnr)
|
||||||
WHERE s.year = {Year} AND v.avnr = {AvNr};
|
WHERE s.year = {Year} AND v.avnr = {AvNr} AND p.amount > COALESCE(lp.amount, 0);
|
||||||
""");
|
""");
|
||||||
await cnx.ExecuteBatch($"""
|
await cnx.ExecuteBatch($"""
|
||||||
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
|
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
|
||||||
|
|||||||
@@ -138,58 +138,61 @@
|
|||||||
<RadioButton GroupName="Recipients" x:Name="RecipientsNonDeliveryMembersInput" Content="Nicht-Lieferanten der Saison"
|
<RadioButton GroupName="Recipients" x:Name="RecipientsNonDeliveryMembersInput" Content="Nicht-Lieferanten der Saison"
|
||||||
Margin="10,90,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="10,90,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
|
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
|
||||||
<RadioButton GroupName="Recipients" x:Name="RecipientsCustomInput" Content="Benutzerdefiniert"
|
<RadioButton GroupName="Recipients" x:Name="RecipientsCreditMembersInput" Content="Empfänger von Gutschriften"
|
||||||
Margin="10,110,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="10,110,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
|
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
|
||||||
|
<RadioButton GroupName="Recipients" x:Name="RecipientsCustomInput" Content="Benutzerdefiniert"
|
||||||
|
Margin="10,130,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
|
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
|
||||||
|
|
||||||
<Label Content="Zwst.:" x:Name="MemberBranchLabel" Margin="10,140,0,10"/>
|
<Label Content="Zwst.:" x:Name="MemberBranchLabel" Margin="10,160,0,10"/>
|
||||||
<ctrl:CheckComboBox x:Name="MemberBranchInput" AllItemsSelectedContent="Alle Stammzweigstellen" Delimiter=", " DisplayMemberPath="Name"
|
<ctrl:CheckComboBox x:Name="MemberBranchInput" AllItemsSelectedContent="Alle Stammzweigstellen" Delimiter=", " DisplayMemberPath="Name"
|
||||||
Margin="50,140,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
Margin="50,160,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
||||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||||
|
|
||||||
<Label Content="Gem.:" x:Name="MemberKgLabel" Margin="10,170,0,10"/>
|
<Label Content="Gem.:" x:Name="MemberKgLabel" Margin="10,190,0,10"/>
|
||||||
<ctrl:CheckComboBox x:Name="MemberKgInput" AllItemsSelectedContent="Alle Stammgemeinden" Delimiter=", " DisplayMemberPath="Name"
|
<ctrl:CheckComboBox x:Name="MemberKgInput" AllItemsSelectedContent="Alle Stammgemeinden" Delimiter=", " DisplayMemberPath="Name"
|
||||||
IsSelectAllActive="True" SelectAllContent="Alle Stammgemeinden"
|
IsSelectAllActive="True" SelectAllContent="Alle Stammgemeinden"
|
||||||
Margin="50,170,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
Margin="50,190,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
||||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||||
|
|
||||||
<Label Content="Bio-Betrieb:" x:Name="MemberOrganicLabel" Margin="10,200,0,10"/>
|
<Label Content="Bio-Betrieb:" x:Name="MemberOrganicLabel" Margin="10,220,0,10"/>
|
||||||
<RadioButton x:Name="MemberOrganicYesInput" Content="Ja" GroupName="MemberOrganic"
|
<RadioButton x:Name="MemberOrganicYesInput" Content="Ja" GroupName="MemberOrganic"
|
||||||
Margin="80,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="80,225,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
<RadioButton x:Name="MemberOrganicNoInput" Content="Nein" GroupName="MemberOrganic"
|
<RadioButton x:Name="MemberOrganicNoInput" Content="Nein" GroupName="MemberOrganic"
|
||||||
Margin="125,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="125,225,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
<RadioButton x:Name="MemberOrganicIndifferentInput" Content="Egal" GroupName="MemberOrganic"
|
<RadioButton x:Name="MemberOrganicIndifferentInput" Content="Egal" GroupName="MemberOrganic"
|
||||||
Margin="180,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="180,225,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
|
|
||||||
<Label Content="Funktionär:" x:Name="MemberFunktionärLabel" Margin="10,230,0,10"/>
|
<Label Content="Funktionär:" x:Name="MemberFunktionärLabel" Margin="10,250,0,10"/>
|
||||||
<RadioButton x:Name="MemberFunktionärYesInput" Content="Ja" GroupName="MemberFunktionär"
|
<RadioButton x:Name="MemberFunktionärYesInput" Content="Ja" GroupName="MemberFunktionär"
|
||||||
Margin="80,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="80,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
<RadioButton x:Name="MemberFunktionärNoInput" Content="Nein" GroupName="MemberFunktionär"
|
<RadioButton x:Name="MemberFunktionärNoInput" Content="Nein" GroupName="MemberFunktionär"
|
||||||
Margin="125,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="125,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
<RadioButton x:Name="MemberFunktionärIndifferentInput" Content="Egal" GroupName="MemberFunktionär"
|
<RadioButton x:Name="MemberFunktionärIndifferentInput" Content="Egal" GroupName="MemberFunktionär"
|
||||||
Margin="180,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
Margin="180,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
|
||||||
Checked="MemberInput_Checked"/>
|
Checked="MemberInput_Checked"/>
|
||||||
|
|
||||||
<Label Content="Vtrg.:" x:Name="MemberAreaComLabel" Margin="10,260,0,10"/>
|
<Label Content="Vtrg.:" x:Name="MemberAreaComLabel" Margin="10,280,0,10"/>
|
||||||
<ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId"
|
<ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId"
|
||||||
IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten"
|
IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten"
|
||||||
Margin="50,260,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
Margin="50,280,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
||||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||||
|
|
||||||
<Label Content="Tag:" x:Name="MemberDeliveryAncmtLabel" Margin="10,260,0,10"/>
|
<Label Content="Tag:" x:Name="MemberDeliveryAncmtLabel" Margin="10,280,0,10"/>
|
||||||
<ctrl:CheckComboBox x:Name="MemberDeliveryAncmtInput" AllItemsSelectedContent="Alle Lesepläne" Delimiter=", " DisplayMemberPath="Identifier"
|
<ctrl:CheckComboBox x:Name="MemberDeliveryAncmtInput" AllItemsSelectedContent="Alle Lesepläne" Delimiter=", " DisplayMemberPath="Identifier"
|
||||||
IsSelectAllActive="True" SelectAllContent="Alle Lesepläne"
|
IsSelectAllActive="True" SelectAllContent="Alle Lesepläne"
|
||||||
Margin="50,260,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
Margin="50,280,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
||||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||||
|
|
||||||
<ctrl:CheckComboBox x:Name="MemberCustomInput" AllItemsSelectedContent="Alle Mitglieder" Delimiter=", " DisplayMemberPath="AdministrativeName"
|
<ctrl:CheckComboBox x:Name="MemberCustomInput" AllItemsSelectedContent="Alle Mitglieder" Delimiter=", " DisplayMemberPath="AdministrativeName"
|
||||||
IsSelectAllActive="True" SelectAllContent="Alle Mitglieder"
|
IsSelectAllActive="True" SelectAllContent="Alle Mitglieder"
|
||||||
Margin="10,140,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
Margin="10,160,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
|
||||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ namespace Elwig.Windows {
|
|||||||
var name = s.Split(" – ")[^1];
|
var name = s.Split(" – ")[^1];
|
||||||
var pv = await ctx.PaymentVariants.SingleAsync(v => v.Year == Year && v.Name == name)!;
|
var pv = await ctx.PaymentVariants.SingleAsync(v => v.Year == Year && v.Name == name)!;
|
||||||
SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr)));
|
SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr)));
|
||||||
RecipientsDeliveryMembersInput.IsChecked = true;
|
RecipientsCreditMembersInput.IsChecked = true;
|
||||||
}
|
}
|
||||||
SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1;
|
SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1;
|
||||||
await UpdateRecipients(ctx);
|
await UpdateRecipients(ctx);
|
||||||
@@ -454,8 +454,11 @@ namespace Elwig.Windows {
|
|||||||
query = query.Where(m => m.Deliveries.Any(d => d.Year == Year));
|
query = query.Where(m => m.Deliveries.Any(d => d.Year == Year));
|
||||||
} else if (RecipientsNonDeliveryMembersInput.IsChecked == true) {
|
} else if (RecipientsNonDeliveryMembersInput.IsChecked == true) {
|
||||||
query = query.Where(m => m.IsActive && !m.Deliveries.Any(d => d.Year == Year));
|
query = query.Where(m => m.IsActive && !m.Deliveries.Any(d => d.Year == Year));
|
||||||
} else if (RecipientsActiveMembersInput.IsChecked == true && SelectedDocs.Any(d => d.Type == DocType.DeliveryConfirmation || d.Type == DocType.CreditNote)) {
|
} else if (RecipientsActiveMembersInput.IsChecked == true && SelectedDocs.Any(d => d.Type == DocType.DeliveryConfirmation || d.Type == DocType.CreditNote)) {
|
||||||
query = query.Where(m => m.IsActive || m.Deliveries.Any(d => d.Year == Year));
|
query = query.Where(m => m.IsActive || m.Deliveries.Any(d => d.Year == Year));
|
||||||
|
} else if (RecipientsCreditMembersInput.IsChecked == true) {
|
||||||
|
var avnrs = SelectedDocs.Where(d => d.Type == DocType.CreditNote).Select(d => (((int,int)?)d.Details)?.Item2).ToList();
|
||||||
|
query = query.Where(m => m.Credits.Any(c => c.Year == Year && avnrs.Contains(c.AvNr)));
|
||||||
} else {
|
} else {
|
||||||
query = query.Where(m => m.IsActive);
|
query = query.Where(m => m.IsActive);
|
||||||
}
|
}
|
||||||
@@ -756,7 +759,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
var hasPreviewDocs = memberDocs.Any(m => m.Docs.Any(d => d.Doc.IsPreview));
|
var hasPreviewDocs = memberDocs.Any(m => m.Docs.Any(d => d.Doc.IsPreview));
|
||||||
if (hasPreviewDocs) {
|
if (hasPreviewDocs) {
|
||||||
var res = MessageBox.Show("Einige der ausgewählten Dokumente sind nur als vorläufig zu betrachten und können daher nicht verschickt/ausgedruckt werden!\n\nDies könnte an einer noch nicht festgesetzen Auszahlungsvariante liegen.\n\nSoll mit dem Generieren fortgefahren werden?",
|
var res = MessageBox.Show("Einige der ausgewählten Dokumente sind nur als vorläufig zu betrachten und können daher nicht verschickt/ausgedruckt werden!\n\nDies könnte an einer noch nicht festgesetzen Auszahlungsvariante liegen oder daran, dass nicht alle Adressaten/Empfänger eine Traubengutschrift erhalten\n(\"Empfänger von Gutschriften\").\n\nSoll mit dem Generieren fortgefahren werden?",
|
||||||
"Vorläufige Dokumente", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
|
"Vorläufige Dokumente", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
|
||||||
if (res != MessageBoxResult.OK) {
|
if (res != MessageBoxResult.OK) {
|
||||||
UnlockInputs();
|
UnlockInputs();
|
||||||
@@ -1014,7 +1017,7 @@ namespace Elwig.Windows {
|
|||||||
var pv = ctx.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!;
|
var pv = ctx.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!;
|
||||||
SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr)));
|
SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr)));
|
||||||
SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1;
|
SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1;
|
||||||
RecipientsDeliveryMembersInput.IsChecked = true;
|
RecipientsCreditMembersInput.IsChecked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DocumentInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
private void DocumentInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
|
|||||||
Reference in New Issue
Block a user