Files
Common-VS2019/SacsStandardDbas/Dbas/ItemDocs/SaItemDocConsole_Dbas.cs
T
2025-02-08 16:41:25 +00:00

237 lines
8.3 KiB
C#

using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.ItemDocs;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemDocs
{
//=======================================================================
public abstract class SaItemDocConsole_Dbas : SaItemDocConsole
{
//-------------------------------------------------------------------
// Data members.
private SaItemDocMgr_Dbas itemDocMgr = null;
private readonly List<TypeCodeDesc> categories = new List<TypeCodeDesc>();
private readonly List<String> favouriteFolders = new List<string>();
private readonly List<String> recentFolders = new List<string>();
//-------------------------------------------------------------------
// Static initialisation.
static SaItemDocConsole_Dbas()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaItemDocConsole_Dbas(ISacsDatabase database)
{
Database = database;
itemDocMgr = new SaItemDocMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal ISacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return itemDocMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return itemDocMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// I t e m D o c s
//-------------------------------------------------------------------
// Category codes.
public override List<TypeCodeDesc> GetCategoryCodes()
{
if (categories.Count < 1)
{
categories.Add(Category.Folder, "FLD", "Folder");
categories.Add(Category.Document, "DOC", "Document");
categories.Add(Category.Image, "IMG", "Image");
categories.Add(Category.FileSpec, "FSP", "File spec (generic)", "Allows wildcards");
}
return categories;
}
/// <summary>eg. for 'Image' documents.</summary>
public override List<CodeDesc> GetCategoryTypeCodes(Category category)
{
return new List<CodeDesc>();
}
//-------------------------------------------------------------------
// 'Recent' and 'Favourite' folders - to populate drop-down list when selecting folder:
/// <summary>How many recent foldes to retain? [default:5]</summary>
public override int GetMaxRecentFolderCount()
{
return 5;
}
/// <summary>List of favourites to always include in dropdown.</summary>
public override void SetFavouriteFolders(List<String> folders)
{
favouriteFolders.Clear();
favouriteFolders.AddRange(folders);
}
/// <summary>Mix of recent and favourites.</summary>
public override List<String> GetSuggestedFolders()
{
List<String> folders = new List<string>();
folders.AddRange(favouriteFolders);
folders.AddRange(recentFolders);
folders.RemoveBlanks();
folders.RemoveDuplicatesCI();
return folders;
}
//-------------------------------------------------------------------
// Retrieve list of docs that match the specified params.
public override bool ItemDocsExist(SaItemDoc.Params prmItemDoc)
{
ClearErrorState();
return (itemDocMgr.GetItemDocCount(prmItemDoc) > 0);
}
public override List<SaItemDoc> GetItemDocs(SaItemDoc.Params prmItemDoc)
{
ClearErrorState();
return itemDocMgr.GetItemDocList(prmItemDoc);
}
//-------------------------------------------------------------------
// Create a new document.
public override SaItemDoc CreateItemDoc(ItemId itemId, Category category)
{
ClearErrorState();
return itemDocMgr.CreateItemDoc(itemId, category);
}
//-------------------------------------------------------------------
// Store documents:
public override bool StoreItemDoc(SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!SysId.IsValid(itemDoc.Id))
{
if (!itemDocMgr.InsertItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
}
else
{
if (!itemDocMgr.UpdateItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
}
if (!StringUtil.IsEmpty(itemDoc.Folder))
{
// Update recent folder list.
recentFolders.RemoveAllCI(itemDoc.Folder);
recentFolders.Insert(0, itemDoc.Folder);
while (recentFolders.Count > GetMaxRecentFolderCount())
recentFolders.RemoveAt(recentFolders.Count - 1);
}
return OK;
}
public override bool StoreItemDocs(List<SaItemDoc> itemDocs, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
foreach (SaItemDoc itemDoc in itemDocs)
{
if (!StoreItemDoc(itemDoc, dbUpdateInfo)) return false;
}
return true;
}
public override bool RemoveItemDoc(SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDocMgr.DeleteItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
return OK;
}
public override bool ClearItemDocs(ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDocMgr.ClearItemDocs(itemId, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
return OK;
}
public override bool ClearItemDocs(ItemId itemId, Category category, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDocMgr.ClearItemDocs(itemId, category, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
return OK;
}
//-------------------------------------------------------------------
// Auto-assign documents.
// The master items define 'auto-assign' docs for the item's type.
// The 'File part' defines the filename excluding the extension.
// If the extension list is empty, any extension is matched.
public override bool AutoAssignDocs(ItemId itemId, List<ItemId> masterItemIds, String filePart, List<String> extension, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item must be specified");
if (masterItemIds.Count < 1) return SetErrorState("Master items must be specified");
// Retrieve docs for this item:
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.ItemIdsIncluded.Add(itemId);
prmItemDoc.StatusCat = SaItemDoc.StatusCat.NotDeleted;
List<SaItemDoc> itemDocs = GetItemDocs(prmItemDoc);
// Retrieve 'auto-assign' docs for the master items:
SaItemDoc.Params prmMaster = new SaItemDoc.Params();
prmMaster.ItemIdsIncluded.UnionWith(masterItemIds);
prmMaster.ItemTypeAutoAssign = itemId.Type;
List<SaItemDoc> masterDocs = GetItemDocs(prmMaster);
// Identify the folders defined for 'Auto-Assign':
List<String> folders = new List<string>();
foreach (SaItemDoc masterDoc in masterDocs)
{
if (masterDoc.ItemTypeAutoAssign == itemId.Type && masterDoc.Category == Category.Folder && !StringUtil.IsEmpty(masterDoc.Folder))
{
if (!folders.ContainsCI(masterDoc.Folder))
folders.Add(masterDoc.Folder);
}
}
// Locate relevant files in the specified folders:
List<String> filePaths = new List<string>();
foreach (String folder in folders)
{
filePaths.AddRange(FileUtil.LocateFiles(folder, filePart, extension, 2));
}
// Check whether any of these files are already logged as documents against the item:
filePaths.RemoveDuplicatesCI();
foreach (String filePath in filePaths)
{
String folder = FileUtil.GetParentDirectory(filePath);
String filename = Path.GetFileName(filePath);
// Check if file is already assigned.
if (itemDocs.Any(item => item.Folder.EqualsCI(folder) && item.Filename.EqualsCI(filename)))
continue;
// Assign the item document.
SaItemDoc itemDoc = CreateItemDoc(itemId, Category.Document);
itemDoc.DescBrief = filename;
itemDoc.Folder = folder;
itemDoc.Filename = filename;
itemDoc.AutoAssigned = true;
itemDoc.Notes = "Auto-assigned.";
itemDocs.Add(itemDoc);
if (!StoreItemDoc(itemDoc, dbUpdateInfo)) return false;
}
return OK;
}
//-------------------------------------------------------------------
}
//=======================================================================
}