|
|
|
@ -225,120 +225,118 @@ namespace DS.WMS.Core.Invoice.Method
|
|
|
|
|
if (invoice.PushModeValues.Length > 0)
|
|
|
|
|
invoice.PushMode = string.Join(",", invoice.PushModeValues.Select(x => (int)x));
|
|
|
|
|
|
|
|
|
|
if (request.Invoice.Mode == InvoiceMode.Applcation && request.Applications != null && request.Applications.Count > 0) //发票申请开出
|
|
|
|
|
if (request.Invoice.Mode == InvoiceMode.Applcation && request.Applications != null && request.Applications.Count > 0) //按发票申请开出
|
|
|
|
|
{
|
|
|
|
|
var ids = request.Applications.Select(x => x.ApplicationId);
|
|
|
|
|
if (request.Invoice.Mode == InvoiceMode.Applcation) //按发票申请
|
|
|
|
|
{
|
|
|
|
|
var details = await TenantDb.Queryable<ApplicationDetail>()
|
|
|
|
|
.InnerJoin<InvoiceApplication>((x, y) => x.ApplicationId == y.Id)
|
|
|
|
|
.LeftJoin<InfoClientBank>((x, y, z) => y.CustomerId == z.ClientId && z.Currency == invoice.Currency && z.IsInvoiceDefault == true)
|
|
|
|
|
.Where((x, y, z) => ids.Contains(x.ApplicationId) && x.Category == DetailCategory.InvoiceApplication)
|
|
|
|
|
.Select((x, y, z) => new
|
|
|
|
|
{
|
|
|
|
|
x.Id,
|
|
|
|
|
x.ApplicationId,
|
|
|
|
|
x.RecordId,
|
|
|
|
|
x.CustomerName,
|
|
|
|
|
x.FeeId,
|
|
|
|
|
x.FeeType,
|
|
|
|
|
x.FeeName,
|
|
|
|
|
x.ApplyAmount,
|
|
|
|
|
x.OriginalAmount,
|
|
|
|
|
x.Currency,
|
|
|
|
|
x.OriginalCurrency,
|
|
|
|
|
x.ProcessedAmount,
|
|
|
|
|
x.OriginalProcessedAmount,
|
|
|
|
|
|
|
|
|
|
y.CustomerId,
|
|
|
|
|
y.TaxRate,
|
|
|
|
|
y.TaxID,
|
|
|
|
|
y.InvoiceHeader,
|
|
|
|
|
y.CustomerAddTel,
|
|
|
|
|
y.SaleDeptId,
|
|
|
|
|
y.PushMode,
|
|
|
|
|
y.CellPhoneNO,
|
|
|
|
|
y.Email,
|
|
|
|
|
|
|
|
|
|
z.BankAccountNo,
|
|
|
|
|
z.BankName
|
|
|
|
|
}).ToListAsync();
|
|
|
|
|
var details = await TenantDb.Queryable<ApplicationDetail>()
|
|
|
|
|
.InnerJoin<InvoiceApplication>((x, y) => x.ApplicationId == y.Id)
|
|
|
|
|
.LeftJoin<InfoClientBank>((x, y, z) => y.CustomerId == z.ClientId && z.Currency == invoice.Currency && z.IsInvoiceDefault == true)
|
|
|
|
|
.Where((x, y, z) => ids.Contains(x.ApplicationId) && x.Category == DetailCategory.InvoiceApplication)
|
|
|
|
|
.Select((x, y, z) => new
|
|
|
|
|
{
|
|
|
|
|
x.Id,
|
|
|
|
|
x.ApplicationId,
|
|
|
|
|
x.RecordId,
|
|
|
|
|
x.CustomerName,
|
|
|
|
|
x.FeeId,
|
|
|
|
|
x.FeeType,
|
|
|
|
|
x.FeeName,
|
|
|
|
|
x.ApplyAmount,
|
|
|
|
|
x.OriginalAmount,
|
|
|
|
|
x.Currency,
|
|
|
|
|
x.OriginalCurrency,
|
|
|
|
|
x.ProcessedAmount,
|
|
|
|
|
x.OriginalProcessedAmount,
|
|
|
|
|
|
|
|
|
|
y.CustomerId,
|
|
|
|
|
y.TaxRate,
|
|
|
|
|
y.TaxID,
|
|
|
|
|
y.InvoiceHeader,
|
|
|
|
|
y.CustomerAddTel,
|
|
|
|
|
y.SaleDeptId,
|
|
|
|
|
y.PushMode,
|
|
|
|
|
y.CellPhoneNO,
|
|
|
|
|
y.Email,
|
|
|
|
|
|
|
|
|
|
z.BankAccountNo,
|
|
|
|
|
z.BankName
|
|
|
|
|
}).ToListAsync();
|
|
|
|
|
|
|
|
|
|
//税率不一致
|
|
|
|
|
if (details.GroupBy(x => x.TaxRate).Select(x => x.Key).Count() > 1)
|
|
|
|
|
//税率不一致
|
|
|
|
|
if (details.GroupBy(x => x.TaxRate).Select(x => x.Key).Count() > 1)
|
|
|
|
|
return DataResult<TEntity>.FailedWithDesc(nameof(MultiLanguageConst.InconsistentTaxRates));
|
|
|
|
|
|
|
|
|
|
invoice.Details ??= new List<ApplicationDetail>(details.Count);
|
|
|
|
|
foreach (var item in details)
|
|
|
|
|
{
|
|
|
|
|
if (invoice.Id == 0)
|
|
|
|
|
{
|
|
|
|
|
invoice.CustomerId = item.CustomerId;
|
|
|
|
|
invoice.CustomerName = item.CustomerName;
|
|
|
|
|
invoice.TaxRate = item.TaxRate;
|
|
|
|
|
invoice.InvoiceHeader = item.InvoiceHeader;
|
|
|
|
|
invoice.CustomerTaxID = item.TaxID;
|
|
|
|
|
invoice.CustomerAddressTel = item.CustomerAddTel;
|
|
|
|
|
invoice.CustomerAccount = item.BankAccountNo;
|
|
|
|
|
invoice.CustomerBankName = item.BankName;
|
|
|
|
|
invoice.SaleDeptId = item.SaleDeptId;
|
|
|
|
|
invoice.PushMode = item.PushMode;
|
|
|
|
|
invoice.CellPhoneNO = item.CellPhoneNO;
|
|
|
|
|
invoice.Email = item.Email;
|
|
|
|
|
}
|
|
|
|
|
else if (invoice.CustomerId != item.CustomerId) //校验开票单位是否一致
|
|
|
|
|
{
|
|
|
|
|
return DataResult<TEntity>.FailedWithDesc(nameof(MultiLanguageConst.InvoiceCustomerOnlyOne));
|
|
|
|
|
}
|
|
|
|
|
else if (invoice.TaxRate != item.TaxRate) //校验税率是否一致
|
|
|
|
|
{
|
|
|
|
|
return DataResult<TEntity>.FailedWithDesc(nameof(MultiLanguageConst.InconsistentTaxRates));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
invoice.Details ??= new List<ApplicationDetail>(details.Count);
|
|
|
|
|
foreach (var item in details)
|
|
|
|
|
//需转换为费用明细
|
|
|
|
|
var detail = new ApplicationDetail
|
|
|
|
|
{
|
|
|
|
|
if (invoice.Id == 0)
|
|
|
|
|
{
|
|
|
|
|
invoice.CustomerId = item.CustomerId;
|
|
|
|
|
invoice.CustomerName = item.CustomerName;
|
|
|
|
|
invoice.TaxRate = item.TaxRate;
|
|
|
|
|
invoice.InvoiceHeader = item.InvoiceHeader;
|
|
|
|
|
invoice.CustomerTaxID = item.TaxID;
|
|
|
|
|
invoice.CustomerAddressTel = item.CustomerAddTel;
|
|
|
|
|
invoice.CustomerAccount = item.BankAccountNo;
|
|
|
|
|
invoice.CustomerBankName = item.BankName;
|
|
|
|
|
invoice.SaleDeptId = item.SaleDeptId;
|
|
|
|
|
invoice.PushMode = item.PushMode;
|
|
|
|
|
invoice.CellPhoneNO = item.CellPhoneNO;
|
|
|
|
|
invoice.Email = item.Email;
|
|
|
|
|
}
|
|
|
|
|
else if (invoice.CustomerId != item.CustomerId) //校验开票单位是否一致
|
|
|
|
|
ApplicationId = invoice.Id,
|
|
|
|
|
RefId = item.ApplicationId,
|
|
|
|
|
DetailId = item.Id,
|
|
|
|
|
RecordId = item.RecordId,
|
|
|
|
|
Category = DetailCategory.InvoiceIssuance,
|
|
|
|
|
CustomerName = item.CustomerName,
|
|
|
|
|
FeeId = item.FeeId,
|
|
|
|
|
FeeName = item.FeeName,
|
|
|
|
|
FeeType = item.FeeType,
|
|
|
|
|
Currency = invoice.Currency,
|
|
|
|
|
OriginalCurrency = item.Currency,
|
|
|
|
|
ApplyAmount = item.ApplyAmount - item.ProcessedAmount,
|
|
|
|
|
OriginalAmount = item.OriginalAmount - item.OriginalProcessedAmount
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var app = request.Applications.Find(x => x.ApplicationId == item.ApplicationId);
|
|
|
|
|
if (app != null)
|
|
|
|
|
{
|
|
|
|
|
if (app.Currency == invoice.Currency)
|
|
|
|
|
{
|
|
|
|
|
return DataResult<TEntity>.FailedWithDesc(nameof(MultiLanguageConst.InvoiceCustomerOnlyOne));
|
|
|
|
|
detail.ExchangeRate = 1m;
|
|
|
|
|
}
|
|
|
|
|
else if (invoice.TaxRate != item.TaxRate) //校验税率是否一致
|
|
|
|
|
else if (string.IsNullOrEmpty(app.Currency)) //原币申请
|
|
|
|
|
{
|
|
|
|
|
return DataResult<TEntity>.FailedWithDesc(nameof(MultiLanguageConst.InconsistentTaxRates));
|
|
|
|
|
detail.ExchangeRate = app.ExchangeRates.FirstOrDefault(x => x.Currency == item.Currency)?.ExchangeRate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//需转换为费用明细
|
|
|
|
|
var detail = new ApplicationDetail
|
|
|
|
|
{
|
|
|
|
|
ApplicationId = invoice.Id,
|
|
|
|
|
RefId = item.ApplicationId,
|
|
|
|
|
DetailId = item.Id,
|
|
|
|
|
RecordId = item.RecordId,
|
|
|
|
|
Category = DetailCategory.InvoiceIssuance,
|
|
|
|
|
CustomerName = item.CustomerName,
|
|
|
|
|
FeeId = item.FeeId,
|
|
|
|
|
FeeName = item.FeeName,
|
|
|
|
|
FeeType = item.FeeType,
|
|
|
|
|
Currency = invoice.Currency,
|
|
|
|
|
OriginalCurrency = item.Currency,
|
|
|
|
|
ApplyAmount = item.ApplyAmount - item.ProcessedAmount,
|
|
|
|
|
OriginalAmount = item.OriginalAmount - item.OriginalProcessedAmount
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var app = request.Applications.Find(x => x.ApplicationId == item.ApplicationId);
|
|
|
|
|
if (app != null)
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (app.Currency == invoice.Currency)
|
|
|
|
|
{
|
|
|
|
|
detail.ExchangeRate = 1m;
|
|
|
|
|
}
|
|
|
|
|
else if (string.IsNullOrEmpty(app.Currency)) //原币申请
|
|
|
|
|
{
|
|
|
|
|
detail.ExchangeRate = app.ExchangeRates.FirstOrDefault(x => x.Currency == item.Currency)?.ExchangeRate;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
detail.ExchangeRate = app.ExchangeRates.FirstOrDefault(x => x.Currency == invoice.Currency)?.ExchangeRate;
|
|
|
|
|
}
|
|
|
|
|
detail.ExchangeRate = app.ExchangeRates.FirstOrDefault(x => x.Currency == invoice.Currency)?.ExchangeRate;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!detail.ExchangeRate.HasValue)
|
|
|
|
|
detail.ExchangeRate = 1m;
|
|
|
|
|
if (!detail.ExchangeRate.HasValue)
|
|
|
|
|
detail.ExchangeRate = 1m;
|
|
|
|
|
|
|
|
|
|
if (detail.ExchangeRate.HasValue)
|
|
|
|
|
detail.ApplyAmount = detail.ApplyAmount * detail.ExchangeRate.Value;
|
|
|
|
|
if (detail.ExchangeRate.HasValue)
|
|
|
|
|
detail.ApplyAmount = detail.ApplyAmount * detail.ExchangeRate.Value;
|
|
|
|
|
|
|
|
|
|
invoice.Details.Add(detail);
|
|
|
|
|
}
|
|
|
|
|
invoice.Details.Add(detail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (request.Invoice.Mode == InvoiceMode.Free) //自由开票
|
|
|
|
|
{
|
|
|
|
|