Skip to content

VAT Invoice

VAT Invoices are full tax invoices used for B2B transactions where the buyer needs tax deduction.

Overview

AttributeValue
ServiceVATInvoiceService
Tax DeductibleYes
Buyer InfoRequired
CQT SubmissionRequired

Required Fields

Seller Information

typescript
seller: {
  taxCode: '0123456789',      // Company tax code
  name: 'Your Company Name',   // Legal company name
  address: '123 Street',       // Registered address
  bankAccount: '1234567890',   // Bank account (optional)
  bankName: 'Vietcombank',     // Bank name (optional)
}

Buyer Information

typescript
buyer: {
  taxCode: '9876543210',       // Required for VAT invoices
  name: 'Customer Company',
  address: '456 Avenue',
  email: 'buyer@company.com',  // Optional
}

Invoice Items

typescript
items: [
  {
    itemName: 'Product A',
    unitName: 'Piece',
    quantity: 10,
    unitPrice: 100000,
    amount: 1000000,           // quantity * unitPrice
    vatRate: 10,               // 0, 5, 8, or 10
    vatAmount: 100000,         // amount * vatRate / 100
  },
]

Create VAT Invoice

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

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

  async createInvoice(orderData: OrderData) {
    const invoice = await this.vatService.create({
      // Seller (your company)
      seller: {
        taxCode: process.env.COMPANY_TAX_CODE,
        name: process.env.COMPANY_NAME,
        address: process.env.COMPANY_ADDRESS,
      },

      // Buyer (customer)
      buyer: {
        taxCode: orderData.customerTaxCode,
        name: orderData.customerName,
        address: orderData.customerAddress,
      },

      // Invoice details
      invoiceDate: new Date(),
      currencyCode: 'VND',
      exchangeRate: 1,

      // Items
      items: orderData.items.map(item => ({
        itemName: item.name,
        unitName: item.unit,
        quantity: item.quantity,
        unitPrice: item.price,
        amount: item.quantity * item.price,
        vatRate: 10,
        vatAmount: item.quantity * item.price * 0.1,
      })),

      // Totals
      totalAmount: orderData.subtotal,
      totalVatAmount: orderData.tax,
      totalPayment: orderData.total,
    });

    return invoice;
  }
}

VAT Rates

RateDescriptionExamples
0%Export, internationalExport goods
5%Essential goodsHealthcare, education
8%Reduced rateCertain services
10%Standard rateMost goods/services

Invoice Lifecycle

Create & Submit

Creating a VAT invoice submits it to the provider in a single call. VATInvoiceService exposes createOriginalInvoice, createAdjustmentInvoice, createReplacementInvoice, createBatchOriginalInvoices, and createInvoiceOutsideSystem - each takes the invoice data plus an optional clientName.

typescript
const result = await this.vatInvoiceService.createOriginalInvoice(
  invoiceData,
  'vnpay-client',
);

// Result is the provider response (code, message, and invoice identifiers)

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