Commit c79cfa78 by 陶然

init

parents
################################################################################
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/Src/obj/Debug
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
internal class Configs
{
public const string TableNameAccount = "FINA_Accounts";
public const string TableNameAccountDetail = "FINA_AccountDetails";
public const string TableNameInvoice = "FINA_Invoices";
public const string TableNameInvoiceDetail = "FINA_InvoiceDetails";
public const string TableNameInvoiceTitle = "FINA_InvoicesTitles";
public const string TableNameApply = "FINA_Applies";
public const string TableNameApplyDetail = "FINA_ApplyDetails";
public const string TableNamePayment = "FINA_Payments";
public const string TableNameTransfer = "FINA_Transfers";
public const string TableNameSettlement = "FINA_Settlements";
public const string TableNameSettlementGroup = "FINA_SettlementGroups";
public const string TableNamePrefixSettlement = "Stms";
public const string TableNamePrefixSettlementDetail = "Stmd";
public const string TableNameBill = "FINA_Bills";
public const string TableNameBillDetail = "FINA_BillDetails";
public const string TableNameLoan = "FINA_Loans";
public const string TableNameLoanDetail = "FINA_LoanDetails";
public const string TableNamePay = "FINA_Pays";
public const string TableNameDiscount = "FINA_Discounts";
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "账户")]
[Alias(Configs.TableNameAccount)]
public class Account : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasCreator
{
#region 账户所有人,禁止更新
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid OwnerKvid { get; set; }
[ApiMember(Description = "所有者名称")]
[IgnoreUpdate]
[StringLength(500), Required]
public string OwnerName { get; set; }
#endregion
#region 帐户相关 账户类型禁止更新
[ApiMember(Description = "账户名称,如果是Bank类型,可以写银行名称,如果是其它类型,这个应该是账户的友好名称,不应该和OwnerName重复")]
[StringLength(100)]
[Required]
public string Name { get; set; }
[ApiMember(Description = "账户编号")]
[StringLength(100),Default("")]
public string SerialNumber { get; set; }
[ApiMember(Description = "类型,账户类型")]
[StringLength(50), Required]
public AccountType Type { get; set; }
[ApiMember(Description = "失效日期,仅针对StoredCard储值卡 和 Coupon 优惠券")]
public DateTime? ExpiredDate { get; set; }
#endregion
#region 金额相关,账户单位禁止更新,额度和金额都是内部更新
[ApiMember(Description = "授信额度,仅针对存款账户")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal CreditLine { get; set; }
[ApiMember(Description = "当前金额")]
[InternalSetter]
[DecimalLength(15, 2), Required]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Creator
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "组织机构名称,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[StringLength(200),CurrentOrganizationName]
public string OrganizationName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
#endregion
}
/// <summary>
/// 账户类型
/// </summary>
public enum AccountType
{
/// <summary>
/// 不支持的账户类型
/// </summary>
Unsupported = 0,
/// <summary>
///银行账户,可清零或调帐,不用于客户,只用于组织内
/// </summary>
Bank,
/// <summary>
///现金账户,用于收到的现金,只用于组织内,个人业务员使用,不用于客户,如业务员收取现金
/// </summary>
Cash,
/// <summary>
///刷卡账户,用于收到的刷卡,只用于组织内,个人业务员使用
/// </summary>
Pos,
AliPay,
WeChat,
/// <summary>
///存款账户,指客户的存款账户,同部门只能拥有一个, 多部门可存在多个账户
/// </summary>
Deposit,
/// <summary>
///优惠券,一次性使用,多不退少补
/// </summary>
Coupon,
/// <summary>
///储值卡,只能充值和消费,不能转出
/// </summary>
StoredCard,
/// <summary>
///业务专用账户,可设多个业务账户,用于记录不同业务的收入
/// </summary>
Biz,
/// <summary>
/// 平衡系统所有账户金额为0,一个系统仅有一个,即系统与系统外部有金额往来就新增账户明细
/// </summary>
Balance,
/// <summary>
/// 折扣账户,各部门仅有一个,也可所属到个人
/// </summary>
Discount,
/// <summary>
/// 退款账户,所属于系统使用退款账户
/// </summary>
Refund
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
//帐户明细,只记录往来变化和一些信息,其数据来源应该是对应于Payment
[Api(Description = "账户明细")]
[Alias(Configs.TableNameAccountDetail)]
public class AccountDetail:EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Account,Offset Biz
[InternalSetter]
[DefaultEmptyGuid, Required]
public Guid AccountKvid { get; set; }
[ApiMember(Description = "业务Kvid")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200), Default("")]
public string BizId { get; set; }
[ApiMember(Description = "业务类型,指实体类型全名称")]
[InternalSetter]
[StringLength(200), Default("")]
public string BizType { get; set; }
#endregion
#region 收付双方 Payer付款单位,贷方 Payee收款单位,借方 禁止更新
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerAccountKvid { get; set; }
[ApiMember(Description = "付款账户名称,如果是Bank类的,指银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerAccountSerialNumber { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeAccountKvid { get; set; }
[ApiMember(Description = "收款账户名称")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeAccountSerialNumber { get; set; }
#endregion
#region 金额相关
/// <summary>
/// 发生金额
/// </summary>
[ApiMember(Description = "发生金额,正数为入(借),负数为出(贷)正常全为正数,如果为负值,应该对调借贷双方")]
[IgnoreUpdate]
[DecimalLength(15, 2), Required]
public decimal AmountPayment { get; set; }
/// <summary>
/// 帐户余额
/// </summary>
[ApiMember(Description = "帐户余额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "分析")]
public class Analysis
{
public decimal Amount { get; set; }
public decimal AmountSettlement { get; set; }
public decimal AmountInvoice { get; set; }
public decimal AmountPayment { get; set; }
public decimal AmountUnpaid { get; set; }
public decimal AmountOffset { get; set; }
public int Quantity { get; set; }
public int QuantityInvoice { get; set; }
public int QuantitySettlement { get; set; }
public int QuantityPayment { get; set; }
public int QuantityUnpaid { get; set; }
public int QuantityOffset { get; set; }
public AnalysisType Type { get; set; }
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
public string Summary { get; set; }
}
/// <summary>
/// 分析类型,默认按月,支持: 年,月,日,季度
/// </summary>
public enum AnalysisType
{
Unsupported = 0,
Month,
Day,
Season,
Year
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "账单")]
[Alias(Configs.TableNameBill)]
public class Bill : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasCreator, IEntityHasUpdater
{
#region 关联信息 Owner
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[StringLength(500)]
public string OwnerName { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 账单双方 Payer需方单位 Payee供方单位
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
#endregion
#region 账单双方联系方式
[DefaultEmptyGuid]
public Guid PayerContactKvid { get; set; }
[ApiMember(Description = "付款联系人")]
[StringLength(100), Default("")]
public string PayerContactName { get; set; }
[ApiMember(Description = "付款联系电话")]
[StringLength(50), Default("")]
public string PayerContactNumber { get; set; }
[ApiMember(Description = "付款联系邮箱")]
[StringLength(100), Default("")]
public string PayerContactEmail { get; set; }
[ApiMember(Description = "付款联系地址")]
[StringLength(500), Default("")]
public string PayerContactAddress { get; set; }
[DefaultEmptyGuid]
public Guid PayeeContactKvid { get; set; }
[ApiMember(Description = "收款联系人")]
[StringLength(100), Default("")]
public string PayeeContactName { get; set; }
[ApiMember(Description = "收款联系电话")]
[StringLength(50), Default("")]
public string PayeeContactNumber { get; set; }
[ApiMember(Description = "收款联系邮箱")]
[StringLength(100), Default("")]
public string PayeeContactEmail { get; set; }
[ApiMember(Description = "收款联系地址")]
[StringLength(500), Default("")]
public string PayeeContactAddress { get; set; }
#endregion
#region 基本信息
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string SerialNumber { get; set; }
#endregion
#region 金额相关
[ApiMember(Description = "预结算金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPlan { get; set; }
[ApiMember(Description = "结算金额,实际结算金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "已付金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPayment { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构名称,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[StringLength(200), CurrentOrganizationName]
public string OrganizationName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
public class BillWithSettlements:Bill
{
[Ignore]
public List<Settlement> Settlements { get; set; }
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "账单明细")]
[Alias(Configs.TableNameBillDetail)]
public class BillDetail:EntityWithMetadata,IEntityInAssemblyDb,
IEntityHasSummary,IEntityHasRemark,
IEntityHasCreator, IEntityHasUpdater
{
#region 关联信息,禁止更新
[ApiMember(Description = "账单Kvid")]
[IgnoreUpdate]
[Required]
public Guid BillKvid { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[ApiMember(Description = "业务Kvid")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 账单明细相关
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string SerialNumber { get; set; }
[ApiMember(Description = "明细类型")]
[IgnoreUpdate]
[StringLength(50), Default("")]
public string Type { get; set; }
[ApiMember(Description = "结算金额,实际结算金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "折扣,实收款项少于应收款项时用,例如应收1100,实际客户支付了1000,剩余100 需要使用此对象记录下来")]
[Alias(Configs.TableNameDiscount)]
public class Discount:EntityWithMetadata,IEntityInAssemblyDb,
IEntityHasSummary,IEntityHasRemark,
IEntityHasCreator
{
#region 关联信息
/// <summary>
/// 所属部门
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid PayKvid { get; set; }
#endregion
#region 基本信息
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default(""), SerialNumber]
public string SerialNumber { get; set; }
/// <summary>
/// 记录从哪个账户上折扣的
/// </summary>
[ApiMember(Description = "账户Kvid,记录从哪个账户上折扣的")]
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid AccountKvid { get; set; }
[ApiMember(Description = "账户名称,记录从哪个账户上折扣的")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string AccountName { get; set; }
[ApiMember(Description = "账户流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string AccountSerialNumber { get; set; }
#endregion
#region 费用相关
[ApiMember(Description = "发生金额,抵扣的金额数")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经办人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
#endregion
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
//发票是财务人员操作,开具发票,可被相应的合同或其它认领,可拆分
//认领时需要提供甲乙双方名称,可由具体业务拆分发票
//状态 1:开具的发票 51:领取了的发票 52:寄出的发票 100:作废的发票
[Api(Description = "发票")]
[Alias(Configs.TableNameInvoice)]
public class Invoice : EntityWithMetadata,IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Owner,Offset Biz,全内部设置
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
[ApiMember(Description = "收付款关联,针对Payment和Invoice多对多的关系 使用中间表Apply(开票申请)关联起来")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid ApplyKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid RootKvid { get; set; }
#endregion
#region 收付双方 Payer付款单位,贷方 Payee收款单位,借方 全禁止更新
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[ApiMember(Description ="付方税号,收票方税号")]
[IgnoreUpdate]
[StringLength(100)]
public string PayerTaxNumber { get; set; }
[ApiMember(Description = "公司地址")]
[StringLength(200), Default("")]
public string PayerCompanyAddress { get; set; }
[ApiMember(Description = "电话号码")]
[StringLength(50), Default("")]
public string PayerPhone { get; set; }
[ApiMember(Description = "付款账户名称,指开户银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerRegisteredBank { get; set; }
[ApiMember(Description = "付款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerBankAccount { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
[ApiMember(Description = "收方税号,开票方税号")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeTaxNumber { get; set; }
[ApiMember(Description = "公司地址")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeCompanyAddress { get; set; }
[ApiMember(Description = "电话号码")]
[IgnoreUpdate]
[StringLength(50), Default("")]
public string PayeePhone { get; set; }
[ApiMember(Description = "收款账户名称,指开户银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeRegisteredBank { get; set; }
[ApiMember(Description = "收款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeBankAccount { get; set; }
#endregion
#region 发票相关
[ApiMember(Description = "发票代码")]
[InternalSetter]
[StringLength(100), Default("")]
public string SerialCode { get; set; }
[ApiMember(Description = "发票号码,唯一性,拆分的发票和原编号有关联性")]
[InternalSetter,Unique]
[StringLength(100), Default("")]
public string SerialNumber { get; set; }
[ApiMember(Description = "发票类型,普通,专用增值等")]
[IgnoreUpdate]
[StringLength(50), Required]
public string Type { get; set; }
[ApiMember(Description = "分类,借票,到账等")]
[StringLength(50), Default("")]
public string Category { get; set; }
#endregion
#region 金额和税
[ApiMember(Description = "发票税率")]
[IgnoreUpdate]
[DecimalLength(5, 4), Default(0)]
public decimal TaxRate { get; set; }
[ApiMember(Description = "收款金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPayment { get; set; }
[ApiMember(Description = "含税金额,合同或订单中使用的金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
[ApiMember(Description = "未税金额,Amount=AmountUntaxed+AmountTax")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountUntaxed { get; set; }
[ApiMember(Description = "税额,和计算结果Amount-Amount/(1+TaxRate)不能相差超过一个固定值")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountTax { get; set; }
#endregion
#region 拆分属性
//ParentKvid为 Empty为主发票,否则为拆分发票,不作统计用,只支持原发票拆分,拆分后不再支持再拆分
[InternalSetter]
[DefaultEmptyGuid]
public Guid ParentKvid { get; set; }
//如果被拆分后,这个金额应该是拆分项目Amount金额的统计
[ApiMember(Description = "关联金额,被业务关联掉的金额,正常应该和Amount相同")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountUsed { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime 全禁止更新
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[ApiMember(Description = "支付日期")]
[InternalSetter]
public DateTime? PayedTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description ="组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
/// <summary>
/// Status:1业务员借票申请,25申请通过工作流待财务审批,50财务通过申请,51待开票,52正在开票中 55,56开票失败 57驳回 maxvalue开票完成
/// 当多条借票申请对应收款时 生成一个总和的申请与收款关联 更新对应的发票的ApplyKvid为总和的Apply的Kvid 原有的申请Apply的ParentKvid记录总和Apply的Kvid
/// </summary>
[Api(Description = "发票申请")]
[Alias(Configs.TableNameApply)]
public class InvoiceApply : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Owner,Offset Biz,全内部设置
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid RootKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid ParentKvid { get; set; }
#endregion
#region 申请信息
[ApiMember(Description = "申请编号,唯一性")]
[InternalSetter, Unique]
[StringLength(100), Default(""),SerialNumber]
public string SerialNumber { get; set; }
[ApiMember(Description ="申请类型")]
[IgnoreUpdate]
[StringLength(50),Required]
public InvoiceApplyType OperateType { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[ApiMember(Description = "付方税号,收票方税号")]
[IgnoreUpdate]
[StringLength(100)]
public string PayerTaxNumber { get; set; }
[ApiMember(Description = "公司地址")]
[StringLength(200), Default("")]
public string PayerCompanyAddress { get; set; }
[ApiMember(Description = "电话号码")]
[StringLength(50), Default("")]
public string PayerPhone { get; set; }
[ApiMember(Description = "付款账户名称,指开户银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerRegisteredBank { get; set; }
[ApiMember(Description = "付款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerBankAccount { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
[ApiMember(Description = "收方税号,开票方税号")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeTaxNumber { get; set; }
[ApiMember(Description = "公司地址")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeCompanyAddress { get; set; }
[ApiMember(Description = "电话号码")]
[IgnoreUpdate]
[StringLength(50), Default("")]
public string PayeePhone { get; set; }
[ApiMember(Description = "收款账户名称,指开户银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeRegisteredBank { get; set; }
[ApiMember(Description = "收款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeBankAccount { get; set; }
#endregion
#region 申请金额
[ApiMember(Description = "发票类型,普通,专用增值等")]
[InternalSetter]
[StringLength(50)]
public string Type { get; set; }
[ApiMember(Description = "申请金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "已开票金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountInvoice { get; set; }
[ApiMember(Description = "已关联金额,关联的收款或者刷卡现金账户金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountUsed { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime 全禁止更新
[ApiMember(Description = "申请日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "申请人")]
[IgnoreUpdate]
[StringLength(100)]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
}
public enum InvoiceApplyType
{
Unsupported = 0,
/// <summary>
/// 收款
/// </summary>
Payment,
/// <summary>
/// 业务
/// </summary>
Biz,
/// <summary>
/// 借票
/// </summary>
Debit,
/// <summary>
/// 关联,与收款一一对应用
/// </summary>
Related,
/// <summary>
/// 现金,财务用
/// </summary>
Cash,
/// <summary>
/// Pos机,财务用
/// </summary>
Pos,
AliPay,
WeChat
}
public enum InvoiceApplyStatus
{
/// <summary>
/// 默认状态
/// </summary>
Default = 0,
/// <summary>
/// 借票申请初始状态
/// </summary>
Debit = 1,
/// <summary>
/// 流程通过
/// </summary>
ProcessAdoption = 25,
/// <summary>
/// 财务审批通过
/// </summary>
FinancialApproval = 50,
/// <summary>
/// 财务执行开票动作
/// </summary>
FinancialExecute = 51,
/// <summary>
/// 进入自动开票流程
/// </summary>
AutoExecuting = 52,
/// <summary>
/// 自动开票生产XML文件失败
/// </summary>
ErrorXml = 55,
/// <summary>
/// 插入发票到数据库失败
/// </summary>
ErrorInsertInvoice = 56,
/// <summary>
/// 申请驳回
/// </summary>
ApplyReject = 57,
/// <summary>
/// 发票作废
/// </summary>
InvoiceOffset = 58,
/// <summary>
/// 申请合并
/// </summary>
ApplyMerge = 59,
/// <summary>
/// 红字冲销
/// </summary>
InvoiceNegative = 60,
/// <summary>
/// 申请完成,已开具发票
/// </summary>
Completed = int.MaxValue
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "申请明细")]
[Alias(Configs.TableNameApplyDetail)]
public class InvoiceApplyDetail:EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasRemark,
IEntityHasCreator, IEntityHasUpdater
{
#region 关联信息,禁止更新
[ApiMember(Description = "申请Kvid")]
[IgnoreUpdate]
[Required]
public Guid ApplyKvid { get; set; }
#endregion
#region 申请明细
[ApiMember(Description = "货品编号")]
//[IgnoreUpdate]
[StringLength(100), Default("")]
public string GoodsId { get; set; }
[ApiMember(Description = "条目名称,货物或应税劳务、服务名称")]
//[IgnoreUpdate,]
[StringLength(200), Required]
public string GoodsFullName { get; set; }
[ApiMember(Description = "货品规格")]
//[IgnoreUpdate,]
[StringLength(200), Default("")]
public string GoodsSpecifications { get; set; }
[ApiMember(Description = "货品型号")]
//[IgnoreUpdate,]
[StringLength(200), Default("")]
public string GoodsModel { get; set; }
[ApiMember(Description = "货品单位")]
//[IgnoreUpdate,]
[StringLength(50), Default("")]
public string GoodsUnit { get; set; }
[ApiMember(Description = "数量单位")]
[StringLength(50), Default("")]
public string QuantityUnit { get; set; }
[ApiMember(Description = "数量")]
[DecimalLength(10, 2), Default(0)]
public decimal Quantity { get; set; }
[ApiMember(Description = "单价(含税)")]
[DecimalLength(16, 8), Default(0)]
public decimal QuantityUnitPrice { get; set; }
[ApiMember(Description = "单价(不含税)")]
[DecimalLength(15, 2), Default(0)]
public decimal QuantityUnitPriceUntaxed { get; set; }
[ApiMember(Description = "税率")]
[IgnoreUpdate, InternalSetter]
[DecimalLength(5, 2), Required]
public decimal TaxRate { get; set; }
[ApiMember(Description = "含税金额,合同或订单中使用的金额")]
[DecimalLength(15, 2), Required]
public decimal Amount { get; set; }
[ApiMember(Description = "未税金额,Amount=AmountUntaxed+AmountTax")]
[DecimalLength(15, 2), Default(0)]
public decimal AmountUntaxed { get; set; }
[ApiMember(Description = "税额,和计算结果Amount*TaxRate不能相差超过一个固定值")]
[DecimalLength(15, 2), Default(0)]
public decimal AmountTax { get; set; }
#endregion
#region 备注
[ApiMember(Description = "备注")]
[StringLength(1000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作人Creator Updater
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "发票明细")]
[Alias(Configs.TableNameInvoiceDetail)]
public class InvoiceDetail : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasRemark,
IEntityHasCreator, IEntityHasUpdater
{
#region 关联信息,禁止更新
[ApiMember(Description = "发票Kvid")]
[IgnoreUpdate]
[Required]
public Guid InvoiceKvid { get; set; }
#endregion
#region 发票明细
[ApiMember(Description = "货品编号")]
//[IgnoreUpdate]
[StringLength(100), Default("")]
public string GoodsId { get; set; }
[ApiMember(Description = "条目名称,货物或应税劳务、服务名称")]
//[IgnoreUpdate,]
[StringLength(200), Required]
public string GoodsFullName { get; set; }
[ApiMember(Description = "货品规格")]
//[IgnoreUpdate,]
[StringLength(200), Default("")]
public string GoodsSpecifications { get; set; }
[ApiMember(Description = "货品型号")]
//[IgnoreUpdate,]
[StringLength(200), Default("")]
public string GoodsModel { get; set; }
[ApiMember(Description = "货品单位")]
//[IgnoreUpdate,]
[StringLength(50), Default("")]
public string GoodsUnit { get; set; }
[ApiMember(Description = "数量单位")]
[StringLength(50), Default("")]
public string QuantityUnit { get; set; }
[ApiMember(Description = "数量")]
[DecimalLength(10, 2), Default(0)]
public decimal Quantity { get; set; }
[ApiMember(Description = "单价(含税)")]
[DecimalLength(16, 8), Default(0)]
public decimal QuantityUnitPrice { get; set; }
[ApiMember(Description = "单价(不含税)")]
[DecimalLength(15, 2), Default(0)]
public decimal QuantityUnitPriceUntaxed { get; set; }
[ApiMember(Description = "税率")]
[IgnoreUpdate,InternalSetter]
[DecimalLength(5, 2), Required]
public decimal TaxRate { get; set; }
[ApiMember(Description = "含税金额,合同或订单中使用的金额")]
[DecimalLength(15, 2), Required]
public decimal Amount { get; set; }
[ApiMember(Description = "未税金额,Amount=AmountUntaxed+AmountTax")]
[DecimalLength(15, 2),Default(0)]
public decimal AmountUntaxed { get; set; }
[ApiMember(Description = "税额,和计算结果AmountUntaxed*TaxRate不能相差超过一个固定值")]
[DecimalLength(15, 2), Default(0)]
public decimal AmountTax { get; set; }
#endregion
#region 备注
[ApiMember(Description = "备注")]
[StringLength(1000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作人Creator Updater
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
}
using Kivii.DataAnnotations;
namespace Kivii.Finances.Entities
{
[Api(Description = "发票抬头")]
[Alias(Configs.TableNameInvoiceTitle)]
public class InvoiceTitle:Entity, IEntityInAssemblyDb
{
[ApiMember(Description = "公司名称")]
[StringLength(50), Required,Unique]
public string CompanyName { get; set; }
[ApiMember(Description = "税号")]
[StringLength(30), Default("")]
public string TaxNumber { get; set; }
[ApiMember(Description = "公司地址")]
[StringLength(200),Default("")]
public string CompanyAddress { get; set; }
[ApiMember(Description = "电话号码")]
[StringLength(50),Default("")]
public string Phone { get; set; }
[ApiMember(Description = "开户银行")]
[StringLength(50)]
public string BankName { get; set; }
[ApiMember(Description = "银行账户")]
[StringLength(50), Default("")]
public string BankAccount { get; set; }
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "付款单")]
[Alias(Configs.TableNamePay)]
public class Pay : EntityWithMetadata, IEntityInAssemblyDb, IEntityHasBiz,
IEntityHasOffset, IEntityHasSummary,
IEntityHasRemark, IEntityHasCreator, IEntityHasUpdater
{
#region 关联信息 Owner,Biz
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 收付双方
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付方单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收方单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
#endregion
#region 基本信息
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string SerialNumber { get; set; }
[ApiMember(Description = "消费类型")]
[StringLength(50), Default("")]
public string Type { get; set; }
//[ApiMember(Description = "付款Kvid")]
//[InternalSetter]
//[DefaultEmptyGuid]
//public Guid PaymentKvid { get; set; }
[ApiMember(Description = "支付日期")]
[InternalSetter]
public DateTime? PayedTime { get; set; }
#endregion
#region 费用相关
/// <summary>
/// 结算金额,结算明细统计
/// </summary>
[ApiMember(Description = "结算金额,结算明细统计")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountSettlement { get; set; }
[ApiMember(Description = "实付金额,客户实际支付的金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "折扣金额,客户实际支付的金额少于结算金额时补齐的金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountDiscount { get; set; }
[ApiMember(Description = "已付金额,实付金额和折扣金额的和")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPayment { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
//[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经办人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构名称,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[StringLength(200), CurrentOrganizationName]
public string OrganizationName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
public enum PayType
{
Unsupported = 0,
/// <summary>
/// 付款记录支付
/// </summary>
Payment,
/// <summary>
/// 客户账户支付
/// </summary>
Account,
/// <summary>
/// 抵扣的
/// </summary>
Discount
}
public class PayingMethod
{
public PayType Type { get; set; }
public Guid Kvid { get; set; }
public decimal Amount { get; set; }
public string Remark { get; set; }
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "付款")]
[Alias(Configs.TableNamePayment)]
public class Payment : EntityWithMetadata,IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Owner,Offset Biz
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[ApiMember(Description = "所属Kvid,一般用于这笔付款属于哪个部门")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
/// <summary>
/// 根kvid,原始的付款信息,所以拆分的N级子项都有共同的RootKvid
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid RootKvid { get; set; }
//ParentKvid为 Empty为主发票,否则为拆分收款,不作统计用
[InternalSetter]
[DefaultEmptyGuid]
public Guid ParentKvid { get; set; }
#endregion
#region 收付双方 Payer付款单位,贷方 Payee收款单位,借方,账号相关
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerAccountKvid { get; set; }
[ApiMember(Description = "付款账户")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountOwnerName { get; set; }
[ApiMember(Description = "付款账户名称,如果是Bank类的,指银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerAccountSerialNumber { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeAccountKvid { get; set; }
[ApiMember(Description = "收款账户")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountOwnerName { get; set; }
[ApiMember(Description = "收款账户名称")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountName { get; set; }
[ApiMember(Description = "收款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeAccountSerialNumber { get; set; }
#endregion
#region 收付款相关
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default(""), SerialNumber]
public string SerialNumber { get; set; }
[ApiMember(Description = "付款类型,现金、银行汇款等")]
[IgnoreUpdate]
[StringLength(100), Required]
public PaymentType Type { get; set; }
[ApiMember(Description = "发生金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "已用金额,被业务关联掉的金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountUsed { get; set; }
//如果被拆分后,这个金额应该是拆分项目被关联金额的统计
[ApiMember(Description = "拆分金额,被拆分掉的金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountSplited { get; set; }
[ApiMember(Description = "开票金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountInvoice { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经办人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid AuditorKvid { get; set; }
[ApiMember(Description ="审核人")]
[IgnoreUpdate]
[StringLength(100),Default("")]
public string AuditorName { get; set; }
[ApiMember(Description ="组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
public enum PaymentType
{
Unsupported = 0,
/// <summary>
/// 银行流水
/// </summary>
Bank,
/// <summary>
/// 内部拆分,Biz业务认领使用类型
/// </summary>
Split,
/// <summary>
/// 非业务使用
/// </summary>
UnBiz,
/// <summary>
/// 退款
/// </summary>
Refund,
/// <summary>
/// 现金,直接从现金内部账户拨款到Payment的类型(区别于Account类型[消费使用],开票申请使用)
/// </summary>
Cash,
/// <summary>
/// 支付宝支付,暂无使用
/// </summary>
AliPay,
/// <summary>
/// 微信支付,暂无使用
/// </summary>
WeChat,
/// <summary>
/// 动态拆分,必有Biz,即为用于关联支付Pay业务,子集Pay用于结算,当有Pay冲销则此状态Amount AmountUsed AmountSplited都发生变化
/// </summary>
DynamicSplit,
/// <summary>
/// 刷卡,直接从刷卡内部账户拨款到Payment的类型(区别于Account类型[消费使用],开票申请使用)
/// </summary>
Pos,
/// <summary>
/// 支付,此类型必有Biz,即为动态拆分的子集用于关联具体Settlement业务
/// </summary>
Pay,
/// <summary>
/// 转账,必有Biz
/// </summary>
Transfer
}
}
using Kivii.DataAnnotations;
using Kivii.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
public abstract class SettlementBase : EntityWithMetadata
{
#region 关联信息 Owner,Offset
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[StringLength(500)]
public string OwnerName { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
#endregion
#region 业务关联(结算财务表中,Owner记录所属部门,Biz记录关联业务)
[ApiMember(Description = "业务Kvid,根据结算精细度,Settlement中的BizKvid可能会和SettlementDetail中的BizKvid一致," +
"查询时需要同时查询两表数据")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 结算双方 Payer需方单位 Payee供方单位
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付方单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收方单位")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
#endregion
#region 结算相关
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public virtual string SerialNumber { get; set; }
//不使用枚举型,不确定的类型
[ApiMember(Description = "结算类型")]
[InternalSetter]
[StringLength(50), Default("")]
public string Type { get; set; }
[ApiMember(Description = "预结算金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPlan { get; set; }
[ApiMember(Description = "结算金额,实际结算金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "已付金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPayment { get; set; }
[ApiMember(Description = "支付Kvid")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid PayKvid { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构名称,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[StringLength(200), CurrentOrganizationName]
public string OrganizationName { get; set; }
[ApiMember(Description ="组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大3000字")]
[StringLength(3000), Default("")]
public string Remark { get; set; }
#endregion
/// <summary>
/// 用于创建时 接口提供批量结算时使用
/// </summary>
[Ignore]
public List<SettlementDetail> Details { get; set; }
}
/// <summary>
/// 财务模块中的结算
/// </summary>
[Api(Description = "结算")]
[Alias(Configs.TableNameSettlement)]
public class Settlement : SettlementBase, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public override string SerialNumber { get; set; }
//[ApiMember(Description = "已开票金额")]
//[InternalSetter]
//[DecimalLength(15, 2), Default(0)]
//public decimal AmountInvoice { get; set; }
private static MethodInfo _realMethod = null;
public object GetSettlementDetails()
{
var rtns = new List<SettlementDetail>();
Type entityType = Text.AssemblyUtils.FindType(this.BizType);
if (entityType == null) return rtns;
if (_realMethod == null)
{
var function = new Func<object>(onExecution<Entity>);
_realMethod = this.GetType().GetMethod(function.Method.Name, BindingFlags.NonPublic | BindingFlags.Instance);
}
return _realMethod.MakeGenericMethod(entityType).Invoke(this, null);
}
private object onExecution<T>() where T : IEntity
{
var rtns = new List<SettlementDetail>();
var conn = KiviiContext.GetOpenedDbConnection<EntitySettlementDetail<T>>();
var settlementDetals = conn.Select<EntitySettlementDetail<T>>(o => o.SettlementKvid == this.Kvid);
if (settlementDetals.IsNullOrEmpty()) return rtns;
return settlementDetals;
}
}
[Alias(Configs.TableNamePrefixSettlement)]
public class EntitySettlement<T> : SettlementBase, IEntityInGenericTypeDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public override string SerialNumber { get; set; }
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "结算分析")]
[Alias(Configs.TableNameSettlement)]
public class SettlementAnalysis:EntityWithMetadata, IEntityInAssemblyDb
{
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
public abstract class SettlementDetailBase : EntityWithMetadata
{
#region 关联信息,禁止更新
[ApiMember(Description = "结算Kvid")]
[IgnoreUpdate]
[Required]
public Guid SettlementKvid { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[ApiMember(Description = "业务Kvid,根据结算精细度,Settlement中的BizKvid可能会和SettlementDetail中的BizKvid一致," +
"查询时需要同时查询两表数据")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 结算明细
[ApiMember(Description = "货品编号")]
[StringLength(100), Default("")]
public string GoodsId { get; set; }
[ApiMember(Description = "条目名称,货物、服务等名称")]
[StringLength(200), Default("")]
public string GoodsFullName { get; set; }
[ApiMember(Description = "条目Kvid")]
[DefaultEmptyGuid]
public Guid GoodsKvid { get; set; }
[ApiMember(Description = "规格")]
[StringLength(200), Default("")]
public string GoodsSpecifications { get; set; }
[ApiMember(Description = "型号")]
[StringLength(200), Default("")]
public string GoodsModel { get; set; }
[ApiMember(Description = "货品单位")]
[StringLength(50)]
public string GoodsUnit { get; set; }
[ApiMember(Description = "结算数量,即实际结算数量")]
[DecimalLength(10, 2), Default(0)]
public decimal Quantity { get; set; }
[ApiMember(Description = "数量单位")]
[StringLength(50), Default("")]
public string QuantityUnit { get; set; }
[ApiMember(Description = "单价")]
[DecimalLength(10, 2), Default(0)]
public decimal QuantityUnitPrice { get; set; }
[ApiMember(Description = "预结算数量")]
[DecimalLength(10, 2), Default(0)]
public decimal QuantityPlan { get; set; }
//[ApiMember(Description = "预数量单位")]
//[StringLength(50), Default("")]
//public string QuantityUnitPlan { get; set; }
[ApiMember(Description = "预单价")]
[DecimalLength(10, 2), Default(0)]
public decimal QuantityUnitPricePlan { get; set; }
[ApiMember(Description = "预结算金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPlan { get; set; }
[ApiMember(Description = "结算金额,实际结算金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "明细类型")]
[IgnoreUpdate]
[StringLength(50), Default("")]
public string Type { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 备注
[ApiMember(Description = "备注")]
[StringLength(3000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
[Api(Description = "结算明细,仅数据结构,不存数据库")]
//[Alias(Configs.TableNameSettlementDetail)]
public class SettlementDetail : SettlementDetailBase,
IEntityHasRemark, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater
{
}
[Alias(Configs.TableNamePrefixSettlementDetail)]
public class EntitySettlementDetail<T> : SettlementDetailBase, IEntityInGenericTypeDb,
IEntityHasRemark, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater
{
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "结算分组")]
[Alias(Configs.TableNameSettlementGroup)]
public class SettlementGroup : EntityWithMetadata, IEntityInAssemblyDb
{
/// <summary>
/// 一般用于所属部门使用
/// </summary>
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[StringLength(500)]
public string OwnerName { get; set; }
[ApiMember(Description = "付方单位")]
[IgnoreUpdate]
[StringLength(100), Required, Unique]
public string PayerName { get; set; }
[ApiMember(Description = "类型")]
[InternalSetter]
[StringLength(500), Required]
public string Type { get; set; }
[ApiMember(Description = "结算金额总和")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "结算数量总和")]
[InternalSetter]
[Default(0)]
public int Quantity { get; set; }
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "内部付款,用于内部账户之间转账使用,区分开实际银行等方式打款来的Payment表")]
[Alias(Configs.TableNameTransfer)]
public class Transfer:EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset, IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Owner,Offset Biz
/// <summary>
/// 一般不使用此字段,预留
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[InternalSetter]
[StringLength(500)]
public string OwnerName { get; set; }
/// <summary>
/// 冲帐关联
/// </summary>
[InternalSetter]
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200)]
public string BizId { get; set; }
[ApiMember(Description = "业务类型")]
[InternalSetter]
[StringLength(100)]
public string BizType { get; set; }
#endregion
#region 收付双方 Payer付款单位,贷方 Payee收款单位,借方
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid, Required]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Required]
public string PayeeName { get; set; }
#endregion
#region 收付款账号相关
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerAccountKvid { get; set; }
[ApiMember(Description = "付款账户")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountOwnerName { get; set; }
[ApiMember(Description = "付款账户名称")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerAccountSerialNumber { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeAccountKvid { get; set; }
[ApiMember(Description = "收款账户")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountOwnerName { get; set; }
[ApiMember(Description = "收款账户名称")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountName { get; set; }
[ApiMember(Description = "收款账户卡号")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeAccountSerialNumber { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid AuditorKvid { get; set; }
[ApiMember(Description = "审核人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string AuditorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 收付款相关
[ApiMember(Description = "流水号")]
[IgnoreUpdate]
[StringLength(100), Default(""), SerialNumber]
public string SerialNumber { get; set; }
[ApiMember(Description = "付款类型,现金、银行汇款等")]
[IgnoreUpdate]
[StringLength(100), Required]
public TransferType Type { get; set; }
[ApiMember(Description = "发生金额")]
[IgnoreUpdate]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
}
public enum TransferType
{
Unsupported = 0,
/// <summary>
/// 现金业务,充值和提现
/// </summary>
Deposit,
/// <summary>
/// 内部账号转账
/// </summary>
Transfer,
/// <summary>
/// 合同付款业务
/// </summary>
Contract,
/// <summary>
/// 贷款业务
/// </summary>
Loan,
/// <summary>
/// 其它类型的业务转账
/// </summary>
Biz
}
}
using Kivii.Finances.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
public static class BillExtension
{
public static BillDetail Offset(this BillDetail billDetail,string remark)
{
billDetail.ThrowIfNull("账单明细不能为空!");
(billDetail.OffsetKvid != Guid.Empty).ThrowIfTrue("当前账单明细已作废!无需重复操作!");
#region payment冲账
var newBillDetailKvid = Guid.NewGuid();
billDetail.OffsetKvid = newBillDetailKvid;
billDetail.AddOnlyProperties(o => o.OffsetKvid);
billDetail.Remark = $"{remark}";
billDetail.AddOnlyProperties(o => o.Remark);
//新建一个和原来一样的
var offsetBillDetail = new BillDetail();
offsetBillDetail.PopulateWith(billDetail);
offsetBillDetail.OffsetKvid = billDetail.Kvid;//新的冲帐关联用原来的Kvid
offsetBillDetail.Kvid = newBillDetailKvid;
offsetBillDetail.SerialNumber = billDetail.SerialNumber.IsNullOrEmpty() ? "" : ("-" + billDetail.SerialNumber);
offsetBillDetail.Remark = $"{remark}";
offsetBillDetail.Amount = 0 - offsetBillDetail.Amount;//反向值
#endregion
return offsetBillDetail;
}
}
}
using Kivii.Finances.Entities;
using Kivii.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
public static class InvoiceApplyExtension
{
/// <summary>
/// 获取子发票的流水号
/// </summary>
/// <param name="invoice"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static string GetSubSerialNumber(this Invoice invoice, IDbConnection conn = null)
{
invoice.RootKvid.ThrowIfEmpty("RootKvid不能为空");
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Invoice>();
var rootInvoice = conn.SingleById<Invoice>(invoice.RootKvid);
rootInvoice.ThrowIfNull("主发票记录不存在");
var allcount = conn.Count<Invoice>(o => o.RootKvid == rootInvoice.Kvid);
//allcount不需要加1,因为Root的也统计进去了
return $"{rootInvoice.SerialNumber}-{allcount}";
}
/// <summary>
/// Payment与Invoice产生关联的方法
/// </summary>
/// <param name="invoices"></param>
/// <param name="payments"></param>
/// <returns></returns>
public static List<Invoice> Correlating(this List<Invoice> invoices, List<Payment> payments)
{
payments.ThrowIfNullOrEmpty("要关联的Payments不能为空!");
invoices.ThrowIfNullOrEmpty("要关联的Invoices不能为空!");
(payments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.AliPay && o.Type != PaymentType.Cash && o.Type != PaymentType.Pos && o.Type != PaymentType.Split && o.Type != PaymentType.WeChat)).ThrowIfTrue("请选择正确收款进行关联");
var payedTime = payments.Max(o => o.OperateTime);
var rtns = new List<Invoice>();
foreach (var payment in payments)
{
//说明已经建立关联关系的payment 跳过
if (payment.AmountInvoice >= payment.Amount) continue;
foreach (var invoice in invoices)
{
var amountCorrelating = invoice.Amount - invoice.AmountPayment;//要关联的金额
if (amountCorrelating <= 0) continue;
var amountLeave = payment.Amount - payment.AmountInvoice;//可以开票的金额
if (amountLeave <= 0) continue;
var amount = amountLeave <= amountCorrelating ? amountLeave : amountCorrelating;
invoice.PayedTime = payedTime;
invoice.AmountPayment += amount;
#region 建立关联关系
var relationInvoice = new Invoice();
relationInvoice.PopulateInstance(invoice);
relationInvoice.SerialNumber = string.Empty;
relationInvoice.Kvid = Guid.NewGuid();
relationInvoice.ParentKvid = invoice.Kvid;
relationInvoice.BizId = payment.SerialNumber;
relationInvoice.BizKvid = payment.RootKvid;//记录根的Kvid
relationInvoice.BizType = typeof(Payment).FullName;
relationInvoice.Type = "Relation";
relationInvoice.PayedTime = payedTime;
relationInvoice.Amount = amount;
relationInvoice.AmountPayment = amount;
//不含税金额
relationInvoice.AmountUntaxed = Math.Round(relationInvoice.Amount / (1 + relationInvoice.TaxRate), 2);
//税额
relationInvoice.AmountTax = relationInvoice.Amount - relationInvoice.AmountUntaxed;
rtns.Add(relationInvoice);
#endregion
payment.AmountInvoice += amount;
}
payment.AddOnlyProperties(o => o.AmountInvoice);
}
return rtns;
}
/// <summary>
/// 发票明细拆分
/// </summary>
/// <param name="invoiceApplyDetail"></param>
/// <param name="limit">拆分临界值</param>
/// <returns></returns>
internal static List<InvoiceApplyDetail> SplitApplyDetail(this InvoiceApplyDetail invoiceApplyDetail, decimal limit)
{
List<InvoiceApplyDetail> applyDetails = new List<InvoiceApplyDetail>();
#region 金额超过10万需要分开
if (invoiceApplyDetail.Amount <= limit)
{
invoiceApplyDetail.GoodsId = invoiceApplyDetail.GoodsId.IsNullOrEmpty() ? "组1" : invoiceApplyDetail.GoodsId;
//不含税金额
invoiceApplyDetail.AmountUntaxed = Math.Round(invoiceApplyDetail.Amount / (1 + invoiceApplyDetail.TaxRate), 2);
//税额
invoiceApplyDetail.AmountTax = invoiceApplyDetail.Amount - invoiceApplyDetail.AmountUntaxed;
//不含税单价
invoiceApplyDetail.QuantityUnitPriceUntaxed = Math.Round(invoiceApplyDetail.AmountUntaxed / invoiceApplyDetail.Quantity, 4);
//含税单价
invoiceApplyDetail.QuantityUnitPrice = Math.Round(invoiceApplyDetail.Amount / invoiceApplyDetail.Quantity, 4);
applyDetails.Add(invoiceApplyDetail);
}
else
{
var count = (int)(invoiceApplyDetail.Amount / limit);
for (var i = 0; i <= count - 1; i++)
{
var detail = new InvoiceApplyDetail();
detail.GoodsId = $"发票{i}";
detail.GoodsFullName = invoiceApplyDetail.GoodsFullName;
detail.GoodsSpecifications = invoiceApplyDetail.GoodsSpecifications;
detail.QuantityUnit = invoiceApplyDetail.QuantityUnit;
detail.QuantityUnitPriceUntaxed = invoiceApplyDetail.QuantityUnitPriceUntaxed;
detail.Quantity = invoiceApplyDetail.Quantity;
detail.TaxRate = invoiceApplyDetail.TaxRate;
detail.Amount = limit;
//不含税金额
detail.AmountUntaxed = Math.Round(detail.Amount / (1 + detail.TaxRate), 2);
//税额
detail.AmountTax = detail.Amount - detail.AmountUntaxed;
//不含税单价
detail.QuantityUnitPriceUntaxed = Math.Round(detail.AmountUntaxed / detail.Quantity, 4);
//含税单价
detail.QuantityUnitPrice = Math.Round(detail.Amount / detail.Quantity, 4);
applyDetails.Add(detail);
}
var leftAmount = invoiceApplyDetail.Amount - limit * count;
if (leftAmount > 0)
{
var item = new InvoiceApplyDetail();
item.GoodsId = $"发票{count}";
item.GoodsFullName = invoiceApplyDetail.GoodsFullName;
item.GoodsSpecifications = invoiceApplyDetail.GoodsSpecifications;
item.QuantityUnit = invoiceApplyDetail.QuantityUnit;
item.QuantityUnitPriceUntaxed = invoiceApplyDetail.QuantityUnitPriceUntaxed;
item.Quantity = invoiceApplyDetail.Quantity;
item.TaxRate = invoiceApplyDetail.TaxRate;
item.Amount = invoiceApplyDetail.Amount - limit * count;
item.AmountUntaxed = Math.Round(item.Amount / (1 + item.TaxRate), 2);
item.AmountTax = item.Amount - item.AmountUntaxed;
item.QuantityUnitPriceUntaxed = Math.Round(item.AmountUntaxed / item.Quantity, 4);
item.QuantityUnitPrice = Math.Round(item.Amount / item.Quantity, 4);
applyDetails.Add(item);
}
}
#endregion
return applyDetails;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{8D9479E9-5C4F-4D96-8BC1-C771BE0D91B1}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Kivii.Finances</RootNamespace>
<AssemblyName>Kivii.Biz.Finances.V4.5</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2021.10000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Kivii.Common.5.6.2021.10000\lib\net45\Kivii.Common.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2021.10000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Kivii.Core.5.6.2021.10000\lib\net45\Kivii.Core.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2021.10190, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Kivii.Linq.5.6.2021.10190\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configs.cs" />
<Compile Include="Entities\Account.cs" />
<Compile Include="Entities\AccountDetail.cs" />
<Compile Include="Entities\Analysis.cs" />
<Compile Include="Entities\Bill.cs" />
<Compile Include="Entities\BillDetail.cs" />
<Compile Include="Entities\Discount.cs" />
<Compile Include="Entities\Invoice.cs" />
<Compile Include="Entities\InvoiceApply.cs" />
<Compile Include="Entities\InvoiceApplyDetail.cs" />
<Compile Include="Entities\InvoiceDetail.cs" />
<Compile Include="Entities\InvoiceTitle.cs" />
<Compile Include="Entities\Pay.cs" />
<Compile Include="Entities\Payment.cs" />
<Compile Include="Entities\Settlement.cs" />
<Compile Include="Entities\SettlementAnalysis.cs" />
<Compile Include="Entities\SettlementDetail.cs" />
<Compile Include="Entities\SettlementGroup.cs" />
<Compile Include="Entities\Transfer.cs" />
<Compile Include="Extensions\AccountExtension.cs" />
<Compile Include="Extensions\BillExtension.cs" />
<Compile Include="Extensions\InvoiceApplyExtension.cs" />
<Compile Include="Extensions\PayExtension.cs" />
<Compile Include="Extensions\PaymentExtension.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Transforms\RestfulAccount.cs" />
<Compile Include="Transforms\RestfulAccountDetail.cs" />
<Compile Include="Transforms\RestfulBill.cs" />
<Compile Include="Transforms\RestfulInvoice.Debit.cs" />
<Compile Include="Transforms\RestfulInvoiceApply.Apply.cs" />
<Compile Include="Transforms\RestfulPay.cs" />
<Compile Include="Transforms\RestfulPayment.Accept.cs" />
<Compile Include="Transforms\RestfulPayment.Account.cs" />
<Compile Include="Transforms\RestfulPayment.cs" />
<Compile Include="Transforms\RestfulPayment.Offset.cs" />
<Compile Include="Transforms\RestfulPayment.Split.cs" />
<Compile Include="Transforms\RestfulPayment.UnBiz.Refund.cs" />
<Compile Include="Transforms\RestfulSettlement.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Kivii.Biz.Finances.V4.5")]
[assembly: AssemblyDescription("财务管理模块")]
[assembly: AssemblyDefaultAlias("Kivii.Finances")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Kivii.Biz.Finances.V4.5")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("8d9479e9-5c4f-4d96-8bc1-c771be0d91b1")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2021.09140")]
[assembly: AssemblyFileVersion("5.4.2021.09140")]
using Kivii.Finances.Entities;
using Kivii.Linq;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Transforms
{
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountCreate : RestfulCreate<Account>
{
private IDbTransaction _trans;
public override bool OnPreRestfulCreate(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulCreateResponse<Account> rtns)
{
if (Item.OwnerKvid == Guid.Empty) throw new Exception("未指定账户所有人");
if (Item.OwnerName.IsNullOrEmpty()) throw new Exception("未指定账户所有人名称");
if (Item.Currency == CurrencyUnit.Unsupported) throw new Exception("不支持的货币类型!");
if (Item.Type == AccountType.Unsupported || Item.Type == AccountType.Balance || Item.Type == AccountType.Biz || Item.Type == AccountType.Coupon || Item.Type == AccountType.Pos || Item.Type == AccountType.StoredCard || Item.Type == AccountType.Cash) throw new Exception("不支持的账户类型!");
if (Item.Amount != 0) throw new Exception("开户时,户内金额只能为零!");
if (Item.Type == AccountType.Deposit && dbConnection.Exists<Account>(o => o.Name == Item.Name && o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.Deposit && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在此客户的存款账户");
if (Item.Type == AccountType.WeChat && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.WeChat && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在微信账户!");
if (Item.Type == AccountType.AliPay && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.AliPay && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在支付宝账户!");
if (Item.Type == AccountType.Bank && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.Bank && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在银行账户!");
_trans = dbConnection.OpenTransaction();
return base.OnPreRestfulCreate(req, res, dbConnection, rtns);
}
public override bool OnPostRestfulCreate(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulCreateResponse<Account> rtns)
{
//新建开户记录
var accountDetail = new AccountDetail();
accountDetail.AccountKvid = Item.Kvid;
accountDetail.BizKvid = Item.Kvid;
accountDetail.BizType = typeof(Account).FullName;
accountDetail.BizId = Item.SerialNumber;
accountDetail.PayerKvid = Item.Kvid;
accountDetail.PayerName = Item.Name;
accountDetail.PayerAccountKvid = Item.Kvid;
accountDetail.PayerAccountName = Item.Name;
accountDetail.PayerAccountSerialNumber = Item.SerialNumber;
accountDetail.PayeeKvid = Item.Kvid;
accountDetail.PayeeName = Item.Name;
accountDetail.PayeeAccountKvid = Item.Kvid;
accountDetail.PayeeAccountName = Item.Name;
accountDetail.PayeeAccountSerialNumber = Item.SerialNumber;
accountDetail.AmountPayment = 0;
accountDetail.Amount = 0;
accountDetail.Summary = "开户";
accountDetail.Remark = "开户";
dbConnection.Insert(accountDetail);
_trans.Commit();
return base.OnPostRestfulCreate(req, res, dbConnection, rtns);
}
}
[Api(Description = "账户查询")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountQuery : RestfulExecution<Account>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Account>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Account>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.Type != AccountType.Balance);
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountQueryEx : RestfulQuery<Account>
{
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountRead : RestfulRead<Account>
{
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountUpdate : RestfulUpdate<Account>
{
}
[Api(Description = "获取一个折扣账户")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountGetDiscount : RestfulExecution<Account>
{
public CurrencyUnit Currency { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
(Currency == CurrencyUnit.Unsupported).ThrowIfTrue("不支持的货币单位!");
var rtns = new RestfulReadResponse<Account>();
rtns.Result = Currency.GetDiscountAccount();
return rtns;
}
}
}
using Kivii.Finances.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Transforms
{
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountDetailQuery : RestfulQuery<AccountDetail>
{ }
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountDetailRead : RestfulRead<AccountDetail>
{ }
}
using Kivii.Finances.Entities;
using Kivii.Linq;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Transforms
{
[Api(Description = "创建账单")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillCreate : RestfulExecution<Bill>
{
public List<Guid> SettlementKvids { get; set; }
public Bill Item { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
if (Item.PayerName.IsNullOrEmpty() || Item.PayeeName.IsNullOrEmpty()) throw new Exception("收付双方不能为空!");
if (Item.Currency == CurrencyUnit.Unsupported) throw new Exception("未传入货币单位!");
if (SettlementKvids.IsNullOrEmpty()) throw new Exception("未传入结算数据");
var conn = KiviiContext.GetOpenedDbConnection<Bill>();
conn.InitEntityType<Bill>();
conn.InitEntityType<BillDetail>();
var settlements = conn.SelectByIds<Settlement>(SettlementKvids);
if (settlements == null) throw new Exception("无对应数据导出!");
(settlements.Exists(o => o.Currency != Item.Currency)).ThrowIfTrue("存在于账单不一致的货币单位不可制作!");
if (Item.Amount != settlements.Sum(o => o.Amount)) throw new Exception("账单金额不等于选择的结算金额之和!");
var rtns = new RestfulCreateResponse<Bill>();
rtns.Results = new List<Bill>();
var trans = conn.OpenTransaction();
try
{
var billKvid = Guid.NewGuid();
Item.Kvid = billKvid;
Item.OperateTime = DateTime.Now;
Item.OperatorKvid = KiviiContext.CurrentMember.Kvid;
Item.OperatorName = KiviiContext.CurrentMember.FullName;
Item.OwnerKvid = KiviiContext.CurrentMember.DepartmentKvid;
Item.OwnerName = KiviiContext.CurrentMember.DepartmentName;
conn.Insert(Item);
rtns.Results.Add(Item);
foreach (var settlement in settlements)
{
var billDetail = new BillDetail();
billDetail.BillKvid = billKvid;
billDetail.BizId = settlement.SerialNumber;
billDetail.BizType = typeof(Settlement).FullName;
billDetail.BizKvid = settlement.Kvid;
billDetail.Type = settlement.Type;
billDetail.Amount = settlement.Amount;
billDetail.Currency = settlement.Currency;
billDetail.Summary = settlement.Summary;
billDetail.Remark = settlement.Remark;
billDetail.OperateTime = DateTime.Now;
billDetail.OperatorKvid = KiviiContext.CurrentMember.Kvid;
billDetail.OperatorName = KiviiContext.CurrentMember.FullName;
conn.Insert(billDetail);
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
return rtns;
}
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillUpdate : RestfulUpdate<Bill>
{
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillRead : RestfulRead<Bill>
{
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillQuery : RestfulQuery<Bill>
{
/// <summary>
/// true:只查已经归档的账单
/// false:只查未支付的账单
/// 不传入: 全部账单
/// </summary>
public bool? Payed { get; set; }
public override bool OnPreRestfulQuery(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulQueryResponse<Bill> rtns, ref Expression<Func<Bill, bool>> where)
{
if (Payed == null) return base.OnPreRestfulQuery(req, res, dbConnection, rtns, ref where);
if (Payed.Value) where = o => o.Amount == o.AmountPayment;
if (!Payed.Value) where = o => o.Amount > o.AmountPayment;
return base.OnPreRestfulQuery(req, res, dbConnection, rtns, ref where);
}
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillDelete: RestfulDelete<Bill>
{
IDbTransaction _trans = null;
public override bool OnPreRestfulDelete(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulDeleteResponse<Bill> rtns)
{
dbConnection.Exists<Bill>(o => Sql.In(o.Kvid, Kvids) && o.AmountPayment == o.Amount).ThrowIfTrue("此账单已归档付款登记,无法删除");
_trans = dbConnection.OpenTransaction();
return base.OnPreRestfulDelete(req, res, dbConnection, rtns);
}
public override bool OnPostRestfulDelete(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulDeleteResponse<Bill> rtns)
{
try
{
var deleteBillDetails = dbConnection.From<BillDetail>().Update(o => o.Status).Where(o => Sql.In(o.BillKvid, Kvids));
dbConnection.UpdateOnly<BillDetail>(new BillDetail { Status = -1 }, deleteBillDetails);
_trans.Commit();
}
catch (Exception ex)
{
_trans.Rollback();
throw ex;
}
return base.OnPostRestfulDelete(req, res, dbConnection, rtns);
}
}
[Api(Description = "账单归档")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillArchiving : RestfulExecution<Bill>
{
public Guid Kvid { get; set; }
public List<Guid> Kvids { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
(Kvid == null && Kvids.IsNullOrEmpty()).ThrowIfTrue("请传入要结算的内容!");
if (Kvids.IsNullOrEmpty()) Kvids = new List<Guid>();
if (Kvid != null) Kvids.Add(Kvid);
var conn = KiviiContext.GetOpenedDbConnection<Bill>();
var bills = conn.SelectByIds<Bill>(Kvids);
if (bills.IsNullOrEmpty()) throw new Exception("未找到传入的账单信息!");
var rtns = new RestfulUpdateResponse<Bill>();
rtns.Results = new List<Bill>();
var allBillDetails = conn.Select<BillDetail>(o => Sql.In(o.BillKvid, bills.ConvertAll(p => p.Kvid)));
var allSettlements = conn.Select<Settlement>(o => Sql.In(o.Kvid, allBillDetails.ConvertAll(p => p.BizKvid)));
foreach (var bill in bills)
{
var billDetails = allBillDetails.Where(o => o.BillKvid == bill.Kvid).ToList();
if (billDetails.IsNullOrEmpty()) continue;
var settlements = allSettlements.Where(o => billDetails.ConvertAll(p => p.BizKvid).Contains(o.Kvid)).ToList();
if (settlements.IsNullOrEmpty())//未找到结算信息 说明此账单没有费用
{
bill.Amount = 0;
bill.AddOnlyProperties(o => o.Amount);
bill.AmountPlan = 0;
bill.AddOnlyProperties(o => o.AmountPlan);
bill.AmountPayment = 0;
bill.AddOnlyProperties(o => o.AmountPayment);
conn.UpdateOnly(bill);
rtns.Results.Add(bill);
continue;
}
bill.Amount = settlements.Sum(o => o.Amount);
bill.AddOnlyProperties(o => o.Amount);
bill.AmountPlan = settlements.Sum(o => o.AmountPlan);
bill.AddOnlyProperties(o => o.AmountPlan);
bill.AmountPayment = settlements.Sum(o => o.AmountPayment);
bill.AddOnlyProperties(o => o.AmountPayment);
conn.UpdateOnly(bill);
rtns.Results.Add(bill);
}
return rtns;
}
}
}
using Kivii.Finances.Entities;
using Kivii.Linq;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Transforms
{
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentQuery : RestfulQuery<Payment>
{
}
[Api(Description = "到账查询")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentQueryEx : RestfulExecution<Payment>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
public bool? IsPayee { get; set; }//查收款还是付款
public bool? IsSplit { get; set; }//查是否已经拆分认领
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Bank, PaymentType.Cash, PaymentType.Pos));
if (IsSplit != null)
{
if (IsSplit.Value) sqlExpress.And(o => o.AmountSplited > 0 && o.AmountSplited == o.Amount);
else sqlExpress.And(o => o.AmountSplited == 0 || o.AmountSplited < o.Amount);
}
if (IsPayee != null)
{
var queryBankAccount = conn.From<Account>();
queryBankAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Bank, AccountType.WeChat, AccountType.AliPay));
queryBankAccount.Select(o => o.Kvid);
var queryCashAccount = conn.From<Account>();
queryCashAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Cash, AccountType.Pos));
queryCashAccount.Select(o => o.Kvid);
if (IsPayee.Value)//收款
{
sqlExpress.And(o => (Sql.In(o.PayeeAccountKvid, queryBankAccount) || Sql.In(o.PayerAccountKvid, queryCashAccount)));
}
else sqlExpress.And(o => Sql.In(o.PayerAccountKvid, queryBankAccount));
}
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
[Api(Description = "到账开票查询")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentInvoiceApplyQuery : RestfulExecution<Payment>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
//public bool Group { get; set; }//合并分组的
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Cash, PaymentType.Pos, PaymentType.Split));
sqlExpress.And(o => o.AmountInvoice <= 0 && o.AmountInvoice < o.Amount);
var queryInvoiceApplyRelations = conn.From<InvoiceApply>();
queryInvoiceApplyRelations.Where(o => o.OperateType == InvoiceApplyType.Related && o.OffsetKvid == Guid.Empty);
queryInvoiceApplyRelations.Select(o => o.BizKvid);
sqlExpress.And(o => !Sql.In(o.Kvid, queryInvoiceApplyRelations));
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
[Api(Description = "到账冲销查询")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentInvoiceDebitQuery : RestfulExecution<Payment>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Bank, PaymentType.Cash, PaymentType.Pos) && o.AmountInvoice < o.Amount);
var queryBankAccount = conn.From<Account>();
queryBankAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Bank, AccountType.WeChat, AccountType.AliPay));
queryBankAccount.Select(o => o.Kvid);
var queryCashAccount = conn.From<Account>();
queryCashAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Cash, AccountType.Pos));
queryCashAccount.Select(o => o.Kvid);
sqlExpress.And(o => (Sql.In(o.PayeeAccountKvid, queryBankAccount) || Sql.In(o.PayerAccountKvid, queryCashAccount)));
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Kivii.Common" version="5.6.2021.10000" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2021.10000" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2021.10190" targetFramework="net45" />
</packages>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment