namespace ECPDAL.Correspondence.DTOs;
///
/// A single correspondence record in TCORRESPONDENCE — modernized shape of the legacy
/// TINTERACTION, polymorphic via ObjectTypeId+ObjectId (resolved against MENTITY.ENTITYID).
///
public class CorrespondenceDTO
{
public int CorrespondenceId { get; set; }
public int ObjectTypeId { get; set; }
public int ObjectId { get; set; }
public int CorrespondenceTypeId { get; set; }
public string? CorrespondenceTypeCode { get; set; }
public string? CorrespondenceTypeName { get; set; }
public int BizTransactionTypeId { get; set; } = -1;
public byte Direction { get; set; } = 2; // 1=in 2=out
public byte Mode { get; set; } // 1=mail 2=sms
public string? Subject { get; set; }
public int TemplateId { get; set; } = -1; // -> MMERGE.MERGEID
public int GeneratedAttachmentId { get; set; } = -1; // -> TATTACHMENT.ATTACHMENTID
public string? FromId { get; set; }
public string? ToIds { get; set; }
public string? CcIds { get; set; }
public string? BccIds { get; set; }
public DateTime? ScheduledOn { get; set; }
public DateTime? SentOn { get; set; }
public byte ActionStatus { get; set; } = 1; // 1=pending 2=processed 3=failed
public int BizTransactionId { get; set; } = -1;
public int OuId { get; set; } = -1;
public int TenantId { get; set; } = -1;
public string DatabaseName { get; set; } = string.Empty;
public byte DatabaseType { get; set; }
public short Version { get; set; }
public byte Status { get; set; } = 1; // 1=Active 2=Deleted
public int CreatedById { get; set; } = -1;
public DateTime CreatedOn { get; set; }
public int ModifiedById { get; set; } = -1;
public DateTime ModifiedOn { get; set; }
}
///
/// Shared input shape for both preview (no persistence) and save-and-send. The caller supplies
/// the merge data context directly — per the plan, Correspondence doesn't own business data, so
/// it never resolves Fields/Tables from ObjectTypeId+ObjectId itself (that stays the owning
/// module's responsibility, same "floor" delegation pattern as Communication's CanView check).
///
public class CorrespondenceRenderRequestDTO
{
public int ObjectTypeId { get; set; }
public int ObjectId { get; set; }
public int CorrespondenceTypeId { get; set; }
public int TemplateId { get; set; }
/// Flat ##Field## values. byte[] values are treated as image-merge fields (##IMG:Field##).
public Dictionary Fields { get; set; } = [];
/// Named repeating-row datasets, keyed by the ##REPEAT:Name## marker used in the template.
public Dictionary>> Tables { get; set; } = [];
}
/// Input for SaveAndSendCorrespondence — render request + delivery/routing fields.
public class SaveAndSendCorrespondenceDTO : CorrespondenceRenderRequestDTO
{
public byte Mode { get; set; } // 1=mail 2=sms
public string? Subject { get; set; }
public string? FromId { get; set; }
public string? ToIds { get; set; }
public string? CcIds { get; set; }
public string? BccIds { get; set; }
public int BizTransactionTypeId { get; set; } = -1;
public int BizTransactionId { get; set; } = -1;
public int OuId { get; set; } = -1;
}
/// Input for UpdateCorrespondence — editable routing/scheduling fields only. Identity
/// fields (ObjectTypeId/ObjectId/TemplateId/GeneratedAttachmentId/Direction) are not editable
/// after creation. Version is required for optimistic concurrency (same convention as
/// SignatoryDTO's Save/Update pair).
public class UpdateCorrespondenceDTO
{
public int CorrespondenceId { get; set; }
public int CorrespondenceTypeId { get; set; }
public int BizTransactionTypeId { get; set; } = -1;
public byte Mode { get; set; } // 1=mail 2=sms
public string? Subject { get; set; }
public string? FromId { get; set; }
public string? ToIds { get; set; }
public string? CcIds { get; set; }
public string? BccIds { get; set; }
public DateTime? ScheduledOn { get; set; }
public int BizTransactionId { get; set; } = -1;
public int OuId { get; set; } = -1;
public short Version { get; set; }
}