Merge branch 'master' of ssh://float.ownsoft.de/git/beyondSoft/BeWo

This commit is contained in:
2026-03-16 13:41:15 +01:00
26 changed files with 347 additions and 124 deletions

View File

@@ -8,7 +8,6 @@
<RowDefinition />
</Grid.RowDefinitions>
<Button x:Name="ButtonOpenTranskriptionView" Click="ButtonOpenTranskriptionView_Click">
<Image
Width="22"
Height="22"

View File

@@ -45,7 +45,7 @@ namespace BeWo.AI.Controls
set => SetValue(TargetTextBoxProperty, value);
}
public bool HasRightToUseAIVoice
public static bool HasRightToUseAIVoice
{
get
{

View File

@@ -43,12 +43,12 @@
<TargetCulture>de-DE</TargetCulture>
<ProductName>BeWoPlaner</ProductName>
<PublisherName>ownSoft GmbH</PublisherName>
<MinimumRequiredVersion>2.0.1.290</MinimumRequiredVersion>
<MinimumRequiredVersion>2.0.1.292</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<TrustUrlParameters>true</TrustUrlParameters>
<ApplicationRevision>291</ApplicationRevision>
<ApplicationRevision>293</ApplicationRevision>
<ApplicationVersion>2.0.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>

View File

@@ -2,11 +2,11 @@
x:Class="BeWo.View.Controls.AI.AiPromptbausteinButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ai="clr-namespace:BeWo.View.Detail.AI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
xmlns:local="clr-namespace:BeWo.View.Controls.AI"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ai="clr-namespace:BeWo.View.Detail.AI"
x:Name="root"
mc:Ignorable="d">
<Grid>
@@ -22,12 +22,12 @@
</ResourceDictionary>
</StackPanel.Resources>
<Button
x:Name="btnOpenAi5"
Margin="3"
x:Name="btnOpenAi5"
Margin="0"
Click="btnOpenAi5_Click"
Style="{StaticResource PrimaryButton}"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
MouseRightButtonUp="btnOpenAi5_MouseRightButtonUp"
Style="{StaticResource PrimaryButton}"
ToolTip="KI Chat mit Prompt-Baustein starten"
ToolTipService.ShowOnDisabled="True">
<!--<Button.InputBindings>
@@ -38,23 +38,19 @@
</StackPanel>
<Popup
x:Name="popup_promptbaustein_all"
Width="600"
Height="400"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False"
Width="600"
Height="400">
<Border BorderThickness="1" x:Name="border_promptbaustein_al">
</Border>
StaysOpen="False">
<Border x:Name="border_promptbaustein_al" BorderThickness="1" />
</Popup>
<Popup
x:Name="popup_promptbaustein_favoriten"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False">
<Border BorderThickness="1" x:Name="border_promptbaustein_favoriten">
</Border>
<Border x:Name="border_promptbaustein_favoriten" BorderThickness="1" />
</Popup>
</Grid>
</UserControl>

View File

@@ -42,6 +42,7 @@ namespace BeWo.View.Detail.AI
item.IsSelected = false;
}
listBoxEdit1.UnSelectAll();
};
}

View File

@@ -138,7 +138,7 @@
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Bemerkungen:" />
<dxre:RichEditControl x:Name="richEditControl1" Grid.Column="0" Grid.Row="1" Height="300" Width="1000" CommandBarStyle="Empty" ActiveViewType="Simple" ShowBorder="False" HorizontalAlignment="Stretch" Margin="3" VerticalAlignment="Stretch" Content="{Binding RTFNotice, Converter={StaticResource rtfToContentConverter}}"/>
<dxre:RichEditControl x:Name="richEditControl1" Grid.Column="0" Grid.Row="1" Height="300" Width="1000" CommandBarStyle="Empty" ActiveViewType="Simple" ShowBorder="False" HorizontalAlignment="Stretch" Margin="3" VerticalAlignment="Stretch" Content="{Binding RTFNotice, Converter={StaticResource rtfToContentConverter}}" ReadOnly="True"/>
</Grid>
</Grid>

View File

