Add coa purchase and vendors
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type AccountContract interface {
|
||||
CreateAccount(ctx context.Context, req *CreateAccountRequest) (*AccountResponse, error)
|
||||
GetAccountByID(ctx context.Context, id uuid.UUID) (*AccountResponse, error)
|
||||
UpdateAccount(ctx context.Context, id uuid.UUID, req *UpdateAccountRequest) (*AccountResponse, error)
|
||||
DeleteAccount(ctx context.Context, id uuid.UUID) error
|
||||
ListAccounts(ctx context.Context, req *ListAccountsRequest) ([]AccountResponse, int, error)
|
||||
GetAccountsByOrganization(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID) ([]AccountResponse, error)
|
||||
GetAccountsByChartOfAccount(ctx context.Context, chartOfAccountID uuid.UUID) ([]AccountResponse, error)
|
||||
UpdateAccountBalance(ctx context.Context, id uuid.UUID, req *UpdateAccountBalanceRequest) error
|
||||
GetAccountBalance(ctx context.Context, id uuid.UUID) (float64, error)
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreateAccountRequest struct {
|
||||
ChartOfAccountID uuid.UUID `json:"chart_of_account_id" validate:"required"`
|
||||
Name string `json:"name" validate:"required,min=1,max=255"`
|
||||
Number string `json:"number" validate:"required,min=1,max=50"`
|
||||
AccountType string `json:"account_type" validate:"required,oneof=cash wallet bank credit debit asset liability equity revenue expense"`
|
||||
OpeningBalance float64 `json:"opening_balance"`
|
||||
Description *string `json:"description"`
|
||||
}
|
||||
|
||||
type UpdateAccountRequest struct {
|
||||
ChartOfAccountID *uuid.UUID `json:"chart_of_account_id"`
|
||||
Name *string `json:"name" validate:"omitempty,min=1,max=255"`
|
||||
Number *string `json:"number" validate:"omitempty,min=1,max=50"`
|
||||
AccountType *string `json:"account_type" validate:"omitempty,oneof=cash wallet bank credit debit asset liability equity revenue expense"`
|
||||
OpeningBalance *float64 `json:"opening_balance"`
|
||||
Description *string `json:"description"`
|
||||
IsActive *bool `json:"is_active"`
|
||||
}
|
||||
|
||||
type AccountResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
OrganizationID uuid.UUID `json:"organization_id"`
|
||||
OutletID *uuid.UUID `json:"outlet_id"`
|
||||
ChartOfAccountID uuid.UUID `json:"chart_of_account_id"`
|
||||
Name string `json:"name"`
|
||||
Number string `json:"number"`
|
||||
AccountType string `json:"account_type"`
|
||||
OpeningBalance float64 `json:"opening_balance"`
|
||||
CurrentBalance float64 `json:"current_balance"`
|
||||
Description *string `json:"description"`
|
||||
IsActive bool `json:"is_active"`
|
||||
IsSystem bool `json:"is_system"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
UpdatedAt string `json:"updated_at"`
|
||||
ChartOfAccount *ChartOfAccountResponse `json:"chart_of_account,omitempty"`
|
||||
}
|
||||
|
||||
type ListAccountsRequest struct {
|
||||
OrganizationID *uuid.UUID `form:"organization_id"`
|
||||
OutletID *uuid.UUID `form:"outlet_id"`
|
||||
ChartOfAccountID *uuid.UUID `form:"chart_of_account_id"`
|
||||
AccountType *string `form:"account_type"`
|
||||
IsActive *bool `form:"is_active"`
|
||||
IsSystem *bool `form:"is_system"`
|
||||
Page int `form:"page,default=1"`
|
||||
Limit int `form:"limit,default=10"`
|
||||
}
|
||||
|
||||
type UpdateAccountBalanceRequest struct {
|
||||
Amount float64 `json:"amount" binding:"required"`
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type ChartOfAccountContract interface {
|
||||
CreateChartOfAccount(ctx context.Context, req *CreateChartOfAccountRequest) (*ChartOfAccountResponse, error)
|
||||
GetChartOfAccountByID(ctx context.Context, id uuid.UUID) (*ChartOfAccountResponse, error)
|
||||
UpdateChartOfAccount(ctx context.Context, id uuid.UUID, req *UpdateChartOfAccountRequest) (*ChartOfAccountResponse, error)
|
||||
DeleteChartOfAccount(ctx context.Context, id uuid.UUID) error
|
||||
ListChartOfAccounts(ctx context.Context, req *ListChartOfAccountsRequest) ([]ChartOfAccountResponse, int, error)
|
||||
GetChartOfAccountsByOrganization(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID) ([]ChartOfAccountResponse, error)
|
||||
GetChartOfAccountsByType(ctx context.Context, organizationID uuid.UUID, chartOfAccountTypeID uuid.UUID, outletID *uuid.UUID) ([]ChartOfAccountResponse, error)
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreateChartOfAccountRequest struct {
|
||||
ChartOfAccountTypeID uuid.UUID `json:"chart_of_account_type_id" validate:"required"`
|
||||
ParentID *uuid.UUID `json:"parent_id"`
|
||||
Name string `json:"name" validate:"required,min=1,max=255"`
|
||||
Code string `json:"code" validate:"required,min=1,max=20"`
|
||||
Description *string `json:"description"`
|
||||
}
|
||||
|
||||
type UpdateChartOfAccountRequest struct {
|
||||
ChartOfAccountTypeID *uuid.UUID `json:"chart_of_account_type_id"`
|
||||
ParentID *uuid.UUID `json:"parent_id"`
|
||||
Name *string `json:"name" validate:"omitempty,min=1,max=255"`
|
||||
Code *string `json:"code" validate:"omitempty,min=1,max=20"`
|
||||
Description *string `json:"description"`
|
||||
IsActive *bool `json:"is_active"`
|
||||
}
|
||||
|
||||
type ChartOfAccountResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
OrganizationID uuid.UUID `json:"organization_id"`
|
||||
OutletID *uuid.UUID `json:"outlet_id"`
|
||||
ChartOfAccountTypeID uuid.UUID `json:"chart_of_account_type_id"`
|
||||
ParentID *uuid.UUID `json:"parent_id"`
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
Description *string `json:"description"`
|
||||
IsActive bool `json:"is_active"`
|
||||
IsSystem bool `json:"is_system"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
UpdatedAt string `json:"updated_at"`
|
||||
ChartOfAccountType *ChartOfAccountTypeResponse `json:"chart_of_account_type,omitempty"`
|
||||
Parent *ChartOfAccountResponse `json:"parent,omitempty"`
|
||||
Children []ChartOfAccountResponse `json:"children,omitempty"`
|
||||
}
|
||||
|
||||
type ListChartOfAccountsRequest struct {
|
||||
OrganizationID *uuid.UUID `form:"organization_id"`
|
||||
OutletID *uuid.UUID `form:"outlet_id"`
|
||||
ChartOfAccountTypeID *uuid.UUID `form:"chart_of_account_type_id"`
|
||||
ParentID *uuid.UUID `form:"parent_id"`
|
||||
IsActive *bool `form:"is_active"`
|
||||
IsSystem *bool `form:"is_system"`
|
||||
Page int `form:"page,default=1"`
|
||||
Limit int `form:"limit,default=10"`
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type ChartOfAccountTypeContract interface {
|
||||
CreateChartOfAccountType(ctx context.Context, req *CreateChartOfAccountTypeRequest) (*ChartOfAccountTypeResponse, error)
|
||||
GetChartOfAccountTypeByID(ctx context.Context, id uuid.UUID) (*ChartOfAccountTypeResponse, error)
|
||||
UpdateChartOfAccountType(ctx context.Context, id uuid.UUID, req *UpdateChartOfAccountTypeRequest) (*ChartOfAccountTypeResponse, error)
|
||||
DeleteChartOfAccountType(ctx context.Context, id uuid.UUID) error
|
||||
ListChartOfAccountTypes(ctx context.Context, filters map[string]interface{}, page, limit int) ([]ChartOfAccountTypeResponse, int, error)
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreateChartOfAccountTypeRequest struct {
|
||||
Name string `json:"name" validate:"required,min=1,max=100"`
|
||||
Code string `json:"code" validate:"required,min=1,max=10"`
|
||||
Description *string `json:"description"`
|
||||
}
|
||||
|
||||
type UpdateChartOfAccountTypeRequest struct {
|
||||
Name *string `json:"name" validate:"omitempty,min=1,max=100"`
|
||||
Code *string `json:"code" validate:"omitempty,min=1,max=10"`
|
||||
Description *string `json:"description"`
|
||||
IsActive *bool `json:"is_active"`
|
||||
}
|
||||
|
||||
type ChartOfAccountTypeResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
Description *string `json:"description"`
|
||||
IsActive bool `json:"is_active"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
UpdatedAt string `json:"updated_at"`
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// Request DTOs
|
||||
type CreateIngredientUnitConverterRequest struct {
|
||||
IngredientID uuid.UUID `json:"ingredient_id" validate:"required"`
|
||||
FromUnitID uuid.UUID `json:"from_unit_id" validate:"required"`
|
||||
ToUnitID uuid.UUID `json:"to_unit_id" validate:"required"`
|
||||
ConversionFactor float64 `json:"conversion_factor" validate:"required,gt=0"`
|
||||
IsActive *bool `json:"is_active,omitempty" validate:"omitempty"`
|
||||
}
|
||||
|
||||
type UpdateIngredientUnitConverterRequest struct {
|
||||
FromUnitID *uuid.UUID `json:"from_unit_id,omitempty" validate:"omitempty"`
|
||||
ToUnitID *uuid.UUID `json:"to_unit_id,omitempty" validate:"omitempty"`
|
||||
ConversionFactor *float64 `json:"conversion_factor,omitempty" validate:"omitempty,gt=0"`
|
||||
IsActive *bool `json:"is_active,omitempty" validate:"omitempty"`
|
||||
}
|
||||
|
||||
type ListIngredientUnitConvertersRequest struct {
|
||||
IngredientID *uuid.UUID `json:"ingredient_id,omitempty"`
|
||||
FromUnitID *uuid.UUID `json:"from_unit_id,omitempty"`
|
||||
ToUnitID *uuid.UUID `json:"to_unit_id,omitempty"`
|
||||
IsActive *bool `json:"is_active,omitempty"`
|
||||
Search string `json:"search,omitempty"`
|
||||
Page int `json:"page" validate:"required,min=1"`
|
||||
Limit int `json:"limit" validate:"required,min=1,max=100"`
|
||||
}
|
||||
|
||||
type ConvertUnitRequest struct {
|
||||
IngredientID uuid.UUID `json:"ingredient_id" validate:"required"`
|
||||
FromUnitID uuid.UUID `json:"from_unit_id" validate:"required"`
|
||||
ToUnitID uuid.UUID `json:"to_unit_id" validate:"required"`
|
||||
Quantity float64 `json:"quantity" validate:"required,gt=0"`
|
||||
}
|
||||
|
||||
// Response DTOs
|
||||
type IngredientUnitConverterResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
OrganizationID uuid.UUID `json:"organization_id"`
|
||||
IngredientID uuid.UUID `json:"ingredient_id"`
|
||||
FromUnitID uuid.UUID `json:"from_unit_id"`
|
||||
ToUnitID uuid.UUID `json:"to_unit_id"`
|
||||
ConversionFactor float64 `json:"conversion_factor"`
|
||||
IsActive bool `json:"is_active"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy uuid.UUID `json:"created_by"`
|
||||
UpdatedBy uuid.UUID `json:"updated_by"`
|
||||
Ingredient *IngredientResponse `json:"ingredient,omitempty"`
|
||||
FromUnit *UnitResponse `json:"from_unit,omitempty"`
|
||||
ToUnit *UnitResponse `json:"to_unit,omitempty"`
|
||||
}
|
||||
|
||||
type ConvertUnitResponse struct {
|
||||
FromQuantity float64 `json:"from_quantity"`
|
||||
FromUnit *UnitResponse `json:"from_unit"`
|
||||
ToQuantity float64 `json:"to_quantity"`
|
||||
ToUnit *UnitResponse `json:"to_unit"`
|
||||
ConversionFactor float64 `json:"conversion_factor"`
|
||||
Ingredient *IngredientResponse `json:"ingredient,omitempty"`
|
||||
}
|
||||
|
||||
type ListIngredientUnitConvertersResponse struct {
|
||||
Converters []IngredientUnitConverterResponse `json:"converters"`
|
||||
TotalCount int `json:"total_count"`
|
||||
Page int `json:"page"`
|
||||
Limit int `json:"limit"`
|
||||
TotalPages int `json:"total_pages"`
|
||||
}
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreatePurchaseOrderRequest struct {
|
||||
VendorID uuid.UUID `json:"vendor_id" validate:"required"`
|
||||
PONumber string `json:"po_number" validate:"required,min=1,max=50"`
|
||||
TransactionDate time.Time `json:"transaction_date" validate:"required"`
|
||||
DueDate time.Time `json:"due_date" validate:"required"`
|
||||
Reference *string `json:"reference,omitempty" validate:"omitempty,max=100"`
|
||||
Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
||||
Message *string `json:"message,omitempty" validate:"omitempty"`
|
||||
Items []CreatePurchaseOrderItemRequest `json:"items" validate:"required,min=1,dive"`
|
||||
AttachmentFileIDs []uuid.UUID `json:"attachment_file_ids,omitempty"`
|
||||
}
|
||||
|
||||
type CreatePurchaseOrderItemRequest struct {
|
||||
IngredientID uuid.UUID `json:"ingredient_id" validate:"required"`
|
||||
Description *string `json:"description,omitempty" validate:"omitempty"`
|
||||
Quantity float64 `json:"quantity" validate:"required,gt=0"`
|
||||
UnitID uuid.UUID `json:"unit_id" validate:"required"`
|
||||
Amount float64 `json:"amount" validate:"required,gte=0"`
|
||||
}
|
||||
|
||||
type UpdatePurchaseOrderRequest struct {
|
||||
VendorID *uuid.UUID `json:"vendor_id,omitempty" validate:"omitempty"`
|
||||
PONumber *string `json:"po_number,omitempty" validate:"omitempty,min=1,max=50"`
|
||||
TransactionDate *time.Time `json:"transaction_date,omitempty" validate:"omitempty"`
|
||||
DueDate *time.Time `json:"due_date,omitempty" validate:"omitempty"`
|
||||
Reference *string `json:"reference,omitempty" validate:"omitempty,max=100"`
|
||||
Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
||||
Message *string `json:"message,omitempty" validate:"omitempty"`
|
||||
Items []UpdatePurchaseOrderItemRequest `json:"items,omitempty" validate:"omitempty,dive"`
|
||||
AttachmentFileIDs []uuid.UUID `json:"attachment_file_ids,omitempty"`
|
||||
}
|
||||
|
||||
type UpdatePurchaseOrderItemRequest struct {
|
||||
ID *uuid.UUID `json:"id,omitempty"` // For existing items
|
||||
IngredientID *uuid.UUID `json:"ingredient_id,omitempty" validate:"omitempty"`
|
||||
Description *string `json:"description,omitempty" validate:"omitempty"`
|
||||
Quantity *float64 `json:"quantity,omitempty" validate:"omitempty,gt=0"`
|
||||
UnitID *uuid.UUID `json:"unit_id,omitempty" validate:"omitempty"`
|
||||
Amount *float64 `json:"amount,omitempty" validate:"omitempty,gte=0"`
|
||||
}
|
||||
|
||||
type PurchaseOrderResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
OrganizationID uuid.UUID `json:"organization_id"`
|
||||
VendorID uuid.UUID `json:"vendor_id"`
|
||||
PONumber string `json:"po_number"`
|
||||
TransactionDate time.Time `json:"transaction_date"`
|
||||
DueDate time.Time `json:"due_date"`
|
||||
Reference *string `json:"reference"`
|
||||
Status string `json:"status"`
|
||||
Message *string `json:"message"`
|
||||
TotalAmount float64 `json:"total_amount"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Vendor *VendorResponse `json:"vendor,omitempty"`
|
||||
Items []PurchaseOrderItemResponse `json:"items,omitempty"`
|
||||
Attachments []PurchaseOrderAttachmentResponse `json:"attachments,omitempty"`
|
||||
}
|
||||
|
||||
type PurchaseOrderItemResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
PurchaseOrderID uuid.UUID `json:"purchase_order_id"`
|
||||
IngredientID uuid.UUID `json:"ingredient_id"`
|
||||
Description *string `json:"description"`
|
||||
Quantity float64 `json:"quantity"`
|
||||
UnitID uuid.UUID `json:"unit_id"`
|
||||
Amount float64 `json:"amount"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Ingredient *IngredientResponse `json:"ingredient,omitempty"`
|
||||
Unit *UnitResponse `json:"unit,omitempty"`
|
||||
}
|
||||
|
||||
type PurchaseOrderAttachmentResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
PurchaseOrderID uuid.UUID `json:"purchase_order_id"`
|
||||
FileID uuid.UUID `json:"file_id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
File *FileResponse `json:"file,omitempty"`
|
||||
}
|
||||
|
||||
type ListPurchaseOrdersRequest struct {
|
||||
Page int `json:"page" validate:"min=1"`
|
||||
Limit int `json:"limit" validate:"min=1,max=100"`
|
||||
Search string `json:"search,omitempty"`
|
||||
Status string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
||||
VendorID *uuid.UUID `json:"vendor_id,omitempty"`
|
||||
StartDate *time.Time `json:"start_date,omitempty"`
|
||||
EndDate *time.Time `json:"end_date,omitempty"`
|
||||
}
|
||||
|
||||
type ListPurchaseOrdersResponse struct {
|
||||
PurchaseOrders []PurchaseOrderResponse `json:"purchase_orders"`
|
||||
TotalCount int `json:"total_count"`
|
||||
Page int `json:"page"`
|
||||
Limit int `json:"limit"`
|
||||
TotalPages int `json:"total_pages"`
|
||||
}
|
||||
|
||||
// Helper types for ingredient and unit responses
|
||||
type IngredientResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type UnitResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package contract
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreateVendorRequest struct {
|
||||
Name string `json:"name" validate:"required,min=1,max=255"`
|
||||
Email *string `json:"email,omitempty" validate:"omitempty,email"`
|
||||
PhoneNumber *string `json:"phone_number,omitempty" validate:"omitempty"`
|
||||
Address *string `json:"address,omitempty" validate:"omitempty"`
|
||||
ContactPerson *string `json:"contact_person,omitempty" validate:"omitempty,max=255"`
|
||||
TaxNumber *string `json:"tax_number,omitempty" validate:"omitempty,max=50"`
|
||||
PaymentTerms *string `json:"payment_terms,omitempty" validate:"omitempty,max=100"`
|
||||
Notes *string `json:"notes,omitempty" validate:"omitempty"`
|
||||
IsActive *bool `json:"is_active,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateVendorRequest struct {
|
||||
Name *string `json:"name,omitempty" validate:"omitempty,min=1,max=255"`
|
||||
Email *string `json:"email,omitempty" validate:"omitempty,email"`
|
||||
PhoneNumber *string `json:"phone_number,omitempty" validate:"omitempty"`
|
||||
Address *string `json:"address,omitempty" validate:"omitempty"`
|
||||
ContactPerson *string `json:"contact_person,omitempty" validate:"omitempty,max=255"`
|
||||
TaxNumber *string `json:"tax_number,omitempty" validate:"omitempty,max=50"`
|
||||
PaymentTerms *string `json:"payment_terms,omitempty" validate:"omitempty,max=100"`
|
||||
Notes *string `json:"notes,omitempty" validate:"omitempty"`
|
||||
IsActive *bool `json:"is_active,omitempty"`
|
||||
}
|
||||
|
||||
type VendorResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
OrganizationID uuid.UUID `json:"organization_id"`
|
||||
Name string `json:"name"`
|
||||
Email *string `json:"email"`
|
||||
PhoneNumber *string `json:"phone_number"`
|
||||
Address *string `json:"address"`
|
||||
ContactPerson *string `json:"contact_person"`
|
||||
TaxNumber *string `json:"tax_number"`
|
||||
PaymentTerms *string `json:"payment_terms"`
|
||||
Notes *string `json:"notes"`
|
||||
IsActive bool `json:"is_active"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type ListVendorsRequest struct {
|
||||
Page int `json:"page" validate:"min=1"`
|
||||
Limit int `json:"limit" validate:"min=1,max=100"`
|
||||
Search string `json:"search,omitempty"`
|
||||
IsActive *bool `json:"is_active,omitempty"`
|
||||
}
|
||||
|
||||
type ListVendorsResponse struct {
|
||||
Vendors []VendorResponse `json:"vendors"`
|
||||
TotalCount int `json:"total_count"`
|
||||
Page int `json:"page"`
|
||||
Limit int `json:"limit"`
|
||||
TotalPages int `json:"total_pages"`
|
||||
}
|
||||
Reference in New Issue
Block a user