using AgriculturalPlatform.Api.Models;
namespace AgriculturalPlatform.Api.Dtos;
public record InvoiceDto(
int Id, string InvoiceNo, string? BatchNo, string InvoiceKind,
int FarmerId, string FarmerName, string? FarmerIdCard,
int PurchaserOrgId, string PurchaserOrgName, int? PurchaseOrderId, string? OrderNo,
int ProductId, string ProductName, decimal Quantity, string Unit, decimal UnitPrice,
decimal Amount, decimal TaxRate, decimal TaxAmount, DateTime IssueDate,
string Status, string? OperatorName, DateTime? ReversedAt, string ReverseReason, DateTime CreatedAt);
/// 开具销售发票:可指定收购单,也可手工录入
public record InvoiceCreateRequest(
int FarmerId, int PurchaserOrgId, int ProductId, int? PurchaseOrderId,
decimal Quantity, string Unit, decimal UnitPrice, decimal Amount,
decimal TaxRate = 0, string InvoiceKind = "销售发票");
/// 发票作废
public record InvoiceReverseRequest(string Reason);
/// 开票结果回填:Status 取值 Issued/Failed/Abnormal
public record InvoiceResultRequest(string Status, string? Message = null);
/// 收购单维度开票状态行(反向开票清单数据源:过磅称重有效收购单)
public record OrderInvoiceDto(
int Id, string OrderNo, DateTime? WeighOutAt,
int FarmerId, string FarmerName, string? FarmerIdCard,
int ProductId, string ProductName, string Unit, decimal NetWeight, decimal UnitPrice, decimal Amount,
int PurchaserOrgId, string PurchaserOrgName, string? PurchaserTaxNo,
int? InvoiceId, string? InvoiceNo, string? BatchNo, string InvoiceStatus, DateTime? IssueDate);
/// 创建开票批次(批量开票)
public record CreateBatchRequest(string? From, string? To, long[] OrderIds);
/// 开票批次进度
public record BatchProgressDto(string BatchNo, int Total, int Pending, int Issued, int Failed, int Abnormal, bool Done);
public static class InvoiceMappers
{
public static InvoiceDto ToDto(this Invoice i) => new(
i.Id, i.InvoiceNo, i.BatchNo, i.InvoiceKind,
i.FarmerId, i.Farmer?.Name ?? "", i.Farmer?.IdCard ?? "",
i.PurchaserOrgId, i.PurchaserOrg?.Name ?? "", i.PurchaseOrderId, i.PurchaseOrder?.OrderNo,
i.ProductId, i.Product?.Name ?? "", i.Quantity, i.Unit, i.UnitPrice,
i.Amount, i.TaxRate, i.TaxAmount, i.IssueDate,
i.Status.ToString(), i.Operator?.RealName ?? "", i.ReversedAt, i.ReverseReason, i.CreatedAt);
public static InvoiceDto[] ToDtos(this IEnumerable items) => items.Select(ToDto).ToArray();
}