@@ -16,6 +16,7 @@
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
xmlns:val="clr-namespace:BeWo.Validation"
xmlns:zeit="clr-namespace:BeWo.View.Detail.Zeiterfassung"
xmlns:ai="clr-namespace:BeWo.View.Controls.AI"
x:Name="root"
Width="Auto"
Height="Auto"
@@ -1507,7 +1508,8 @@
<StackPanel
x:Name="stackpanel_ai"
Grid.Row="1"
Grid.ColumnSpan="2"
Grid.ColumnSpan="2"
Margin="3,3,3,6"
HorizontalAlignment="Right"
DataContext=""
Orientation="Horizontal"
@@ -1521,23 +1523,23 @@
</StackPanel.Resources>
<Button
x:Name="btn_AiPromptbausteinUndo"
Padding="0"
Margin="3,0,0,0"
Command="{Binding UndoEditAiActionCommand}"
Style="{StaticResource ButtonPreviousStyle}"
Visibility="{Binding IsEditUndoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<Button
x:Name="btn_AiPromptbausteinRedo"
Padding="0"
Margin="3,0,3,0"
Command="{Binding RedoEditAiActionCommand}"
Style="{StaticResource ButtonRedoStyle}"
Visibility="{Binding IsEditRedoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<Button
x:Name="btn_AiPromptbaustein"
Padding="0"
Command="{Binding OpenEditAiPromptSelectionCommand}"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
Style="{StaticResource PrimaryButton}" />
<ai:AiPromptbausteinButton
Margin="3,0,0,0"
x:Name="btn_AiPromptbaustein"
ActionType="ServiceRecordDocumentation"
CanExecute="{Binding EditVM.Notice, Converter={StaticResource StringEmptyBoolConverter}}"
PromptAccepted="btn_AiPromptbaustein_PromptAccepted" />
</StackPanel>

View File

@@ -1168,5 +1168,10 @@ namespace BeWo.View.Detail.Zeiterfassung
}
}
}
private void btn_AiPromptbaustein_PromptAccepted(object sender, AiPromptbausteinPromptVM e)
{
ViewModel.EditPromptAccepted(sender, e);
}
}
}

View File

@@ -1161,13 +1161,14 @@
x:Name="lblEmployee"
Grid.Row="0"
Grid.Column="0"
Margin="0,3,0,0"
Content="{t:Translate MitarbeiterSingular}" />
<uc:PopUpEdit
x:Name="popupedit_employee"
Grid.Row="0"
Grid.Column="1"
Height="23"
Margin="3,0,3,3"
Margin="3,3,3,3"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Cursor="Arrow"
@@ -1415,7 +1416,7 @@
Grid.Column="1"
Grid.ColumnSpan="3"
Height="23"
Margin="3,0,3,3"
Margin="3,0,4,3"
AllowNullInput="False"
EditValue="{val:ValidationBinding Mode=TwoWay,
Path=PrototypeVM.EditStartDate}"
@@ -1477,7 +1478,7 @@
Grid.Row="2"
Grid.Column="3"
Height="23"
Margin="3,0,3,3"
Margin="3,0,4,3"
AllowNullInput="False"
EditValue="{Binding Path=PrototypeVM.Duration, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Increment="1"
@@ -1558,9 +1559,9 @@
x:Name="numerictb_distance"
Grid.Row="1"
Grid.Column="1"
Width="52"
Width="51"
Height="23"
Margin="3,0,3,3"
Margin="3,0,4,3"
AllowNullInput="False"
EditValue="{Binding Mode=TwoWay, Path=PrototypeVM.DistanceInMeter, UpdateSourceTrigger=PropertyChanged}"
Increment="1"
@@ -1648,7 +1649,10 @@
<TabControl
Grid.Row="12"
Grid.Column="0"
Grid.ColumnSpan="2">
Grid.ColumnSpan="2"
Margin="0,0,0,3"
BorderBrush="Black"
BorderThickness="1,1,0,1">
<TabItem
x:Name="TabItem1_Notice"
Background="AliceBlue"
@@ -1676,6 +1680,7 @@
FontFamily="Webdings"
IsTabStop="False" />
<Button
Width="23"
Margin="3"
HorizontalAlignment="Center"
Click="IncreaseFontSizeBtn_Click"
@@ -1692,8 +1697,10 @@
<StackPanel
Grid.Row="1"
Grid.ColumnSpan="4"
Margin="3,3,3,3"
HorizontalAlignment="Right"
Orientation="Horizontal">
Orientation="Horizontal"
Visibility="{Binding IsAiRowVisible, Converter={StaticResource BoolVisibilityConverter}}">
<StackPanel.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
@@ -1707,19 +1714,20 @@
Visibility="{Binding IsAiDocuButtonVisible, Converter={StaticResource BoolVisibilityConverter}}">
<Button
x:Name="btn_AiPromptbausteinUndo"
Padding="0"
Margin="3,0,3,0"
Command="{Binding UndoAiActionCommand}"
Style="{StaticResource ButtonPreviousStyle}"
Visibility="{Binding IsUndoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<Button
x:Name="btn_AiPromptbausteinRedo"
Padding="0"
Margin="3,0,0,0"
Command="{Binding RedoAiActionCommand}"
Style="{StaticResource ButtonRedoStyle}"
Visibility="{Binding IsRedoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<ai:AiPromptbausteinButton
x:Name="btn_AiPromptbaustein2"
Margin="3,0,0,0"
ActionType="ServiceRecordDocumentation"
CanExecute="{Binding PrototypeVM.Notice, Converter={StaticResource StringEmptyBoolConverter}}"
PromptAccepted="btn_AiPromptbaustein2_PromptAccepted" />
@@ -1756,6 +1764,7 @@
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="3"
Margin="0,3,0,0"
VerticalAlignment="Stretch"
AcceptsReturn="True"
AutoWordSelection="True"
@@ -1908,6 +1917,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
Margin="0,3,0,0"
VerticalAlignment="Stretch"
AcceptsReturn="True"
AutoWordSelection="True"
@@ -2049,6 +2059,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
Margin="0,3,0,0"
VerticalAlignment="Stretch"
AcceptsReturn="True"
AutoWordSelection="True"
@@ -2190,6 +2201,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
Margin="0,3,0,0"
VerticalAlignment="Stretch"
AcceptsReturn="True"
AutoWordSelection="True"
@@ -2330,6 +2342,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
Margin="0,3,0,0"
VerticalAlignment="Stretch"
AcceptsReturn="True"
AutoWordSelection="True"

