Skip to content

Tích hợp IIAPI

IIAPI (Invoice Integration API) là một thành phần tích hợp hóa đơn điện tử kết nối ứng dụng của bạn với các nhà cung cấp T-VAN (Mạng giá trị gia tăng về thuế) để tuân thủ thuế tại Việt Nam.

Tổng quan

Thuộc tínhGiá trị
Gói@nx/iiapi
Trạng tháiProduction
Mục đíchQuản lý hóa đơn điện tử tuân thủ thuế Việt Nam
Nhà cung cấpHỗ trợ nhiều nhà cung cấp T-VAN

Tính năng Chính

  • Hỗ trợ đa nhà cung cấp - Kết nối với nhiều nhà cung cấp T-VAN khác nhau
  • Vòng đời hóa đơn đầy đủ - Tạo, cập nhật, xóa và quản lý hóa đơn
  • Nhiều loại hóa đơn - Hóa đơn GTGT, POS, Bán hàng, Vé, Biên lai
  • Hỗ trợ Webhook - Nhận cập nhật trạng thái hóa đơn
  • Tuân thủ cơ quan thuế - Sẵn sàng cho các yêu cầu của CQT (Tổng cục Thuế)

Bắt đầu Nhanh

1. Cấu hình ứng dụng của bạn

typescript
// application.ts
import { NxIIAPIComponent, IIAPIBindingKeys, IIIAPIOptions } from '@nx/iiapi';

class MyApplication extends BaseApplication {
  preConfigure() {
    // Cấu hình các client IIAPI
    this.bind<IIIAPIOptions>({ key: IIAPIBindingKeys.IIAPI_CLIENT_OPTIONS })
      .toValue({
        enableControllers: true,
        clients: [
          {
            name: 'default',
            provider: 'VIETTEL',
            apiKey: process.env.IIAPI_API_KEY,
            secretKey: process.env.IIAPI_SECRET_KEY,
            taxCode: process.env.COMPANY_TAX_CODE,
            isProduction: process.env.NODE_ENV === 'production',
          },
        ],
      });

    // Tải thành phần IIAPI
    this.component(NxIIAPIComponent);
  }
}

2. Thiết lập biến môi trường

bash
# Cấu hình IIAPI
APP_ENV_IIAPI_API_KEY=your-api-key
APP_ENV_IIAPI_SECRET_KEY=your-secret-key
APP_ENV_IIAPI_TAX_CODE=0123456789
APP_ENV_IIAPI_PROVIDER=VIETTEL
APP_ENV_IIAPI_IS_PRODUCTION=false

Kiến trúc

Cấu trúc Thành phần

🧩
NxIIAPIComponent
Thành phần tích hợp hóa đơn điện tử
🔗
Custom Bindings
🏭IIAPIClientProviderFactory client
📚IIAPIClientRegistryRegistry đa client
⚙️
Dịch vụ (15)
📄VATInvoiceServiceThao tác hóa đơn GTGT
🏪POSVATInvoiceServiceHóa đơn GTGT POS
🛒POSSaleInvoiceServiceHóa đơn bán hàng POS
🎫TicketVATInvoiceServiceHóa đơn GTGT vé
🧾SaleInvoiceServiceHóa đơn bán hàng
📋ReceiptServiceQuản lý biên lai
📦InternalDeliveryServicePhiếu xuất kho nội bộ
🔄InvoiceManagementServiceVòng đời hóa đơn
✏️InvoiceUpdateServiceCập nhật hóa đơn
🗑️InvoiceDeleteServiceXóa hóa đơn
📝InvoiceTypeServiceQuản lý loại hóa đơn
🔔WebhookServiceXử lý webhook
🔐OtpServiceXác minh OTP
📜PitCertificateServiceChứng từ khấu trừ thuế TNCN
⚠️NotificationErrorServiceThông báo lỗi
🌐
Controllers (15)
REST API endpoints tương ứng với từng dịch vụ

Các loại Hóa đơn

📄Hóa đơn GTGT
Hóa đơn thuế đầy đủGiao dịch B2BĐược khấu trừ thuế
🧾Hóa đơn Bán hàng
Không cần thông tin người muaBán lẻ B2CĐịnh dạng đơn giản
🎫
Vé vận tải/Sự kiệnĐịnh dạng đặc biệtBố cục theo quy định
🏪Hóa đơn GTGT POS
Tạo từ máy POSGửi thời gian thựcTự động gửi đến T-VAN
🛒Hóa đơn Bán hàng POS
Bán lẻ POSThanh toán nhanhĐịnh dạng đơn giản
📋Biên lai
Biên lai phi thuếSử dụng nội bộChỉ để tham khảo

Vòng đời Hóa đơn

Định nghĩa Trạng thái

Trạng tháiMô tảHành động Có sẵn
DRAFTHóa đơn đã tạo, chưa gửiSửa, Xóa, Gửi
PENDINGĐã gửi đến T-VAN, đang chờ kýHủy
SIGNEDĐã được ký số bởi T-VANGửi đến CQT
SENTĐã gửi đến Cơ quan ThuếChờ phản hồi
ACCEPTEDCQT đã chấp nhận hóa đơnĐiều chỉnh, Thay thế
REJECTEDCQT đã từ chối hóa đơnSửa, Gửi lại
CANCELLEDHóa đơn đã hủy-

Tham khảo API

Tạo Hóa đơn GTGT

typescript
import { inject } from '@venizia/ignis';
import { VATInvoiceService } from '@nx/iiapi';

