Merge branch 'master' of ssh://float.ownsoft.de/git/beyondSoft/BeWo
This commit is contained in:
@@ -8,7 +8,6 @@
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<Button x:Name="ButtonOpenTranskriptionView" Click="ButtonOpenTranskriptionView_Click">
|
||||
|
||||
<Image
|
||||
Width="22"
|
||||
Height="22"
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace BeWo.AI.Controls
|
||||
set => SetValue(TargetTextBoxProperty, value);
|
||||
}
|
||||
|
||||
public bool HasRightToUseAIVoice
|
||||
public static bool HasRightToUseAIVoice
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -42,6 +42,7 @@ namespace BeWo.View.Detail.AI
|
||||
|
||||
item.IsSelected = false;
|
||||
}
|
||||
listBoxEdit1.UnSelectAll();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -1168,5 +1168,10 @@ namespace BeWo.View.Detail.Zeiterfassung
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btn_AiPromptbaustein_PromptAccepted(object sender, AiPromptbausteinPromptVM e)
|
||||
{
|
||||
ViewModel.EditPromptAccepted(sender, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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}");
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace BeWoPlanerMobil.Controllers
|
||||
return Logout();
|
||||
}
|
||||
|
||||
if(!_Model.HasRightToViewQuittierungsbelege)
|
||||
if(!Model.HasRightToViewQuittierungsbelege)
|
||||
{
|
||||
return RedirectToActionPermanent("Main", "Main");
|
||||
}
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
<span class="logoff-countdown m-0 p-0" id="countdown" onclick="countdownClick()"> </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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
114
Service/Reporting/Straffaelligenhilfe/AnnualReportFactory.cs
Normal file
114
Service/Reporting/Straffaelligenhilfe/AnnualReportFactory.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user