View File

@@ -1189,10 +1189,10 @@ namespace BeWo.View.Detail.Zeiterfassung
serviceRecordEditView = new ServiceRecordEditView();
}
ViewModel.ResetEditAiAction();
popup_content.Child = serviceRecordEditView;
double height = MainControl.ActualHeight * 0.8;
double width = 810;

View File

@@ -79,6 +79,12 @@ namespace BeWo.ViewModel
FirePropertyChanged(nameof(Itself));
}
protected virtual void FirePropertyChanged(params string[] properties)
{
foreach (var p in properties)
FirePropertyChanged(PropertyChanged, this, p);
}
protected virtual void FirePropertyChanged(string pPropertyName)
{
FirePropertyChanged(PropertyChanged, this, pPropertyName);

View File

@@ -7,7 +7,7 @@ using System.Text;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using BeWo.AI.Controls;
using BeWo.Core;
using BeWo.Core.Commands;
using BeWo.Core.Service;
@@ -215,6 +215,10 @@ namespace BeWo.ViewModel.ListViewModel
_AiActionHistory = new List<string>();
_AiActionHistory.Add(AktuellerDokutext);
_AiActionHistoryIndex = 0;
_EditAiActionHistory = new List<string>();
_EditAiActionHistory.Add(AktuellerEditDokutext);
_EditAiActionHistoryIndex = 0;
}
public AiConversationButtonState AiConversationButtonState
@@ -249,6 +253,7 @@ namespace BeWo.ViewModel.ListViewModel
public bool IsAiModuleEnabled => (BeWoApp.AppSettings.ShowAI || BeWoApp.AppSettings.ShowAIVoice);
public bool IsAiChatButtonVisible => SelectedCustomerNode is object && IsAiModuleEnabled && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleServiceRecordChat);
public bool IsAiDocuButtonVisible => SelectedCustomerNode is object && IsAiModuleEnabled && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleServiceRecordDocu);
public bool IsAiRowVisible => IsAiDocuButtonVisible || VoiceToTextButtonControl.HasRightToUseAIVoice;
public bool IsAiDocuButtonCanExecute => !string.IsNullOrWhiteSpace(AktuellerDokutext);
public bool IsUndoButtonVisible => _AiActionHistoryIndex > 0;
public bool IsRedoButtonVisible => _AiActionHistoryIndex < _AiActionHistory.Count - 1;
@@ -506,6 +511,16 @@ namespace BeWo.ViewModel.ListViewModel
FirePropertyChanged(nameof(IsUndoButtonVisible));
}
public void ResetEditAiAction()
{
_EditAiActionHistory.Clear();
_EditAiActionHistory.Add(AktuellerDokutext);
_EditAiActionHistoryIndex = 0;
FirePropertyChanged(nameof(IsEditRedoButtonVisible));
FirePropertyChanged(nameof(IsEditUndoButtonVisible));
}
public Dictionary<TableID, long[]> GetVisibleInformationReferences(IEnumerable<ServiceRecordVM> selected_records)
{
var current = SelectedCustomerNode;
@@ -1080,8 +1095,7 @@ namespace BeWo.ViewModel.ListViewModel
lClickedNode.SupportConceptTreeNodeDC.CostBearer))
{
_SelectedCustomerNode = lClickedNode;
FirePropertyChanged(nameof(IsAiChatButtonVisible));
FirePropertyChanged(nameof(IsAiDocuButtonVisible));
FirePropertyChanged(nameof(IsAiChatButtonVisible), nameof(IsAiDocuButtonVisible), nameof(IsAiRowVisible));
CustomerNodes.Clear();
if (lClickedNode != null)

View File

@@ -101,7 +101,7 @@ namespace BeWo.ViewModel
{(r) => r == UserRightType.SupportConcept_ImportData, BeWoApp.AppSettings.ShowPersehImport},
//{(r) => r == UserRightType.AiChatInZeiterfassung, BeWoApp.AppSettings.ShowAI},
{IsAiModuleRight, BeWoApp.AppSettings.ShowAI},
{IsAiModuleSettingRight, BeWoApp.AppSettings.ModuleAiSettingsEnabled},
//{IsAiModuleSettingRight, BeWoApp.AppSettings.ModuleAiSettingsEnabled},
{(r) => r == UserRightType.AiVoiceView, BeWoApp.AppSettings.ShowAIVoice},
};
@@ -290,12 +290,12 @@ namespace BeWo.ViewModel
private static bool IsAiModuleRight(UserRightType right) =>
ContainsRight(right, UserRightType.AiModuleServiceRecordChat, UserRightType.AiModuleServiceRecordDocu, UserRightType.AiModulePromptbausteineEdit,
UserRightType.AiModulePromptbausteineView, UserRightType.AiModulePromptbausteinShare, UserRightType.AiVoiceView);
private static bool IsAiModuleSettingRight(UserRightType right) =>
ContainsRight(right);
//private static bool IsAiModuleSettingRight(UserRightType right) =>
// ContainsRight(right);
private static bool ContainsRight(UserRightType right, params UserRightType[] rightTypes)
{
return rightTypes.Length == 0 || rightTypes.Any(x => x == right);
return rightTypes.Length != 0 && rightTypes.Any(x => x == right);
}
protected override void InitByDataContract(UserGroupDC pDataContract)