class InvoiceController {
  constructor(
    @inject({ key: 'services.VATInvoiceService' })
    private vatInvoiceService: VATInvoiceService,
  ) {}

  async createInvoice() {
    const invoice = await this.vatInvoiceService.create({
      // Thông tin người bán
      seller: {
        taxCode: '0123456789',
        name: 'Tên Công ty Của Bạn',
        address: '123 Đường phố, Quận, Thành phố',
      },

      // Thông tin người mua
      buyer: {
        taxCode: '9876543210',
        name: 'Công ty Khách hàng',
        address: '456 Đại lộ, Quận, Thành phố',
      },

      // Chi tiết hóa đơn
      invoiceDate: new Date(),
      currencyCode: 'VND',
      exchangeRate: 1,

      // Các mặt hàng
      items: [
        {
          itemName: 'Sản phẩm A',
          unitName: 'Cái',
          quantity: 10,
          unitPrice: 100000,
          amount: 1000000,
          vatRate: 10,
          vatAmount: 100000,
        },
      ],

      // Tổng cộng
      totalAmount: 1000000,
      totalVatAmount: 100000,
      totalPayment: 1100000,
    });

    return invoice;
  }
}

Tạo Hóa đơn POS

typescript
// Tạo nhanh hóa đơn POS
const posInvoice = await this.posSaleInvoiceService.create({
  // Các trường bắt buộc tối thiểu
  invoiceDate: new Date(),
  items: [
    {
      itemName: 'Cà phê',
      quantity: 2,
      unitPrice: 50000,
      amount: 100000,
    },
  ],
  totalAmount: 100000,
  paymentMethod: 'CASH',
});

Gửi Hóa đơn đến T-VAN

typescript
// Gửi hóa đơn nháp
const result = await this.invoiceManagementService.submit({
  invoiceId: 'inv-uuid-123',
  clientName: 'default', // Client T-VAN nào sẽ được sử dụng
});

// Kết quả chứa hóa đơn đã ký với:
// - Số hóa đơn (tự động gán)
// - Chữ ký số
// - Tham chiếu T-VAN

Xử lý Webhook

typescript
// T-VAN gửi cập nhật trạng thái qua webhook
app.post('/api/iiapi/webhook', async (c) => {
  const webhookData = await c.req.json();

  await this.webhookService.process({
    provider: webhookData.provider,
    event: webhookData.event,
    invoiceId: webhookData.invoiceId,
    status: webhookData.status,
    data: webhookData.data,
  });

  return c.json({ received: true });
});

Cấu hình Đa Client

IIAPI hỗ trợ nhiều client T-VAN cho các kịch bản kinh doanh khác nhau:

typescript
this.bind<IIIAPIOptions>({ key: IIAPIBindingKeys.IIAPI_CLIENT_OPTIONS })
  .toValue({
    enableControllers: true,
    clients: [
      // Nhà cung cấp T-VAN chính
      {
        name: 'primary',
        provider: 'VIETTEL',
        taxCode: '0123456789',
        apiKey: process.env.VIETTEL_API_KEY,
        isDefault: true,
      },
      // Nhà cung cấp T-VAN dự phòng
      {
        name: 'backup',
        provider: 'VNPT',
        taxCode: '0123456789',
        apiKey: process.env.VNPT_API_KEY,
      },
      // Công ty khác
      {
        name: 'subsidiary',
        provider: 'VIETTEL',
        taxCode: '9876543210',
        apiKey: process.env.SUBSIDIARY_API_KEY,
      },
    ],
  });

Sử dụng Client Cụ thể

typescript
// Sử dụng client mặc định
const invoice = await this.vatInvoiceService.create(data);

// Sử dụng client cụ thể
const invoice = await this.vatInvoiceService.create(data, {
  clientName: 'subsidiary',
});

Xử lý Lỗi

Các Lỗi Thường gặp

Mã lỗiMô tảGiải pháp
IIAPI_001Định dạng mã số thuế không hợp lệKiểm tra mã số thuế (10 hoặc 13 chữ số)
IIAPI_002Thiếu các trường bắt buộcXem lại các trường bắt buộc
IIAPI_003Kết nối T-VAN thất bạiKiểm tra thông tin API
IIAPI_004Hóa đơn đã được gửiKhông thể sửa hóa đơn đã gửi
IIAPI_005CQT từ chốiKiểm tra lý do từ chối, sửa dữ liệu

Chiến lược Thử lại

typescript
// Tích hợp sẵn thử lại cho các lỗi tạm thời
const result = await this.invoiceManagementService.submit({
  invoiceId: 'inv-uuid-123',
  options: {
    maxRetries: 3,
    retryDelay: 1000,
  },
});

Tuân thủ Thuế Việt Nam

Yêu cầu Nghị định 123/2020

Yêu cầuIIAPI Hỗ trợ
Gửi hóa đơn thời gian thựcCó, thông qua T-VAN
Chữ ký sốCó, T-VAN ký
Định dạng số hóa đơnTự động tạo
Lưu trữ dữ liệu 10 nămTrách nhiệm của bạn
Kết nối CQTThông qua các nhà cung cấp T-VAN

Cập nhật Nghị định 70/2025 (Hiệu lực từ tháng 1 năm 2026)

Yêu cầu MớiIIAPI Hỗ trợ
Hóa đơn điện tử ngay lập tức khi bánCác loại hóa đơn POS
Mã số thuế trên mỗi giao dịchTrường bắt buộc
Kết nối CQT thời gian thựcThông qua T-VAN

Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.