250 lines
9.4 KiB
Go
250 lines
9.4 KiB
Go
|
|
package services
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
"tyapi-server/internal/domains/finance/entities"
|
||
|
|
"tyapi-server/internal/domains/finance/repositories"
|
||
|
|
"tyapi-server/internal/domains/finance/value_objects"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
// UserInvoiceInfoService 用户开票信息服务接口
|
||
|
|
type UserInvoiceInfoService interface {
|
||
|
|
// GetUserInvoiceInfo 获取用户开票信息
|
||
|
|
GetUserInvoiceInfo(ctx context.Context, userID string) (*entities.UserInvoiceInfo, error)
|
||
|
|
|
||
|
|
// GetUserInvoiceInfoWithEnterpriseInfo 获取用户开票信息(包含企业认证信息)
|
||
|
|
GetUserInvoiceInfoWithEnterpriseInfo(ctx context.Context, userID string, companyName, taxpayerID string) (*entities.UserInvoiceInfo, error)
|
||
|
|
|
||
|
|
// CreateOrUpdateUserInvoiceInfo 创建或更新用户开票信息
|
||
|
|
CreateOrUpdateUserInvoiceInfo(ctx context.Context, userID string, invoiceInfo *value_objects.InvoiceInfo) (*entities.UserInvoiceInfo, error)
|
||
|
|
|
||
|
|
// CreateOrUpdateUserInvoiceInfoWithEnterpriseInfo 创建或更新用户开票信息(包含企业认证信息)
|
||
|
|
CreateOrUpdateUserInvoiceInfoWithEnterpriseInfo(ctx context.Context, userID string, invoiceInfo *value_objects.InvoiceInfo, companyName, taxpayerID string) (*entities.UserInvoiceInfo, error)
|
||
|
|
|
||
|
|
// ValidateInvoiceInfo 验证开票信息
|
||
|
|
ValidateInvoiceInfo(ctx context.Context, invoiceInfo *value_objects.InvoiceInfo, invoiceType value_objects.InvoiceType) error
|
||
|
|
|
||
|
|
// DeleteUserInvoiceInfo 删除用户开票信息
|
||
|
|
DeleteUserInvoiceInfo(ctx context.Context, userID string) error
|
||
|
|
}
|
||
|
|
|
||
|
|
// UserInvoiceInfoServiceImpl 用户开票信息服务实现
|
||
|
|
type UserInvoiceInfoServiceImpl struct {
|
||
|
|
userInvoiceInfoRepo repositories.UserInvoiceInfoRepository
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewUserInvoiceInfoService 创建用户开票信息服务
|
||
|
|
func NewUserInvoiceInfoService(userInvoiceInfoRepo repositories.UserInvoiceInfoRepository) UserInvoiceInfoService {
|
||
|
|
return &UserInvoiceInfoServiceImpl{
|
||
|
|
userInvoiceInfoRepo: userInvoiceInfoRepo,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetUserInvoiceInfo 获取用户开票信息
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) GetUserInvoiceInfo(ctx context.Context, userID string) (*entities.UserInvoiceInfo, error) {
|
||
|
|
info, err := s.userInvoiceInfoRepo.FindByUserID(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("获取用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 如果没有找到开票信息记录,创建新的实体
|
||
|
|
if info == nil {
|
||
|
|
info = &entities.UserInvoiceInfo{
|
||
|
|
ID: uuid.New().String(),
|
||
|
|
UserID: userID,
|
||
|
|
CompanyName: "",
|
||
|
|
TaxpayerID: "",
|
||
|
|
BankName: "",
|
||
|
|
BankAccount: "",
|
||
|
|
CompanyAddress: "",
|
||
|
|
CompanyPhone: "",
|
||
|
|
ReceivingEmail: "",
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return info, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetUserInvoiceInfoWithEnterpriseInfo 获取用户开票信息(包含企业认证信息)
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) GetUserInvoiceInfoWithEnterpriseInfo(ctx context.Context, userID string, companyName, taxpayerID string) (*entities.UserInvoiceInfo, error) {
|
||
|
|
info, err := s.userInvoiceInfoRepo.FindByUserID(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("获取用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 如果没有找到开票信息记录,创建新的实体
|
||
|
|
if info == nil {
|
||
|
|
info = &entities.UserInvoiceInfo{
|
||
|
|
ID: uuid.New().String(),
|
||
|
|
UserID: userID,
|
||
|
|
CompanyName: companyName, // 使用企业认证信息填充
|
||
|
|
TaxpayerID: taxpayerID, // 使用企业认证信息填充
|
||
|
|
BankName: "",
|
||
|
|
BankAccount: "",
|
||
|
|
CompanyAddress: "",
|
||
|
|
CompanyPhone: "",
|
||
|
|
ReceivingEmail: "",
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
// 如果已有记录,使用传入的企业认证信息覆盖公司名称和纳税人识别号
|
||
|
|
if companyName != "" {
|
||
|
|
info.CompanyName = companyName
|
||
|
|
}
|
||
|
|
if taxpayerID != "" {
|
||
|
|
info.TaxpayerID = taxpayerID
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return info, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateOrUpdateUserInvoiceInfo 创建或更新用户开票信息
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) CreateOrUpdateUserInvoiceInfo(ctx context.Context, userID string, invoiceInfo *value_objects.InvoiceInfo) (*entities.UserInvoiceInfo, error) {
|
||
|
|
// 验证开票信息
|
||
|
|
if err := s.ValidateInvoiceInfo(ctx, invoiceInfo, value_objects.InvoiceTypeGeneral); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否已存在
|
||
|
|
exists, err := s.userInvoiceInfoRepo.Exists(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("检查用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var userInvoiceInfo *entities.UserInvoiceInfo
|
||
|
|
|
||
|
|
if exists {
|
||
|
|
// 更新现有记录
|
||
|
|
userInvoiceInfo, err = s.userInvoiceInfoRepo.FindByUserID(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("获取用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新字段
|
||
|
|
userInvoiceInfo.CompanyName = invoiceInfo.CompanyName
|
||
|
|
userInvoiceInfo.TaxpayerID = invoiceInfo.TaxpayerID
|
||
|
|
userInvoiceInfo.BankName = invoiceInfo.BankName
|
||
|
|
userInvoiceInfo.BankAccount = invoiceInfo.BankAccount
|
||
|
|
userInvoiceInfo.CompanyAddress = invoiceInfo.CompanyAddress
|
||
|
|
userInvoiceInfo.CompanyPhone = invoiceInfo.CompanyPhone
|
||
|
|
userInvoiceInfo.ReceivingEmail = invoiceInfo.ReceivingEmail
|
||
|
|
|
||
|
|
err = s.userInvoiceInfoRepo.Update(ctx, userInvoiceInfo)
|
||
|
|
} else {
|
||
|
|
// 创建新记录
|
||
|
|
userInvoiceInfo = &entities.UserInvoiceInfo{
|
||
|
|
ID: uuid.New().String(),
|
||
|
|
UserID: userID,
|
||
|
|
CompanyName: invoiceInfo.CompanyName,
|
||
|
|
TaxpayerID: invoiceInfo.TaxpayerID,
|
||
|
|
BankName: invoiceInfo.BankName,
|
||
|
|
BankAccount: invoiceInfo.BankAccount,
|
||
|
|
CompanyAddress: invoiceInfo.CompanyAddress,
|
||
|
|
CompanyPhone: invoiceInfo.CompanyPhone,
|
||
|
|
ReceivingEmail: invoiceInfo.ReceivingEmail,
|
||
|
|
}
|
||
|
|
|
||
|
|
err = s.userInvoiceInfoRepo.Create(ctx, userInvoiceInfo)
|
||
|
|
}
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("保存用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
return userInvoiceInfo, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateOrUpdateUserInvoiceInfoWithEnterpriseInfo 创建或更新用户开票信息(包含企业认证信息)
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) CreateOrUpdateUserInvoiceInfoWithEnterpriseInfo(ctx context.Context, userID string, invoiceInfo *value_objects.InvoiceInfo, companyName, taxpayerID string) (*entities.UserInvoiceInfo, error) {
|
||
|
|
// 检查企业认证信息
|
||
|
|
if companyName == "" || taxpayerID == "" {
|
||
|
|
return nil, fmt.Errorf("用户未完成企业认证,无法创建开票信息")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 创建新的开票信息对象,使用传入的企业认证信息
|
||
|
|
updatedInvoiceInfo := &value_objects.InvoiceInfo{
|
||
|
|
CompanyName: companyName, // 从企业认证信息获取
|
||
|
|
TaxpayerID: taxpayerID, // 从企业认证信息获取
|
||
|
|
BankName: invoiceInfo.BankName, // 用户输入
|
||
|
|
BankAccount: invoiceInfo.BankAccount, // 用户输入
|
||
|
|
CompanyAddress: invoiceInfo.CompanyAddress, // 用户输入
|
||
|
|
CompanyPhone: invoiceInfo.CompanyPhone, // 用户输入
|
||
|
|
ReceivingEmail: invoiceInfo.ReceivingEmail, // 用户输入
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证开票信息
|
||
|
|
if err := s.ValidateInvoiceInfo(ctx, updatedInvoiceInfo, value_objects.InvoiceTypeGeneral); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否已存在
|
||
|
|
exists, err := s.userInvoiceInfoRepo.Exists(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("检查用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var userInvoiceInfo *entities.UserInvoiceInfo
|
||
|
|
|
||
|
|
if exists {
|
||
|
|
// 更新现有记录
|
||
|
|
userInvoiceInfo, err = s.userInvoiceInfoRepo.FindByUserID(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("获取用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新字段(公司名称和纳税人识别号从企业认证信息获取,其他字段从用户输入获取)
|
||
|
|
userInvoiceInfo.CompanyName = companyName
|
||
|
|
userInvoiceInfo.TaxpayerID = taxpayerID
|
||
|
|
userInvoiceInfo.BankName = invoiceInfo.BankName
|
||
|
|
userInvoiceInfo.BankAccount = invoiceInfo.BankAccount
|
||
|
|
userInvoiceInfo.CompanyAddress = invoiceInfo.CompanyAddress
|
||
|
|
userInvoiceInfo.CompanyPhone = invoiceInfo.CompanyPhone
|
||
|
|
userInvoiceInfo.ReceivingEmail = invoiceInfo.ReceivingEmail
|
||
|
|
|
||
|
|
err = s.userInvoiceInfoRepo.Update(ctx, userInvoiceInfo)
|
||
|
|
} else {
|
||
|
|
// 创建新记录
|
||
|
|
userInvoiceInfo = &entities.UserInvoiceInfo{
|
||
|
|
ID: uuid.New().String(),
|
||
|
|
UserID: userID,
|
||
|
|
CompanyName: companyName, // 从企业认证信息获取
|
||
|
|
TaxpayerID: taxpayerID, // 从企业认证信息获取
|
||
|
|
BankName: invoiceInfo.BankName, // 用户输入
|
||
|
|
BankAccount: invoiceInfo.BankAccount, // 用户输入
|
||
|
|
CompanyAddress: invoiceInfo.CompanyAddress, // 用户输入
|
||
|
|
CompanyPhone: invoiceInfo.CompanyPhone, // 用户输入
|
||
|
|
ReceivingEmail: invoiceInfo.ReceivingEmail, // 用户输入
|
||
|
|
}
|
||
|
|
|
||
|
|
err = s.userInvoiceInfoRepo.Create(ctx, userInvoiceInfo)
|
||
|
|
}
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("保存用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
return userInvoiceInfo, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidateInvoiceInfo 验证开票信息
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) ValidateInvoiceInfo(ctx context.Context, invoiceInfo *value_objects.InvoiceInfo, invoiceType value_objects.InvoiceType) error {
|
||
|
|
if invoiceType == value_objects.InvoiceTypeGeneral {
|
||
|
|
return invoiceInfo.ValidateForGeneralInvoice()
|
||
|
|
} else if invoiceType == value_objects.InvoiceTypeSpecial {
|
||
|
|
return invoiceInfo.ValidateForSpecialInvoice()
|
||
|
|
}
|
||
|
|
|
||
|
|
return fmt.Errorf("无效的发票类型: %s", invoiceType)
|
||
|
|
}
|
||
|
|
|
||
|
|
// DeleteUserInvoiceInfo 删除用户开票信息
|
||
|
|
func (s *UserInvoiceInfoServiceImpl) DeleteUserInvoiceInfo(ctx context.Context, userID string) error {
|
||
|
|
err := s.userInvoiceInfoRepo.Delete(ctx, userID)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("删除用户开票信息失败: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|