View File

@@ -4,6 +4,7 @@ using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.Extensions.CustomInterfaces;
using DevExpress.Mvvm;
using DevExpress.Mvvm.POCO;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -43,7 +44,7 @@ namespace BeWo.ViewModel.View.AI
public bool IsFavorite { get; set; }
public ICommand SendCommand { get; set; }
public DelegateCommand SendCommand { get; set; }
public AiActionType AiActionType { get; set; }
@@ -52,8 +53,17 @@ namespace BeWo.ViewModel.View.AI
get => _SelectedFolder;
set
{
if (value == _SelectedFolder)
return;
_SelectedFolder = value;
FirePropertyChanged(nameof(SelectedFolder));
if(SelectedPrompt is object)
{
SelectedPrompt.IsSelected = false;
SelectedPrompt = null;
}
}
}
public AiPromptbausteinPromptVM SelectedPrompt
@@ -63,6 +73,7 @@ namespace BeWo.ViewModel.View.AI
{
_SelectedPrompt = value;
FirePropertyChanged(nameof(SelectedPrompt));
SendCommand.RaiseCanExecuteChanged();
}
}
public AiPromptbausteinFolderListVM Folders { get; private set; }

View File

@@ -75,7 +75,7 @@ namespace BeWoPlanerMobil.Controllers
FormsAuthentication.SetAuthCookie(LoggedInUser.LoginName, true);
ViewData[LoginErrorIndex] = string.Empty;
var keks = new HttpCookie(MobileSessionFacade.CookieName) { Value = MobileSessionFacade.Tenant, Expires = DateTime.Now.AddDays(1) };
var keks = new HttpCookie(MobileSessionFacade.CookieName) { Value = MobileSessionFacade.Tenant, Expires = DateTime.Now.AddDays(30), Secure = true, HttpOnly = true };
HttpContext.Response.SetCookie(keks);
var brauser = Request.Browser;
@@ -110,17 +110,20 @@ namespace BeWoPlanerMobil.Controllers
FormsAuthentication.SignOut();
}
var beWoCookie = HttpContext.Response.Cookies[MobileSessionFacade.CookieName];
if(beWoCookie != null)
{
var newCookie = new HttpCookie(MobileSessionFacade.CookieName)
{
Expires = DateTime.Now.AddDays(-1),
SameSite = SameSiteMode.Strict
};
//var beWoCookie = HttpContext.Response.Cookies[MobileSessionFacade.CookieName];
//if(beWoCookie != null)
//{
// var newCookie = new HttpCookie(MobileSessionFacade.CookieName)
// {
// Expires = DateTime.Now.AddDays(30),
// SameSite = SameSiteMode.Strict,
// Secure = true,
// HttpOnly = true
// };
Response.Cookies.Add(newCookie);
}
// Response.Cookies.Add(newCookie);
//}
Log.Info($"LoginController.Index(): Login failed! Tenant = {MobileSessionFacade.Tenant}");

