TRpcRule0ID66CategoryRefs6Order20State1NameEingangsverarbeitung: Anhänge in Dokumente umwandeln (Beta, sl)Triggers5ExpertDataFbmRuleNode0JHSDCCL1L.Extended=0
FbmRuleNode0JHSDCCL1L.Field=34
FbmRuleNode0JHSDCCL1L.FlipNodes=0
FbmRuleNode0JHSDCCL1L.Locked=0
FbmRuleNode0JHSDCCL1L.Op=1
FbmRuleNode0JHSDCCL1L.SuccessNode=FbmRuleNodeNZZIQXDO1H
FbmRuleNode0JHSDCCL1L.Type=TFbmRuleNodeConditionItem
FbmRuleNode0JHSDCCL1L.Value=7
FbmRuleNode0JHSDCCL1L.X=552
FbmRuleNode0JHSDCCL1L.Y=336
FbmRuleNode1XRE653O3W.Comment=Ersteller : GREYHOUND Software GmbH & Co. KG, sl\r\nLetzte Änderung : 11.05.2021\r\nVoraussetzung : GREYHOUND 5.1.133 build 3172\r\n\r\nDiese Regel dupliziert Anhänge von beliebigen eingehenden E-Mails in Briefdokumente, bespielsweise von einem Dokumentenscanner. Für die Umwandlung von PDF-Rechnungen stehen erweiterte Funktionen bereit.\r\n\r\nAnhand des ersten Bearbeiters wird ermittelt, ob die E-Mail von einem Scanner erzeugt wurde. Die Bedingungen für das Erkennen von E-Mails mit gescannten Dokumenten können beliebig angepasst werden.\r\n\r\nSofern es sich nicht um eine E-Mail eines Dokumentenscanners handel wird geprüft, ob die E-Mail mindestens einem Kontakt zugeordnet wurde dessen Benutzerdefiniertes Feld "Belegabsender" gesetzt ist.\r\n\r\nDer E-Mail zugewiesene Kontakte werden an das Dokument übergeben, sofern in den Kontakten eine primäre Postadresse hinterlegt ist. Das hat den Vorteil, dass ein bereits über die E-Mailadresse eindeutig zugeordneter Kontakt am Dokument nicht erneut manuell zugeordnet werden muss.\r\n\r\nIdealerweise sollte man bei einer nachgelagerten Dokumentenanalyse das Überschreiben von Absender/Empfänger deaktivieren, damit bereits zugeordnete Kontakte nicht wieder entfernt oder durch andere Kontakte ersetzt werden.\r\n\r\nFür das Duplizieren wird eine angepasste Version des Regelknotens"Anhänge als Brief duplizieren" verwendet. Die Version in dieser Regel erlaubt die Übergabe eines Filter-Parameters, mit dem man diejenigen Anhänge herausfiltern kann, die tatsächlich dupliziert werden sollen. Damit kann sichergestellt werden, dass von Absendern, die ihre Rechnungen zusammen mit weiteren Anhängen versenden, nur die gewünschte Rechnung als Dokument dupliziert wird.\r\n\r\nDie Filter-Maske wird dabei aus dem zugeordneten Kontakt aus dem Benutzerdefinierten Feld "Dateimaske für Anhangskonvertierung" gezogen. Dort kann man einen Regex hinterlegen, welcher passen muss, damit ein Anhang konvertiert wird. Ist kein Regex hinterlegt, wird jeder Anhang konvertiert.
FbmRuleNode1XRE653O3W.CustomSubject=
FbmRuleNode1XRE653O3W.Extended=-1
FbmRuleNode1XRE653O3W.Locked=0
FbmRuleNode1XRE653O3W.Type=TFbmRuleNodeActionComment
FbmRuleNode1XRE653O3W.X=24
FbmRuleNode1XRE653O3W.Y=24
FbmRuleNode2OCA1DTR35.Extended=0
FbmRuleNode2OCA1DTR35.Locked=0
FbmRuleNode2OCA1DTR35.State=4
FbmRuleNode2OCA1DTR35.Type=TFbmRuleNodeActionState
FbmRuleNode2OCA1DTR35.X=552
FbmRuleNode2OCA1DTR35.Y=756
FbmRuleNode6UOY2EXQ29.CustomSubject=Anhänge als Dokument duplizieren
FbmRuleNode6UOY2EXQ29.Extended=0
FbmRuleNode6UOY2EXQ29.FlipNodes=0
FbmRuleNode6UOY2EXQ29.Locked=-1
FbmRuleNode6UOY2EXQ29.Source=CloneAttachmentsToLetterExtended(Item, isOpen, True, True, Item.GroupCache.GetIDByName('Dokumenteneingang'), 0, 0, 0, GetUserFieldValueFromSender('AttachmentToDocMask'))
FbmRuleNode6UOY2EXQ29.SuccessNode=FbmRuleNodeI66HNRA05F
FbmRuleNode6UOY2EXQ29.Type=TFbmRuleNodeConditionSource
FbmRuleNode6UOY2EXQ29.X=828
FbmRuleNode6UOY2EXQ29.Y=624
FbmRuleNode89P9N0TXL6.Extended=0
FbmRuleNode89P9N0TXL6.Locked=0
FbmRuleNode89P9N0TXL6.NextNode=FbmRuleNodeN8AEMKG8JL
FbmRuleNode89P9N0TXL6.Type=TFbmRuleNodeActionRoot
FbmRuleNode89P9N0TXL6.X=552
FbmRuleNode89P9N0TXL6.Y=24
FbmRuleNodeI66HNRA05F.Extended=0
FbmRuleNodeI66HNRA05F.Locked=0
FbmRuleNodeI66HNRA05F.State=4
FbmRuleNodeI66HNRA05F.Type=TFbmRuleNodeActionState
FbmRuleNodeI66HNRA05F.X=828
FbmRuleNodeI66HNRA05F.Y=756
FbmRuleNodeJMFYVGDE35.ConvertToBW=-1
FbmRuleNodeJMFYVGDE35.Extended=0
FbmRuleNodeJMFYVGDE35.Locked=0
FbmRuleNodeJMFYVGDE35.NextNode=FbmRuleNode2OCA1DTR35
FbmRuleNodeJMFYVGDE35.State=0
FbmRuleNodeJMFYVGDE35.Type=TFbmRuleNodeActionCloneAttachmentsToLetter
FbmRuleNodeJMFYVGDE35.UseDithering=0
FbmRuleNodeJMFYVGDE35.X=552
FbmRuleNodeJMFYVGDE35.Y=624
FbmRuleNodeN8AEMKG8JL.CustomSubject=HelpFunctions
FbmRuleNodeN8AEMKG8JL.Extended=0
FbmRuleNodeN8AEMKG8JL.FunctionSource={\r\nLiefert den Wert des übergebenen Benutzerdefinierten Feldes des Belegabsenders.\r\nBei Boolean-Feldern entspricht "-1" = True und "0" = False.\r\n}\r\nfunction GetUserFieldValueFromSender(UserFieldName: string): string;\r\nvar\r\n ContactItem: TFbmItem;\r\n\r\nbegin\r\n Result := '';\r\n\r\n try\r\n if Item.From.ContactRef > 0 then\r\n begin\r\n ContactItem := TFbmItem.Create(ikContact, 0)\r\n try\r\n ContactItem.DbQuery := Item.DbQuery;\r\n ContactItem.Load(Item.From.ContactRef);\r\n\r\n Result := Trim(ContactItem.UserFields.ItemsByName[UserFieldName].DatatypeValue);\r\n finally\r\n ContactItem.Free;\r\n end;\r\n end;\r\n\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler aufgetreten. Der Wert des Benutzerdefinierten Feldes "' + UserFieldName + '" des Absenders konnte nicht ermittelt werden: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nLiefert den Wert des übergebenen Benutzerdefinierten Feldes des ersten\r\nBelegempfängers. Bei Boolean-Feldern entspricht "-1" = True und "0" = False.\r\n}\r\nfunction GetUserFieldValueFromRecipient(UserFieldName: string): string;\r\nvar\r\n ContactItem: TFbmItem;\r\n\r\nbegin\r\n Result := '';\r\n\r\n try\r\n if (Item.Recipients.Count > 0) and (Item.Recipients[0].ContactRef > 0) then\r\n begin\r\n ContactItem := TFbmItem.Create(ikContact, 0)\r\n try\r\n ContactItem.DbQuery := Item.DbQuery;\r\n ContactItem.Load(Item.Recipients[0].ContactRef);\r\n\r\n Result := Trim(ContactItem.UserFields.ItemsByName[UserFieldName].DataTypeValue);\r\n finally\r\n ContactItem.Free;\r\n end;\r\n end;\r\n\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler aufgetreten. Der Wert des Benutzerdefinierten Feldes "' + UserFieldName + '" des Empfängers konnte nicht ermittelt werden: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nLiefert den vollständige Namen des zugeordneten Absender-Kontakts (nicht des\r\naktuellen Items), bestehend aus Firma (wenn vorhanden), Name und Vorname (wenn\r\nvorhanden).\r\n}\r\nfunction GetNameFromSender: string;\r\nvar\r\n i: Integer;\r\n ContactItem: TFbmItem;\r\n ContactProps: TFbmItemContactProperties;\r\n AddressName : string;\r\n\r\nbegin\r\n Result := '';\r\n\r\n try\r\n if Item.From.ContactRef > 0 then\r\n begin\r\n ContactItem := TFbmItem.Create(ikContact, 0);\r\n try\r\n ContactItem.DbQuery := Item.DbQuery;\r\n ContactItem.Load(Item.From.ContactRef);\r\n\r\n if ContactItem.Kind = ikContact then\r\n begin\r\n ContactProps := TFbmItemContactProperties(ContactItem.Properties);\r\n\r\n if (Length(ContactProps.Company) > 0) then\r\n Result := ContactProps.Company;\r\n\r\n if Length(ContactProps.Firstname + ContactProps.Lastname) > 0 then\r\n if Length(Result) > 0 then\r\n Result := Result + ', ' + ContactProps.Firstname + ' ' + ContactProps.Lastname\r\n else\r\n Result := ContactProps.Firstname + ' ' + ContactProps.Lastname;\r\n end;\r\n\r\n finally\r\n ContactItem.Free;\r\n end;\r\n\r\n end;\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung des Kontakt-Namens aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nLiefert die Dateierweiterung eines Dateinamens. Dateinamen mit mehreren Punkten\r\nwerden ebenso unterstützt.\r\n}\r\nfunction GetExtension(Filename: string): string;\r\nvar\r\n Str : string;\r\n\r\nbegin\r\n try\r\n Result := '';\r\n Str := Filename;\r\n\r\n while (Pos('.', Str) > 0) and (Pos('.', Str) < Length(Str)) do\r\n Str := Copy(Str, Pos('.', Str)+1, Length(Str));\r\n\r\n if Length(Str) <> Length(Filename) then\r\n Result := Str;\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Dateieindung aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nLiefert die vollständige Post-Adresse eines Kontakt-Elementes, einschließlich\r\nFirma (wenn vorhanden), Name und Vorname (wenn vorhanden), sowie der primären\r\nPost-Adresse.\r\n}\r\nfunction GetPostalAddressText(ContactRef: Integer): string;\r\nvar\r\n i: Integer;\r\n ContactItem: TFbmItem;\r\n ContactProps: TFbmItemContactProperties;\r\n AddressName : string;\r\n\r\nbegin\r\n Result := '';\r\n\r\n try\r\n if ContactRef > 0 then\r\n begin\r\n ContactItem := TFbmItem.Create(ikContact, 0);\r\n try\r\n ContactItem.DbQuery := Item.DbQuery;\r\n ContactItem.Load(ContactRef);\r\n\r\n if ContactItem.Kind = ikContact then\r\n begin\r\n ContactProps := TFbmItemContactProperties(ContactItem.Properties);\r\n\r\n if (Length(ContactProps.Company) > 0) then\r\n AddressName := ContactProps.Company;\r\n\r\n if Length(ContactProps.Firstname + ContactProps.Lastname) > 0 then\r\n if Length(AddressName) > 0 then\r\n AddressName := AddressName + ', ' + ContactProps.Firstname + ' ' + ContactProps.Lastname\r\n else\r\n AddressName := ContactProps.Firstname + ' ' + ContactProps.Lastname;\r\n\r\n for i := 0 to ContactProps.ComLinks.Count - 1 do\r\n begin\r\n if ContactProps.ComLinks[i] is TFbmPostalAddressItem then\r\n begin\r\n Result := AddressName + ' <' + TFbmPostalAddressItem(ContactProps.ComLinks[i]).Identifier + '>';\r\n\r\n if ContactProps.ComLinks[i].Preferred then\r\n Break;\r\n end;\r\n end;\r\n end;\r\n\r\n finally\r\n ContactItem.Free;\r\n end;\r\n end;\r\n\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Kontakt-Postadresse aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nLiefert die reine E-Mailadresse eines Kontakt-Elementes. Der Name wird nicht\r\neinbezogen.\r\n}\r\nfunction GetEmailAddress(ContactRef: Integer): string;\r\nvar\r\n i: Integer;\r\n ContactItem: TFbmItem;\r\n ContactProps: TFbmItemContactProperties;\r\n\r\nbegin\r\n Result := '';\r\n\r\n try\r\n if ContactRef > 0 then\r\n begin\r\n ContactItem := TFbmItem.Create(ikContact, 0);\r\n try\r\n ContactItem.DbQuery := Item.DbQuery;\r\n ContactItem.Load(ContactRef);\r\n\r\n if ContactItem.Kind = ikContact then\r\n begin\r\n ContactProps := TFbmItemContactProperties(ContactItem.Properties);\r\n\r\n for i := 0 to ContactProps.ComLinks.Count - 1 do\r\n begin\r\n if ContactProps.ComLinks[i] is TFbmEmailAddressItem then\r\n begin\r\n Result := TFbmEmailAddressItem(ContactProps.ComLinks[i]).Identifier;\r\n\r\n if ContactProps.ComLinks[i].Preferred then\r\n Break;\r\n end;\r\n end;\r\n end;\r\n\r\n finally\r\n ContactItem.Free;\r\n end;\r\n end;\r\n\r\n except\r\n Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Kontakt-E-Mailadresse aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nPrüft ob ein Absender-Kontakt zugeordnet ist, und ob dieser als Belegabsender\r\nkonfiguriert ist.\r\n}\r\nfunction IsValidSender: Boolean;\r\nbegin\r\n Result := True;\r\n\r\n try\r\n if (Item.From.ContactRef = 0) then\r\n RaiseException(erCustomError, 'Dem E-Mail-Absender "' + Item.From.Name + '" ist kein Absender-Kontakt zugeordnet.');\r\n\r\n // Item.AddToProtocol('Debug IsValidSender: GetUserFieldValueFromSender(Belegabsender)="' + GetUserFieldValueFromSender('Belegabsender') + '"');\r\n\r\n if AnsiSameText(GetUserFieldValueFromSender('Belegabsender'), '0') then\r\n RaiseException(erCustomError, 'Der Absender-Kontakt "' + GetNameFromSender + '" ist nicht als Belegabsender konfiguriert.');\r\n\r\n except\r\n Item.AddToProtocol('Es findet keine Dokumentumwandlung der Anhänge statt: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n Result := False;\r\n end;\r\nend;\r\n\r\n\r\n\r\n{\r\nAnders als der Standard-Regelknoten "Anhänge als Brief Duplizieren" können mit\r\ndieser Funktion auch sämtliche Zuweisungen bei der Erstellung des Briefes\r\nbestimmt werden.\r\nZudem kann über eine Dateimaske im Regex-Format bestimmt werden, ob und welche\r\nAnhänge von der Konvertierung ausgenommen werden sollen. Das ist beispielsweise\r\ndann hilfreich, wenn der Absender mit einer Rechnung noch weitere Dokumente\r\nangehängt hat, welche nicht konvertiert werden sollen.\r\n}\r\nfunction CloneAttachmentsToLetterExtended(SourceItem: TFbmItem; State: TFbmItemState; ConvertToBW, UseDithering : Boolean; GroupRef, UserRef, TopicRef, ColorRef: Integer; FileNameMask: string): Boolean;\r\nvar\r\n LetterItem : TFbmItem;\r\n Attachment : TFbmAttachmentItem;\r\n AddressItem: TFbmPostalAddressItem;\r\n Dif : TFbmDIF;\r\n AttFileName, PostalAddress : string;\r\n i, j : Integer;\r\n FileNameMaskMatch : Boolean;\r\n\r\nbegin\r\n Result := False;\r\n\r\n try\r\n if ((SourceItem.Kind = ikEmail) or (SourceItem.Kind = ikFile)) and (SourceItem.Attachments.Count > 0) then\r\n begin\r\n SourceItem.LoadAttachmentsContent;\r\n\r\n for i := 0 to SourceItem.Attachments.Count - 1 do\r\n begin\r\n if (AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or\r\n AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or\r\n AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or\r\n AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or\r\n AnsiEndsText('.tif', SourceItem.Attachments[i].Name)) then\r\n begin\r\n // ToDo: special characters in FileNameMask need to be escaped. i.e. "EINDE19-" won't work\r\n FileNameMaskMatch := (Length(FileNameMask) = 0) or ((Length(FileNameMask) > 0) and FbmRegExMatch(SourceItem.Attachments[i].Name, FileNameMask));\r\n\r\n if FileNameMaskMatch then\r\n begin\r\n LetterItem := TFbmItem.Create(ikLetter, 0);\r\n try\r\n LetterItem.DbQuery := SourceItem.DbQuery;\r\n LetterItem.State := State;\r\n LetterItem.LoadSaveAttachmentsContent := True;\r\n\r\n AttFileName := FbmCorrectFilename(SourceItem.Attachments[i].Name);\r\n AttFileName := FbmAnsiReplaceText(AttFileName, FbmExtractFileExt(AttFileName), ''); // Extension entfernen, falls vorhanden\r\n AttFileName := AttFileName + '.dif';\r\n\r\n Dif := TFbmDIF.Create;\r\n try\r\n if AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) then\r\n Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifPdf, False, ConvertToBW, UseDithering)\r\n else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) then\r\n Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifJpeg, False, ConvertToBW, UseDithering)\r\n else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or AnsiEndsText('.tif', SourceItem.Attachments[i].Name) then\r\n Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifTiff, False, ConvertToBW, UseDithering)\r\n else\r\n RaiseException(erCustomError, 'Nicht unterstützer Inhaltstyp');\r\n\r\n Dif.SaveToFile(SourceItem.TempDir + AttFileName);\r\n\r\n finally\r\n Dif.Free;\r\n end;\r\n\r\n Attachment := TFbmAttachmentItem.Create;\r\n try\r\n // Dif Anhang erstellen und an Brief anhängen\r\n Attachment.Name := AttFileName;\r\n Attachment.ContentType := 'image/x-dif';\r\n Attachment.StoredFilePath := SourceItem.TempDir + AttFileName;\r\n Attachment.RevGroup := LetterItem.NextAttachmentRevGroup;\r\n Attachment.Revision := 1;\r\n LetterItem.Attachments.Add(Attachment);\r\n\r\n except // Der Anhang "gehört" dem LetterItem, wenn alles korrekt gelaufen ist. Darf hier also nur im Falle einer Exception freigegeben werden.\r\n Attachment.Free;\r\n end;\r\n\r\n LetterItem.TemplateRef := 0; // Vorlage entfernen\r\n TFbmItemLetterProperties(LetterItem.Properties).EditorData := ''; // Inhalt entfernen, damit kein Deckblatt gerendert wird\r\n LetterItem.Ocr;\r\n LetterItem.Subject := SourceItem.Attachments[i].Name;\r\n LetterItem.TaskNumber.Assign(SourceItem.TaskNumber);\r\n\r\n // Absender der E-Mail als Belegabsender übernehmen\r\n if Item.From.ContactRef > 0 then\r\n begin\r\n PostalAddress := GetPostalAddressText(Item.From.ContactRef);\r\n\r\n if (Length(PostalAddress) > 0) and FbmIsValidPostalAddress(PostalAddress) then\r\n begin\r\n LetterItem.From.Text := PostalAddress;\r\n LetterItem.From.ContactRef := Item.From.ContactRef;\r\n LetterItem.Classified.Add(Item.From.ContactRef);\r\n end\r\n else\r\n Item.AddToProtocol('Der Kontakt "' + Item.From.Name + '" konnte nicht als Belegabsender zugeordnet werden, weil darin keine gültige Postadresse hinterlegt ist.');\r\n end;\r\n\r\n // Empfänger der E-Mail als Belegempfänger übernehmen\r\n LetterItem.Recipients.Clear;\r\n\r\n for j := 0 to Item.Classified.Count - 1 do\r\n begin\r\n if (Item.Classified[j] > 0) and AnsiSameText(GetEmailAddress(Item.Classified[j]), Item.Recipients[0].Identifier) then\r\n begin\r\n PostalAddress := GetPostalAddressText(Item.Classified[j]);\r\n\r\n if (Length(PostalAddress) > 0) and FbmIsValidPostalAddress(PostalAddress) then\r\n begin\r\n AddressItem := TFbmPostalAddressItem.Create;\r\n try\r\n AddressItem.Text := PostalAddress;\r\n AddressItem.ContactRef := Item.Classified[j];\r\n\r\n LetterItem.Recipients.Add(AddressItem);\r\n finally\r\n AddressItem.Free;\r\n end;\r\n\r\n LetterItem.Classified.Add(Item.Classified[j]); // notwendig, damit der Kontakt überhaupt zugeordnet wird\r\n end\r\n else\r\n Item.AddToProtocol('Der Kontakt "' + Item.Recipients[0].Name + '" konnte nicht als Belegempfänger zugeordnet werden, weil darin keine gültige Postadresse hinterlegt ist.');;\r\n end;\r\n end;\r\n\r\n // Gruppe zuweisen\r\n if Item.GroupCache.GroupExists(GroupRef) then\r\n LetterItem.GroupRef := GroupRef\r\n else\r\n RaiseException(erCustomError, 'Die Gruppe mit der ID "' + IntToStr(GroupRef) + '" existiert nicht.');\r\n\r\n // Bearbeiter zuweisen\r\n if (UserRef = 0) then\r\n LetterItem.UserRef := 0\r\n else if (UserRef > 0) and Item.UserCache.UserIDExists(UserRef) then\r\n LetterItem.UserRef := UserRef\r\n else\r\n RaiseException(erCustomError, 'Der Benutzer mit der ID "' + IntToStr(UserRef) + '" existiert nicht.');\r\n\r\n // Thema zuweisen\r\n if (TopicRef = 0) then\r\n LetterItem.TopicRef := 0\r\n else if (TopicRef > 0) and Item.TopicCache.TopicExists(TopicRef) then\r\n LetterItem.TopicRef := TopicRef\r\n else\r\n RaiseException(erCustomError, 'Das Thema mit der ID "' + IntToStr(TopicRef) + '" existiert nicht.');\r\n\r\n // Kennzeichnung zuweisen\r\n if (ColorRef = 0) then\r\n LetterItem.ColorRef := 0\r\n else if (ColorRef > 0) and Item.ColorCache.ColorExists(ColorRef) then\r\n LetterItem.ColorRef := ColorRef\r\n else\r\n RaiseException(erCustomError, 'Die Kennzeichnung mit der ID "' + IntToStr(ColorRef) + '" existiert nicht.');\r\n\r\n Result := True;\r\n\r\n SourceItem.AddToProtocol('Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde in ein Dokument konvertiert.');\r\n LetterItem.AddToProtocol('Das Dokument wurde aus dem Anhang "' + SourceItem.Attachments[i].Name + '" des Elements ' + Item.Protocol.GetItemLink(SourceItem.Id, SourceItem.Subject) + ' erstellt.');\r\n LetterItem.Save;\r\n\r\n if State = isOpen then\r\n LetterItem.TriggerWorkflow(itAfterIncoming, True)\r\n else if State = isNew then\r\n LetterItem.TriggerWorkflow(itNew, True);\r\n\r\n finally\r\n FbmDeleteFile(SourceItem.TempDir + AttFileName);\r\n LetterItem.Free;\r\n end;\r\n\r\n end // FileNameMaskMatch\r\n else\r\n Item.AddToProtocol('Die Dateimaske für die Anhangskonvertierung "' + FileNameMask + '" passt nicht. Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde von der Konvertierung ausgenommen.');\r\n\r\n end\r\n else\r\n Item.AddToProtocol('Der Inhalts-Typ "' + SourceItem.Attachments[i].ContentType + '" oder die Dateieindung "' + GetExtension(SourceItem.Attachments[i].Name) + '" wird nicht unterstützt. Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde von der Konvertierung ausgenommen.');\r\n\r\n end;\r\n\r\n end\r\n else\r\n RaiseException(erCustomError, 'Der Elementtyp wird nicht unterstützt oder es sind keine Anhänge vorhanden.');\r\n\r\n except\r\n SourceItem.AddToProtocol('Es ist ein Fehler beim Konvertieren der Anhänge aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));\r\n end;\r\nend;
FbmRuleNodeN8AEMKG8JL.Locked=-1
FbmRuleNodeN8AEMKG8JL.NextNode=FbmRuleNodeV58G8V23TU
FbmRuleNodeN8AEMKG8JL.Type=TFbmRuleNodeActionFunction
FbmRuleNodeN8AEMKG8JL.X=552
FbmRuleNodeN8AEMKG8JL.Y=84
FbmRuleNodeNZZIQXDO1H.Extended=0
FbmRuleNodeNZZIQXDO1H.FailureNode=FbmRuleNodeXUTZTCD28U
FbmRuleNodeNZZIQXDO1H.Field=71
FbmRuleNodeNZZIQXDO1H.FlipNodes=0
FbmRuleNodeNZZIQXDO1H.Locked=0
FbmRuleNodeNZZIQXDO1H.Op=0
FbmRuleNodeNZZIQXDO1H.SuccessNode=FbmRuleNodeJMFYVGDE35
FbmRuleNodeNZZIQXDO1H.Type=TFbmRuleNodeConditionItem
FbmRuleNodeNZZIQXDO1H.Value=22
FbmRuleNodeNZZIQXDO1H.X=552
FbmRuleNodeNZZIQXDO1H.Y=480
FbmRuleNodeV58G8V23TU.Extended=0
FbmRuleNodeV58G8V23TU.Field=32
FbmRuleNodeV58G8V23TU.FlipNodes=0
FbmRuleNodeV58G8V23TU.Locked=0
FbmRuleNodeV58G8V23TU.Op=0
FbmRuleNodeV58G8V23TU.SuccessNode=FbmRuleNode0JHSDCCL1L
FbmRuleNodeV58G8V23TU.Type=TFbmRuleNodeConditionItem
FbmRuleNodeV58G8V23TU.Value=0
FbmRuleNodeV58G8V23TU.X=552
FbmRuleNodeV58G8V23TU.Y=192
FbmRuleNodeXUTZTCD28U.CustomSubject=Belegabsender zugeordnet?
FbmRuleNodeXUTZTCD28U.Extended=0
FbmRuleNodeXUTZTCD28U.FlipNodes=0
FbmRuleNodeXUTZTCD28U.Locked=-1
FbmRuleNodeXUTZTCD28U.Source=IsValidSender
FbmRuleNodeXUTZTCD28U.SuccessNode=FbmRuleNode6UOY2EXQ29
FbmRuleNodeXUTZTCD28U.Type=TFbmRuleNodeConditionSource
FbmRuleNodeXUTZTCD28U.X=828
FbmRuleNodeXUTZTCD28U.Y=540
SourceCode{
Liefert den Wert des übergebenen Benutzerdefinierten Feldes des Belegabsenders.
Bei Boolean-Feldern entspricht "-1" = True und "0" = False.
}
function GetUserFieldValueFromSender(UserFieldName: string): string;
var
ContactItem: TFbmItem;
begin
Result := '';
try
if Item.From.ContactRef > 0 then
begin
ContactItem := TFbmItem.Create(ikContact, 0)
try
ContactItem.DbQuery := Item.DbQuery;
ContactItem.Load(Item.From.ContactRef);
Result := Trim(ContactItem.UserFields.ItemsByName[UserFieldName].DatatypeValue);
finally
ContactItem.Free;
end;
end;
except
Item.AddToProtocol('Es ist ein Fehler aufgetreten. Der Wert des Benutzerdefinierten Feldes "' + UserFieldName + '" des Absenders konnte nicht ermittelt werden: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Liefert den Wert des übergebenen Benutzerdefinierten Feldes des ersten
Belegempfängers. Bei Boolean-Feldern entspricht "-1" = True und "0" = False.
}
function GetUserFieldValueFromRecipient(UserFieldName: string): string;
var
ContactItem: TFbmItem;
begin
Result := '';
try
if (Item.Recipients.Count > 0) and (Item.Recipients[0].ContactRef > 0) then
begin
ContactItem := TFbmItem.Create(ikContact, 0)
try
ContactItem.DbQuery := Item.DbQuery;
ContactItem.Load(Item.Recipients[0].ContactRef);
Result := Trim(ContactItem.UserFields.ItemsByName[UserFieldName].DataTypeValue);
finally
ContactItem.Free;
end;
end;
except
Item.AddToProtocol('Es ist ein Fehler aufgetreten. Der Wert des Benutzerdefinierten Feldes "' + UserFieldName + '" des Empfängers konnte nicht ermittelt werden: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Liefert den vollständige Namen des zugeordneten Absender-Kontakts (nicht des
aktuellen Items), bestehend aus Firma (wenn vorhanden), Name und Vorname (wenn
vorhanden).
}
function GetNameFromSender: string;
var
i: Integer;
ContactItem: TFbmItem;
ContactProps: TFbmItemContactProperties;
AddressName : string;
begin
Result := '';
try
if Item.From.ContactRef > 0 then
begin
ContactItem := TFbmItem.Create(ikContact, 0);
try
ContactItem.DbQuery := Item.DbQuery;
ContactItem.Load(Item.From.ContactRef);
if ContactItem.Kind = ikContact then
begin
ContactProps := TFbmItemContactProperties(ContactItem.Properties);
if (Length(ContactProps.Company) > 0) then
Result := ContactProps.Company;
if Length(ContactProps.Firstname + ContactProps.Lastname) > 0 then
if Length(Result) > 0 then
Result := Result + ', ' + ContactProps.Firstname + ' ' + ContactProps.Lastname
else
Result := ContactProps.Firstname + ' ' + ContactProps.Lastname;
end;
finally
ContactItem.Free;
end;
end;
except
Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung des Kontakt-Namens aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Liefert die Dateierweiterung eines Dateinamens. Dateinamen mit mehreren Punkten
werden ebenso unterstützt.
}
function GetExtension(Filename: string): string;
var
Str : string;
begin
try
Result := '';
Str := Filename;
while (Pos('.', Str) > 0) and (Pos('.', Str) < Length(Str)) do
Str := Copy(Str, Pos('.', Str)+1, Length(Str));
if Length(Str) <> Length(Filename) then
Result := Str;
except
Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Dateieindung aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Liefert die vollständige Post-Adresse eines Kontakt-Elementes, einschließlich
Firma (wenn vorhanden), Name und Vorname (wenn vorhanden), sowie der primären
Post-Adresse.
}
function GetPostalAddressText(ContactRef: Integer): string;
var
i: Integer;
ContactItem: TFbmItem;
ContactProps: TFbmItemContactProperties;
AddressName : string;
begin
Result := '';
try
if ContactRef > 0 then
begin
ContactItem := TFbmItem.Create(ikContact, 0);
try
ContactItem.DbQuery := Item.DbQuery;
ContactItem.Load(ContactRef);
if ContactItem.Kind = ikContact then
begin
ContactProps := TFbmItemContactProperties(ContactItem.Properties);
if (Length(ContactProps.Company) > 0) then
AddressName := ContactProps.Company;
if Length(ContactProps.Firstname + ContactProps.Lastname) > 0 then
if Length(AddressName) > 0 then
AddressName := AddressName + ', ' + ContactProps.Firstname + ' ' + ContactProps.Lastname
else
AddressName := ContactProps.Firstname + ' ' + ContactProps.Lastname;
for i := 0 to ContactProps.ComLinks.Count - 1 do
begin
if ContactProps.ComLinks[i] is TFbmPostalAddressItem then
begin
Result := AddressName + ' <' + TFbmPostalAddressItem(ContactProps.ComLinks[i]).Identifier + '>';
if ContactProps.ComLinks[i].Preferred then
Break;
end;
end;
end;
finally
ContactItem.Free;
end;
end;
except
Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Kontakt-Postadresse aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Liefert die reine E-Mailadresse eines Kontakt-Elementes. Der Name wird nicht
einbezogen.
}
function GetEmailAddress(ContactRef: Integer): string;
var
i: Integer;
ContactItem: TFbmItem;
ContactProps: TFbmItemContactProperties;
begin
Result := '';
try
if ContactRef > 0 then
begin
ContactItem := TFbmItem.Create(ikContact, 0);
try
ContactItem.DbQuery := Item.DbQuery;
ContactItem.Load(ContactRef);
if ContactItem.Kind = ikContact then
begin
ContactProps := TFbmItemContactProperties(ContactItem.Properties);
for i := 0 to ContactProps.ComLinks.Count - 1 do
begin
if ContactProps.ComLinks[i] is TFbmEmailAddressItem then
begin
Result := TFbmEmailAddressItem(ContactProps.ComLinks[i]).Identifier;
if ContactProps.ComLinks[i].Preferred then
Break;
end;
end;
end;
finally
ContactItem.Free;
end;
end;
except
Item.AddToProtocol('Es ist ein Fehler bei der Ermittlung der Kontakt-E-Mailadresse aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
{
Prüft ob ein Absender-Kontakt zugeordnet ist, und ob dieser als Belegabsender
konfiguriert ist.
}
function IsValidSender: Boolean;
begin
Result := True;
try
if (Item.From.ContactRef = 0) then
RaiseException(erCustomError, 'Dem E-Mail-Absender "' + Item.From.Name + '" ist kein Absender-Kontakt zugeordnet.');
// Item.AddToProtocol('Debug IsValidSender: GetUserFieldValueFromSender(Belegabsender)="' + GetUserFieldValueFromSender('Belegabsender') + '"');
if AnsiSameText(GetUserFieldValueFromSender('Belegabsender'), '0') then
RaiseException(erCustomError, 'Der Absender-Kontakt "' + GetNameFromSender + '" ist nicht als Belegabsender konfiguriert.');
except
Item.AddToProtocol('Es findet keine Dokumentumwandlung der Anhänge statt: ' + ExceptionToString(ExceptionType, ExceptionParam));
Result := False;
end;
end;
{
Anders als der Standard-Regelknoten "Anhänge als Brief Duplizieren" können mit
dieser Funktion auch sämtliche Zuweisungen bei der Erstellung des Briefes
bestimmt werden.
Zudem kann über eine Dateimaske im Regex-Format bestimmt werden, ob und welche
Anhänge von der Konvertierung ausgenommen werden sollen. Das ist beispielsweise
dann hilfreich, wenn der Absender mit einer Rechnung noch weitere Dokumente
angehängt hat, welche nicht konvertiert werden sollen.
}
function CloneAttachmentsToLetterExtended(SourceItem: TFbmItem; State: TFbmItemState; ConvertToBW, UseDithering : Boolean; GroupRef, UserRef, TopicRef, ColorRef: Integer; FileNameMask: string): Boolean;
var
LetterItem : TFbmItem;
Attachment : TFbmAttachmentItem;
AddressItem: TFbmPostalAddressItem;
Dif : TFbmDIF;
AttFileName, PostalAddress : string;
i, j : Integer;
FileNameMaskMatch : Boolean;
begin
Result := False;
try
if ((SourceItem.Kind = ikEmail) or (SourceItem.Kind = ikFile)) and (SourceItem.Attachments.Count > 0) then
begin
SourceItem.LoadAttachmentsContent;
for i := 0 to SourceItem.Attachments.Count - 1 do
begin
if (AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or
AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or
AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or
AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or
AnsiEndsText('.tif', SourceItem.Attachments[i].Name)) then
begin
// ToDo: special characters in FileNameMask need to be escaped. i.e. "EINDE19-" won't work
FileNameMaskMatch := (Length(FileNameMask) = 0) or ((Length(FileNameMask) > 0) and FbmRegExMatch(SourceItem.Attachments[i].Name, FileNameMask));
if FileNameMaskMatch then
begin
LetterItem := TFbmItem.Create(ikLetter, 0);
try
LetterItem.DbQuery := SourceItem.DbQuery;
LetterItem.State := State;
LetterItem.LoadSaveAttachmentsContent := True;
AttFileName := FbmCorrectFilename(SourceItem.Attachments[i].Name);
AttFileName := FbmAnsiReplaceText(AttFileName, FbmExtractFileExt(AttFileName), ''); // Extension entfernen, falls vorhanden
AttFileName := AttFileName + '.dif';
Dif := TFbmDIF.Create;
try
if AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifPdf, False, ConvertToBW, UseDithering)
else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifJpeg, False, ConvertToBW, UseDithering)
else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or AnsiEndsText('.tif', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifTiff, False, ConvertToBW, UseDithering)
else
RaiseException(erCustomError, 'Nicht unterstützer Inhaltstyp');
Dif.SaveToFile(SourceItem.TempDir + AttFileName);
finally
Dif.Free;
end;
Attachment := TFbmAttachmentItem.Create;
try
// Dif Anhang erstellen und an Brief anhängen
Attachment.Name := AttFileName;
Attachment.ContentType := 'image/x-dif';
Attachment.StoredFilePath := SourceItem.TempDir + AttFileName;
Attachment.RevGroup := LetterItem.NextAttachmentRevGroup;
Attachment.Revision := 1;
LetterItem.Attachments.Add(Attachment);
except // Der Anhang "gehört" dem LetterItem, wenn alles korrekt gelaufen ist. Darf hier also nur im Falle einer Exception freigegeben werden.
Attachment.Free;
end;
LetterItem.TemplateRef := 0; // Vorlage entfernen
TFbmItemLetterProperties(LetterItem.Properties).EditorData := ''; // Inhalt entfernen, damit kein Deckblatt gerendert wird
LetterItem.Ocr;
LetterItem.Subject := SourceItem.Attachments[i].Name;
LetterItem.TaskNumber.Assign(SourceItem.TaskNumber);
// Absender der E-Mail als Belegabsender übernehmen
if Item.From.ContactRef > 0 then
begin
PostalAddress := GetPostalAddressText(Item.From.ContactRef);
if (Length(PostalAddress) > 0) and FbmIsValidPostalAddress(PostalAddress) then
begin
LetterItem.From.Text := PostalAddress;
LetterItem.From.ContactRef := Item.From.ContactRef;
LetterItem.Classified.Add(Item.From.ContactRef);
end
else
Item.AddToProtocol('Der Kontakt "' + Item.From.Name + '" konnte nicht als Belegabsender zugeordnet werden, weil darin keine gültige Postadresse hinterlegt ist.');
end;
// Empfänger der E-Mail als Belegempfänger übernehmen
LetterItem.Recipients.Clear;
for j := 0 to Item.Classified.Count - 1 do
begin
if (Item.Classified[j] > 0) and AnsiSameText(GetEmailAddress(Item.Classified[j]), Item.Recipients[0].Identifier) then
begin
PostalAddress := GetPostalAddressText(Item.Classified[j]);
if (Length(PostalAddress) > 0) and FbmIsValidPostalAddress(PostalAddress) then
begin
AddressItem := TFbmPostalAddressItem.Create;
try
AddressItem.Text := PostalAddress;
AddressItem.ContactRef := Item.Classified[j];
LetterItem.Recipients.Add(AddressItem);
finally
AddressItem.Free;
end;
LetterItem.Classified.Add(Item.Classified[j]); // notwendig, damit der Kontakt überhaupt zugeordnet wird
end
else
Item.AddToProtocol('Der Kontakt "' + Item.Recipients[0].Name + '" konnte nicht als Belegempfänger zugeordnet werden, weil darin keine gültige Postadresse hinterlegt ist.');;
end;
end;
// Gruppe zuweisen
if Item.GroupCache.GroupExists(GroupRef) then
LetterItem.GroupRef := GroupRef
else
RaiseException(erCustomError, 'Die Gruppe mit der ID "' + IntToStr(GroupRef) + '" existiert nicht.');
// Bearbeiter zuweisen
if (UserRef = 0) then
LetterItem.UserRef := 0
else if (UserRef > 0) and Item.UserCache.UserIDExists(UserRef) then
LetterItem.UserRef := UserRef
else
RaiseException(erCustomError, 'Der Benutzer mit der ID "' + IntToStr(UserRef) + '" existiert nicht.');
// Thema zuweisen
if (TopicRef = 0) then
LetterItem.TopicRef := 0
else if (TopicRef > 0) and Item.TopicCache.TopicExists(TopicRef) then
LetterItem.TopicRef := TopicRef
else
RaiseException(erCustomError, 'Das Thema mit der ID "' + IntToStr(TopicRef) + '" existiert nicht.');
// Kennzeichnung zuweisen
if (ColorRef = 0) then
LetterItem.ColorRef := 0
else if (ColorRef > 0) and Item.ColorCache.ColorExists(ColorRef) then
LetterItem.ColorRef := ColorRef
else
RaiseException(erCustomError, 'Die Kennzeichnung mit der ID "' + IntToStr(ColorRef) + '" existiert nicht.');
Result := True;
SourceItem.AddToProtocol('Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde in ein Dokument konvertiert.');
LetterItem.AddToProtocol('Das Dokument wurde aus dem Anhang "' + SourceItem.Attachments[i].Name + '" des Elements ' + Item.Protocol.GetItemLink(SourceItem.Id, SourceItem.Subject) + ' erstellt.');
LetterItem.Save;
if State = isOpen then
LetterItem.TriggerWorkflow(itAfterIncoming, True)
else if State = isNew then
LetterItem.TriggerWorkflow(itNew, True);
finally
FbmDeleteFile(SourceItem.TempDir + AttFileName);
LetterItem.Free;
end;
end // FileNameMaskMatch
else
Item.AddToProtocol('Die Dateimaske für die Anhangskonvertierung "' + FileNameMask + '" passt nicht. Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde von der Konvertierung ausgenommen.');
end
else
Item.AddToProtocol('Der Inhalts-Typ "' + SourceItem.Attachments[i].ContentType + '" oder die Dateieindung "' + GetExtension(SourceItem.Attachments[i].Name) + '" wird nicht unterstützt. Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde von der Konvertierung ausgenommen.');
end;
end
else
RaiseException(erCustomError, 'Der Elementtyp wird nicht unterstützt oder es sind keine Anhänge vorhanden.');
except
SourceItem.AddToProtocol('Es ist ein Fehler beim Konvertieren der Anhänge aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
procedure CloneAttachmentsToLetter(SourceItem: TFbmItem; State: TFbmItemState; ConvertToBW: Boolean; UseDithering: Boolean);
var
LetterItem : TFbmItem;
Attachment : TFbmAttachmentItem;
Dif : TFbmDIF;
AttFileName : string;
i : Integer;
begin
try
if ((SourceItem.Kind = ikEmail) or (SourceItem.Kind = ikFile)) and (SourceItem.Attachments.Count > 0) then
begin
SourceItem.LoadAttachmentsContent;
for i := 0 to SourceItem.Attachments.Count - 1 do
begin
if AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or
AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or
AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or
AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or
AnsiEndsText('.tif', SourceItem.Attachments[i].Name) then
begin
LetterItem := TFbmItem.Create(ikLetter, 0);
try
LetterItem.DbQuery := SourceItem.DbQuery;
LetterItem.State := State;
LetterItem.LoadSaveAttachmentsContent := True;
AttFileName := FbmCorrectFilename(SourceItem.Attachments[i].Name);
AttFileName := FbmAnsiReplaceText(AttFileName, FbmExtractFileExt(AttFileName), ''); // Extension entfernen, falls vorhanden
AttFileName := AttFileName + '.dif';
Dif := TFbmDIF.Create;
try
if AnsiSameText(SourceItem.Attachments[i].ContentType, 'application/pdf') or AnsiEndsText('.pdf', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifPdf, False, ConvertToBW, UseDithering)
else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/jpeg') or AnsiEndsText('.jpeg', SourceItem.Attachments[i].Name) or AnsiEndsText('.jpg', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifJpeg, False, ConvertToBW, UseDithering)
else if AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tiff') or AnsiSameText(SourceItem.Attachments[i].ContentType, 'image/tif') or AnsiEndsText('.tiff', SourceItem.Attachments[i].Name) or AnsiEndsText('.tif', SourceItem.Attachments[i].Name) then
Dif.ImportFromFile(SourceItem.Attachments[i].StoredFilePath, mpifTiff, False, ConvertToBW, UseDithering)
else
RaiseException(erCustomError, 'Nicht unterstützer Inhaltstyp');
Dif.SaveToFile(SourceItem.TempDir + AttFileName);
finally
Dif.Free;
end;
Attachment := TFbmAttachmentItem.Create;
try
// Dif Anhang erstellen und an Brief anhängen
Attachment.Name := AttFileName;
Attachment.ContentType := 'image/x-dif';
Attachment.StoredFilePath := SourceItem.TempDir + AttFileName;
Attachment.RevGroup := LetterItem.NextAttachmentRevGroup;
Attachment.Revision := 1;
LetterItem.Attachments.Add(Attachment);
except
// Der Anhang "gehört" dem LetterItem, wenn alles korrekt gelaufen ist. Darf hier also nur im Falle einer Exception freigegeben werden.
Attachment.Free;
end;
LetterItem.TemplateRef := 0; // Vorlage entfernen
TFbmItemLetterProperties(LetterItem.Properties).EditorData := ''; // Inhalt entfernen, damit kein Deckblatt gerendert wird
LetterItem.Ocr;
LetterItem.Subject := SourceItem.Attachments[i].Name;
LetterItem.GroupRef := SourceItem.GroupRef;
LetterItem.TaskNumber.Assign(SourceItem.TaskNumber);
SourceItem.AddToProtocol('Der Anhang "' + SourceItem.Attachments[i].Name + '" wurde in ein Dokument konvertiert.');
LetterItem.AddToProtocol('Das Dokument wurde aus dem Anhang "' + SourceItem.Attachments[i].Name + '" des Elements "' + IntToStr(SourceItem.Id) + '" erstellt.');
LetterItem.Save;
if State = isOpen then
LetterItem.TriggerWorkflow(itAfterIncoming, True)
else if State = isNew then
LetterItem.TriggerWorkflow(itNew, True);
finally
FbmDeleteFile(SourceItem.TempDir + AttFileName);
LetterItem.Free;
end;
end;
end;
end
else
RaiseException(erCustomError, 'Der Elementtyp wird nicht unterstützt oder es sind keine Anhänge vorhanden.');
except
SourceItem.AddToProtocol('Es ist ein Fehler beim Konvertieren der Anhänge aufgetreten: ' + ExceptionToString(ExceptionType, ExceptionParam));
end;
end;
begin
if (Item.Kind = ikEmail) then
begin
if (ifAttachment in Item.Flags) then
begin
if (Item.FirstUserRef = 22) then
begin
CloneAttachmentsToLetter(Item, isOpen, True, False);
Item.State := isDone;
end
else
begin
if (IsValidSender) then
begin
if (CloneAttachmentsToLetterExtended(Item, isOpen, True, True, Item.GroupCache.GetIDByName('Dokumenteneingang'), 0, 0, 0, GetUserFieldValueFromSender('AttachmentToDocMask'))) then
begin
Item.State := isDone;
end;
end;
end;
end;
end;
end.
Compiled1Created20210511T17:45:00Modified20210511T17:48:38