View File

@@ -142,7 +142,7 @@ namespace BeWoPlanerMobil.Controllers
return Logout();
}
if(!_Model.HasRightToViewQuittierungsbelege)
if(!Model.HasRightToViewQuittierungsbelege)
{
return RedirectToActionPermanent("Main", "Main");
}

View File

@@ -361,7 +361,7 @@
<span class="logoff-countdown m-0 p-0" id="countdown" onclick="countdownClick()">&nbsp;</span>
</p>
</a>
<span class="logoff-countdown m-0 p-0">Version 3.27</span>
<span class="logoff-countdown m-0 p-0">Version 3.30</span>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive">
<span class="navbar-toggler-icon"></span>

View File

@@ -195,8 +195,6 @@ namespace BeWo.Data.Security
return "3.29";
if (isRightVersion330(r))
return "3.30";
if (isRightVersion3301(r))
return "3.30.1";
return BASE_VERSION;
}
@@ -240,14 +238,11 @@ namespace BeWo.Data.Security
//|| r == UserRightType.AiModulePromptbausteineSeeAll
|| r == UserRightType.AiModulePromptbausteineView
//|| r == UserRightType.AiModulePromptbausteineExecute
|| r == UserRightType.AiModulePromptbausteinShare
|| r == UserRightType.AiModuleServiceRecordChat
|| r == UserRightType.AiModuleServiceRecordDocu
|| r == UserRightType.AiVoiceView;
}
private static bool isRightVersion3301(UserRightType r)
{
return r == UserRightType.AiModulePromptbausteinShare ||
r == UserRightType.AiModuleServiceRecordChat ||
r == UserRightType.AiModuleServiceRecordDocu;
}
}
}

View File

@@ -11,6 +11,9 @@ namespace BeWo.Report.DefaultReports
{
public partial class FLSSollIstWeeklyReport : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<FLSSollIstReportRO>
{
private Dictionary<String, decimal> summeIstNachWochenString = new Dictionary<String, decimal>();
private Dictionary<String, decimal> diffNachWochenString = new Dictionary<String, decimal>();
public FLSSollIstWeeklyReport()
{
InitializeComponent();
@@ -27,12 +30,35 @@ namespace BeWo.Report.DefaultReports
wochen = pRO.RootObjectList[0].Groups[0].WochenSummen;
}
}
//Berechne Wochen Ist Gesamt
foreach (var ro in pRO.RootObjectList)
{
foreach (var grp in ro.Groups)
{
foreach (var woche in grp.WochenSummen)
{
String key = GetWochenKey(woche);
if (!summeIstNachWochenString.ContainsKey(key))
{
summeIstNachWochenString.Add(key, 0);
diffNachWochenString.Add(key, (woche.SollStunden ?? 0) * -1);
}
summeIstNachWochenString[key] += woche.IstStunden ?? 0;
diffNachWochenString[key] += woche.IstStunden ?? 0;
}
}
}
CreateTableCells(wochen);
this.bindingSource1.DataSource = pRO;
}
private String GetWochenKey(FLSSollIstReportRO.FLSSollIstWochenSummen woche)
{
return String.Format("KW {0}, {1:dd.MM.yy} - {2:dd.MM.yy}", woche.KalenderWoche, woche.WocheStart, woche.WocheEnde);
}
private void CreateTableCells(List<FLSSollIstReportRO.FLSSollIstWochenSummen> wochen)
{
xrTableHeader.BeginInit();
@@ -175,9 +201,19 @@ namespace BeWo.Report.DefaultReports
{
if (tag.Contains("Gesamt"))
{
var key = GetWochenKey(ws);
if (tag.Contains("Ist"))
{
cell.Text = String.Format("{0:0.00}", ws.IstStunden);
{
if (summeIstNachWochenString.ContainsKey(key))
{
cell.Text = String.Format("{0:0.00}", summeIstNachWochenString[key]);
}
else
{
cell.Text = String.Format("{0:0.00}", ws.IstStunden);
}
}
else if (tag.Contains("Soll"))
{
@@ -185,9 +221,15 @@ namespace BeWo.Report.DefaultReports
}
else if (tag.Contains("Diff"))
{
cell.Text = String.Format("{0:0.00}", ws.Differenz);
decimal diff = ws.Differenz ?? 0;
if (ws.Differenz < 0)
if (diffNachWochenString.ContainsKey(key))
{
diff = diffNachWochenString[key];
}
cell.Text = String.Format("{0:0.00}", diff);
if (diff < 0)
{
cell.ForeColor = System.Drawing.Color.Red;
}

View File

@@ -30,7 +30,7 @@ namespace PraxisPusteblume
public void SetReportDataSource(ServiceInvoiceRO pRO)
{
bool mq = false;
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
if (!String.IsNullOrEmpty(pRO.RecipientOrganisation))
{
if (pRO.RecipientOrganisation.Contains(" - IFS"))
@@ -66,7 +66,7 @@ namespace PraxisPusteblume
rtKopfIfs.Text = rtKopfIfs.Text.Replace("Jahnstraße 31, 83278 Traunstein", "Staudacher Str. 12, 83250 Marquartstein");
}
SetzePreise(pRO);
SetzePreise(pRO, mq);
if (pRO.ServiceInvoicePeriods != null && pRO.ServiceInvoicePeriods.Count > 0)
{
@@ -119,6 +119,10 @@ namespace PraxisPusteblume
if (sip.ServiceInvoiceItems != null && sip.ServiceInvoiceItems.Count > 0)
{
if (sip.Customer.LastName == "Achatz")
{
}
foreach (var i in sip.ServiceInvoiceItems)
{
if (i.ServiceDescription == null)
@@ -196,7 +200,7 @@ namespace PraxisPusteblume
return 0;
}
private void SetzePreise(ServiceInvoiceRO pRO)
private void SetzePreise(ServiceInvoiceRO pRO, bool istMQ)
{
decimal preisAmbulant = 58.24m;
decimal preisMobil = 78.08m;
@@ -240,7 +244,16 @@ namespace PraxisPusteblume
if (pRO.AccountingPeriodStart >= new DateTime(2024, 08, 01))
{
var preise = DAOFactory.GenericDAO.GetAllActive<Preis>();
preisInvest = GetPreis(preise, "Invest (MQ)", pRO.AccountingPeriodStart);
if (istMQ)
{
preisInvest = GetPreis(preise, "Invest (MQ)", pRO.AccountingPeriodStart);
}
else
{
preisInvest = GetPreis(preise, "Invest (TS)", pRO.AccountingPeriodStart);
}
preisTeam = GetPreis(preise, "Team", pRO.AccountingPeriodStart);
}
if (pRO.AccountingPeriodStart >= new DateTime(2025, 09, 01))

View File

@@ -92,6 +92,16 @@ namespace PraxisPusteblume.Invoicing
serviceInvoicePeriod.InvoiceItemList.Add(item);
}
List<int> vernetzung = new List<int> { 2, 3, 5, 9, 12 };
if (invoicePeriod.StartDateTime >= new DateTime(2025, 09, 01) && vernetzung.Contains(invoicePeriod.EndDate.Month))
{
var itemVernetzung = CreateVernetzungInvoiceItem(scap, invoicePeriod);
if (itemVernetzung != null)
{
serviceInvoicePeriod.InvoiceItemList.Add(itemVernetzung);
}
}
decimal count = 0;
foreach (var ii in serviceInvoicePeriod.InvoiceItemList)
{
@@ -106,15 +116,7 @@ namespace PraxisPusteblume.Invoicing
serviceInvoicePeriod.InvoiceItemList.Add(itemInvest);
}
}
List<int> vernetzung = new List<int> { 2, 3, 5, 9, 12 };
if (invoicePeriod.StartDateTime >= new DateTime(2025, 09, 01) && vernetzung.Contains(invoicePeriod.EndDate.Month))
{
var itemVernetzung = CreateVernetzungInvoiceItem(scap, invoicePeriod);
if (itemVernetzung != null)
{
serviceInvoicePeriod.InvoiceItemList.Add(itemVernetzung);
}
}
}
}

View File

@@ -170,7 +170,7 @@ namespace BeWo.Service.Plugins
//t = "7803602698"; // Taubblindendienst
//t = "5518600303"; // Wetterleuchten e.V.
//t = "4096649015"; // AWO Dortmund
//t = "3614251071"; // Pusteblume
t = "3614251071"; // Pusteblume
//t = "7755740484"; // Sawo
//t = "8275654834"; // Twg Jonathan
//t = "6586058528"; // Freundeskreis Suchtkrankenhilfe e.V. (FFS)
@@ -427,7 +427,8 @@ namespace BeWo.Service.Plugins
//st = "6095094585"; // IBAHS e.V.
//t = "9453919144"; // Beratung am Stadtwald - Lisa Maria Reeh
//t = "5960095273"; // Flexible Jugendarbeit Frankfurt (Oder) e.V.
t = "6664235818"; // PariMobil gGmbH Krefeld
//t = "6664235818"; // PariMobil gGmbH Krefeld
return t;
#else
if (MultitenancyOperationContextExt.Current != null)

View File

@@ -35,7 +35,7 @@ namespace BeWo.Service.Plugins
{
if (!containsDatumCheck)
{
var val = CheckDate(c2s.StartDate, c2s.EndDate);
var val = CheckDate(c2s.StartDate, c2s.EndDate, c2s, null);
if (val != null)
{
result.Add(val);
@@ -48,7 +48,7 @@ namespace BeWo.Service.Plugins
{
if (!containsDatumCheck)
{
val = CheckDate(ap.StartDate, ap.EndDate);
val = CheckDate(ap.StartDate, ap.EndDate, c2s, ap);
if (val != null)
{
result.Add(val);
@@ -66,12 +66,17 @@ namespace BeWo.Service.Plugins
return result;
}
private ValidationResultDC CheckDate(DateTime? start, DateTime? end)
private ValidationResultDC CheckDate(DateTime? start, DateTime? end, SupportConceptCostBearerRelDC c2s, SupportConceptApprovalPeriodDC scap)
{
if (start.HasValue && end.HasValue && start > end)
{
ValidationResultDC resultDc = new ValidationResultDC();
resultDc.Message = "Das Startdatum darf nicht größer als das Enddatum sein.";
if (scap == null)
{
}
resultDc.AllowSave = false;
return resultDc;
}

View File

@@ -0,0 +1,114 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Services;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using Castle.Components.DictionaryAdapter;
using NHibernate.Linq;
namespace BeWo.Service.Reporting.Straffaelligenhilfe
{
public class StatisticBase
{
protected DateTime StartDate { get; set; }
protected DateTime EndDate { get; set; }
protected Dictionary<long, Customer> CustomerByOid { get; set; }
public virtual List<AnnualReportDC> CreateStatistic(DateTime startDate, DateTime endDate)
{
StartDate = startDate;
EndDate = endDate;
CustomerByOid = new Dictionary<long, Customer>();
var reports = new List<AnnualReportDC>();
LoadData();
Dictionary<long, int> customerOid2Days = new Dictionary<long, int>();
StringBuilder sb = new StringBuilder();
foreach (var customerOid in CustomerByOid.Keys)
{
Customer customer = CustomerByOid[customerOid];
ProcessCustomer(customer);
}
return reports;
}
public virtual void LoadData()
{
foreach (var customer in DAOFactory.GenericDAO.GetAllActiveAndArchived<Customer>())
{
if (ShouldProcessCustomer(customer))
{
if (!CustomerByOid.ContainsKey(customer.Oid.Value))
{
CustomerByOid.Add(customer.Oid.Value, customer);
}
}
}
}
public virtual void ProcessCustomer(Customer customer)
{
}
public virtual bool ShouldProcessCustomer(Customer customer)
{
if (customer .IsActive != ActivationTypeId.Deleted)
{
//if (CustomerBelongsToTeam(customer, TeamOid) &&
// IsCustomerOfCustomerCareType(customer, CustomerCareTypeValueListEntryOid))
//{
return true;
//}
}
return false;
}
public virtual bool IsCustomerOfCustomerCareType(Customer customer, long? customerCareTypeValueListEntryOid)
{
bool val = true;
if (customerCareTypeValueListEntryOid.HasValue)
{
val = false;
foreach (var v in customer.ValueList)
{
if (v.Entry.Type == ValueListEntryType.CustomerCareType && v.Entry.Oid == customerCareTypeValueListEntryOid)
return true;
}
}
return val;
}
public virtual bool CustomerBelongsToTeam(Customer customer, long? teamOid)
{
bool val = true;
if (teamOid.HasValue)
{
val = false;
foreach (var t2c in customer.Team2CustomerList)
{
if (t2c.TeamOid == teamOid)
return true;
}
}
return val;
}
}
}

View File

@@ -515,6 +515,7 @@
<Compile Include="Reporting\JahresBerichtNachAlter.cs" />
<Compile Include="Reporting\AnnualReportFilter.cs" />
<Compile Include="Reporting\AnnualReportFactory.cs" />
<Compile Include="Reporting\Straffaelligenhilfe\AnnualReportFactory.cs" />
<Compile Include="SBD\VertretungsAlgorithmus.cs" />
<Compile Include="SBD\VertretungsManager.cs" />
<Compile Include="Security\SecurityBehaviorExtension.cs" />

View File

@@ -460,45 +460,43 @@ namespace BeWo.Service.ServiceImplementations
if (sha256 == "B2-FF-FF-CA-3E-DD-8F-8C-10-5A-05-C7-1F-EB-09-AF-3B-9B-DF-C7-B7-C2-6D-CC-34-56-17-DD-F3-28-B5-B1")
{
//Hier einkommentieren wenn PIN aktiviert werden soll
//Hier einkommentieren wenn PIN aktiviert werden soll
//if (!String.IsNullOrEmpty(pPIN) && pPIN.IndexOf('_') >= 0)
//{
// pin = pPIN.Substring(0, pPIN.IndexOf('_'));
// computerName = pPIN.Substring(pPIN.IndexOf('_') + 1);
//}
//var pins = DAOFactory.GenericDAO.GetAll<SupportPin>();
//var y = pins.Where(p => p.Pin.Equals(pin)).ToList();
if (!String.IsNullOrEmpty(pPIN) && pPIN.IndexOf('_') >= 0)
{
pin = pPIN.Substring(0, pPIN.IndexOf('_'));
computerName = pPIN.Substring(pPIN.IndexOf('_') + 1);
}
var pins = DAOFactory.GenericDAO.GetAll<SupportPin>();
var y = pins.Where(p => p.Pin.Equals(pin)).ToList();
//if (y.Count == 0)
//{
// result = UserValidationResult.IncorrectPin;
// valid = false;
//}
//else
//{
// supportPIN = y[0];
// if (supportPIN.IsUsed.Value ||
// supportPIN.ExpirationDate < DateTime.Now ||
// supportPIN.UsingDate != null)
// {
// if (supportPIN.IsUsed.HasValue && supportPIN.IsUsed.Value)
// result = UserValidationResult.PinAlreadyUsed;
// else if (supportPIN.ExpirationDate < DateTime.Now)
// result = UserValidationResult.PinExpired;
// valid = false;
// }
// else
// {
// supportPIN.IsUsed = true;
// supportPIN.UsingDate = DateTime.Now;
// supportPIN.Notice = computerName;
// }
//}
if (y.Count == 0)
{
result = UserValidationResult.IncorrectPin;
valid = false;
}
else
{
supportPIN = y[0];
if (supportPIN.ExpirationDate < DateTime.Now)
{
//if (supportPIN.IsUsed.HasValue && supportPIN.IsUsed.Value)
// result = UserValidationResult.PinAlreadyUsed;
//else if (supportPIN.ExpirationDate < DateTime.Now)
result = UserValidationResult.PinExpired;
valid = false;
}
else
{
supportPIN.IsUsed = true;
supportPIN.UsingDate = DateTime.Now;
supportPIN.Notice = computerName;
}
}
//Bis hier einkommentieren
}
//Bis hier einkommentieren
}
}
if (!result.HasValue)
@@ -846,6 +844,8 @@ namespace BeWo.Service.ServiceImplementations
{
try
{
//pSupportPin.ExpirationDate = DateTime.Now.AddDays(3);
var lSupportPin = MapperFactory.SupportPinDC_SupportPin.MapToNewEntity(pSupportPin);
DAOFactory.GenericDAO.Insert(lSupportPin);
return lSupportPin.Oid.Value;