Add coa purchase and vendors

This commit is contained in:
Aditya Siregar
2025-09-12 01:12:11 +07:00
parent c107733add
commit efe09c21e4
86 changed files with 8517 additions and 212 deletions
+106
View File
@@ -0,0 +1,106 @@
package service
import (
"context"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/processor"
"github.com/google/uuid"
)
type AccountService interface {
contract.AccountContract
}
type AccountServiceImpl struct {
processor processor.AccountProcessor
}
func NewAccountService(processor processor.AccountProcessor) AccountService {
return &AccountServiceImpl{
processor: processor,
}
}
func (s *AccountServiceImpl) CreateAccount(ctx context.Context, req *contract.CreateAccountRequest) (*contract.AccountResponse, error) {
modelReq := mappers.ContractToModelCreateAccountRequest(req)
modelResp, err := s.processor.CreateAccount(ctx, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractAccountResponse(modelResp), nil
}
func (s *AccountServiceImpl) GetAccountByID(ctx context.Context, id uuid.UUID) (*contract.AccountResponse, error) {
modelResp, err := s.processor.GetAccountByID(ctx, id)
if err != nil {
return nil, err
}
return mappers.ModelToContractAccountResponse(modelResp), nil
}
func (s *AccountServiceImpl) UpdateAccount(ctx context.Context, id uuid.UUID, req *contract.UpdateAccountRequest) (*contract.AccountResponse, error) {
modelReq := mappers.ContractToModelUpdateAccountRequest(req)
modelResp, err := s.processor.UpdateAccount(ctx, id, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractAccountResponse(modelResp), nil
}
func (s *AccountServiceImpl) DeleteAccount(ctx context.Context, id uuid.UUID) error {
return s.processor.DeleteAccount(ctx, id)
}
func (s *AccountServiceImpl) ListAccounts(ctx context.Context, req *contract.ListAccountsRequest) ([]contract.AccountResponse, int, error) {
modelReq := mappers.ContractToModelListAccountsRequest(req)
modelResp, total, err := s.processor.ListAccounts(ctx, modelReq)
if err != nil {
return nil, 0, err
}
contractResp := make([]contract.AccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractAccountResponse(&resp)
}
return contractResp, total, nil
}
func (s *AccountServiceImpl) GetAccountsByOrganization(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID) ([]contract.AccountResponse, error) {
modelResp, err := s.processor.GetAccountsByOrganization(ctx, organizationID, outletID)
if err != nil {
return nil, err
}
contractResp := make([]contract.AccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractAccountResponse(&resp)
}
return contractResp, nil
}
func (s *AccountServiceImpl) GetAccountsByChartOfAccount(ctx context.Context, chartOfAccountID uuid.UUID) ([]contract.AccountResponse, error) {
modelResp, err := s.processor.GetAccountsByChartOfAccount(ctx, chartOfAccountID)
if err != nil {
return nil, err
}
contractResp := make([]contract.AccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractAccountResponse(&resp)
}
return contractResp, nil
}
func (s *AccountServiceImpl) UpdateAccountBalance(ctx context.Context, id uuid.UUID, req *contract.UpdateAccountBalanceRequest) error {
return s.processor.UpdateAccountBalance(ctx, id, req.Amount)
}
func (s *AccountServiceImpl) GetAccountBalance(ctx context.Context, id uuid.UUID) (float64, error) {
return s.processor.GetAccountBalance(ctx, id)
}
@@ -0,0 +1,98 @@
package service
import (
"context"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/processor"
"github.com/google/uuid"
)
type ChartOfAccountService interface {
contract.ChartOfAccountContract
}
type ChartOfAccountServiceImpl struct {
processor processor.ChartOfAccountProcessor
}
func NewChartOfAccountService(processor processor.ChartOfAccountProcessor) ChartOfAccountService {
return &ChartOfAccountServiceImpl{
processor: processor,
}
}
func (s *ChartOfAccountServiceImpl) CreateChartOfAccount(ctx context.Context, req *contract.CreateChartOfAccountRequest) (*contract.ChartOfAccountResponse, error) {
modelReq := mappers.ContractToModelCreateChartOfAccountRequest(req)
modelResp, err := s.processor.CreateChartOfAccount(ctx, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountResponse(modelResp), nil
}
func (s *ChartOfAccountServiceImpl) GetChartOfAccountByID(ctx context.Context, id uuid.UUID) (*contract.ChartOfAccountResponse, error) {
modelResp, err := s.processor.GetChartOfAccountByID(ctx, id)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountResponse(modelResp), nil
}
func (s *ChartOfAccountServiceImpl) UpdateChartOfAccount(ctx context.Context, id uuid.UUID, req *contract.UpdateChartOfAccountRequest) (*contract.ChartOfAccountResponse, error) {
modelReq := mappers.ContractToModelUpdateChartOfAccountRequest(req)
modelResp, err := s.processor.UpdateChartOfAccount(ctx, id, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountResponse(modelResp), nil
}
func (s *ChartOfAccountServiceImpl) DeleteChartOfAccount(ctx context.Context, id uuid.UUID) error {
return s.processor.DeleteChartOfAccount(ctx, id)
}
func (s *ChartOfAccountServiceImpl) ListChartOfAccounts(ctx context.Context, req *contract.ListChartOfAccountsRequest) ([]contract.ChartOfAccountResponse, int, error) {
modelReq := mappers.ContractToModelListChartOfAccountsRequest(req)
modelResp, total, err := s.processor.ListChartOfAccounts(ctx, modelReq)
if err != nil {
return nil, 0, err
}
contractResp := make([]contract.ChartOfAccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractChartOfAccountResponse(&resp)
}
return contractResp, total, nil
}
func (s *ChartOfAccountServiceImpl) GetChartOfAccountsByOrganization(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID) ([]contract.ChartOfAccountResponse, error) {
modelResp, err := s.processor.GetChartOfAccountsByOrganization(ctx, organizationID, outletID)
if err != nil {
return nil, err
}
contractResp := make([]contract.ChartOfAccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractChartOfAccountResponse(&resp)
}
return contractResp, nil
}
func (s *ChartOfAccountServiceImpl) GetChartOfAccountsByType(ctx context.Context, organizationID uuid.UUID, chartOfAccountTypeID uuid.UUID, outletID *uuid.UUID) ([]contract.ChartOfAccountResponse, error) {
modelResp, err := s.processor.GetChartOfAccountsByType(ctx, organizationID, chartOfAccountTypeID, outletID)
if err != nil {
return nil, err
}
contractResp := make([]contract.ChartOfAccountResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractChartOfAccountResponse(&resp)
}
return contractResp, nil
}
@@ -0,0 +1,69 @@
package service
import (
"context"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/processor"
"github.com/google/uuid"
)
type ChartOfAccountTypeService interface {
contract.ChartOfAccountTypeContract
}
type ChartOfAccountTypeServiceImpl struct {
processor processor.ChartOfAccountTypeProcessor
}
func NewChartOfAccountTypeService(processor processor.ChartOfAccountTypeProcessor) ChartOfAccountTypeService {
return &ChartOfAccountTypeServiceImpl{
processor: processor,
}
}
func (s *ChartOfAccountTypeServiceImpl) CreateChartOfAccountType(ctx context.Context, req *contract.CreateChartOfAccountTypeRequest) (*contract.ChartOfAccountTypeResponse, error) {
modelReq := mappers.ContractToModelCreateChartOfAccountTypeRequest(req)
modelResp, err := s.processor.CreateChartOfAccountType(ctx, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountTypeResponse(modelResp), nil
}
func (s *ChartOfAccountTypeServiceImpl) GetChartOfAccountTypeByID(ctx context.Context, id uuid.UUID) (*contract.ChartOfAccountTypeResponse, error) {
modelResp, err := s.processor.GetChartOfAccountTypeByID(ctx, id)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountTypeResponse(modelResp), nil
}
func (s *ChartOfAccountTypeServiceImpl) UpdateChartOfAccountType(ctx context.Context, id uuid.UUID, req *contract.UpdateChartOfAccountTypeRequest) (*contract.ChartOfAccountTypeResponse, error) {
modelReq := mappers.ContractToModelUpdateChartOfAccountTypeRequest(req)
modelResp, err := s.processor.UpdateChartOfAccountType(ctx, id, modelReq)
if err != nil {
return nil, err
}
return mappers.ModelToContractChartOfAccountTypeResponse(modelResp), nil
}
func (s *ChartOfAccountTypeServiceImpl) DeleteChartOfAccountType(ctx context.Context, id uuid.UUID) error {
return s.processor.DeleteChartOfAccountType(ctx, id)
}
func (s *ChartOfAccountTypeServiceImpl) ListChartOfAccountTypes(ctx context.Context, filters map[string]interface{}, page, limit int) ([]contract.ChartOfAccountTypeResponse, int, error) {
modelResp, total, err := s.processor.ListChartOfAccountTypes(ctx, filters, page, limit)
if err != nil {
return nil, 0, err
}
contractResp := make([]contract.ChartOfAccountTypeResponse, len(modelResp))
for i, resp := range modelResp {
contractResp[i] = *mappers.ModelToContractChartOfAccountTypeResponse(&resp)
}
return contractResp, total, nil
}
@@ -0,0 +1,151 @@
package service
import (
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/transformer"
"context"
"github.com/google/uuid"
)
type IngredientUnitConverterService interface {
CreateIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateIngredientUnitConverterRequest) *contract.Response
UpdateIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdateIngredientUnitConverterRequest) *contract.Response
DeleteIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
GetIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
ListIngredientUnitConverters(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListIngredientUnitConvertersRequest) *contract.Response
GetConvertersForIngredient(ctx context.Context, apctx *appcontext.ContextInfo, ingredientID uuid.UUID) *contract.Response
ConvertUnit(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ConvertUnitRequest) *contract.Response
}
type IngredientUnitConverterServiceImpl struct {
converterProcessor processor.IngredientUnitConverterProcessor
}
func NewIngredientUnitConverterService(converterProcessor processor.IngredientUnitConverterProcessor) *IngredientUnitConverterServiceImpl {
return &IngredientUnitConverterServiceImpl{
converterProcessor: converterProcessor,
}
}
func (s *IngredientUnitConverterServiceImpl) CreateIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateIngredientUnitConverterRequest) *contract.Response {
modelReq := transformer.CreateIngredientUnitConverterRequestToModel(req)
converterResponse, err := s.converterProcessor.CreateIngredientUnitConverter(ctx, apctx.OrganizationID, apctx.UserID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.IngredientUnitConverterModelResponseToResponse(converterResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *IngredientUnitConverterServiceImpl) UpdateIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdateIngredientUnitConverterRequest) *contract.Response {
modelReq := transformer.UpdateIngredientUnitConverterRequestToModel(req)
converterResponse, err := s.converterProcessor.UpdateIngredientUnitConverter(ctx, id, apctx.OrganizationID, apctx.UserID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.IngredientUnitConverterModelResponseToResponse(converterResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *IngredientUnitConverterServiceImpl) DeleteIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
err := s.converterProcessor.DeleteIngredientUnitConverter(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
return contract.BuildSuccessResponse(nil)
}
func (s *IngredientUnitConverterServiceImpl) GetIngredientUnitConverter(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
converterResponse, err := s.converterProcessor.GetIngredientUnitConverterByID(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.IngredientUnitConverterModelResponseToResponse(converterResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *IngredientUnitConverterServiceImpl) ListIngredientUnitConverters(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListIngredientUnitConvertersRequest) *contract.Response {
modelReq := transformer.ListIngredientUnitConvertersRequestToModel(req)
filters := make(map[string]interface{})
if modelReq.IngredientID != nil {
filters["ingredient_id"] = *modelReq.IngredientID
}
if modelReq.FromUnitID != nil {
filters["from_unit_id"] = *modelReq.FromUnitID
}
if modelReq.ToUnitID != nil {
filters["to_unit_id"] = *modelReq.ToUnitID
}
if modelReq.IsActive != nil {
filters["is_active"] = *modelReq.IsActive
}
if modelReq.Search != "" {
filters["search"] = modelReq.Search
}
converters, total, err := s.converterProcessor.ListIngredientUnitConverters(ctx, apctx.OrganizationID, filters, modelReq.Page, modelReq.Limit)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := make([]contract.IngredientUnitConverterResponse, len(converters))
for i, converter := range converters {
contractResponses[i] = transformer.IngredientUnitConverterModelResponseToResponse(converter)
}
totalPages := (total + modelReq.Limit - 1) / modelReq.Limit
response := contract.ListIngredientUnitConvertersResponse{
Converters: contractResponses,
TotalCount: total,
Page: modelReq.Page,
Limit: modelReq.Limit,
TotalPages: totalPages,
}
return contract.BuildSuccessResponse(response)
}
func (s *IngredientUnitConverterServiceImpl) GetConvertersForIngredient(ctx context.Context, apctx *appcontext.ContextInfo, ingredientID uuid.UUID) *contract.Response {
converters, err := s.converterProcessor.GetConvertersForIngredient(ctx, ingredientID, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := make([]contract.IngredientUnitConverterResponse, len(converters))
for i, converter := range converters {
contractResponses[i] = transformer.IngredientUnitConverterModelResponseToResponse(converter)
}
return contract.BuildSuccessResponse(contractResponses)
}
func (s *IngredientUnitConverterServiceImpl) ConvertUnit(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ConvertUnitRequest) *contract.Response {
modelReq := transformer.ConvertUnitRequestToModel(req)
convertResponse, err := s.converterProcessor.ConvertUnit(ctx, apctx.OrganizationID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.IngredientUnitConverterServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.ConvertUnitModelResponseToResponse(convertResponse)
return contract.BuildSuccessResponse(contractResponse)
}
+175
View File
@@ -0,0 +1,175 @@
package service
import (
"apskel-pos-be/internal/appcontext"
"context"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/transformer"
"github.com/google/uuid"
)
type PurchaseOrderService interface {
CreatePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreatePurchaseOrderRequest) *contract.Response
UpdatePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdatePurchaseOrderRequest) *contract.Response
DeletePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
GetPurchaseOrderByID(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
ListPurchaseOrders(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListPurchaseOrdersRequest) *contract.Response
GetPurchaseOrdersByStatus(ctx context.Context, apctx *appcontext.ContextInfo, status string) *contract.Response
GetOverduePurchaseOrders(ctx context.Context, apctx *appcontext.ContextInfo) *contract.Response
UpdatePurchaseOrderStatus(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, status string) *contract.Response
}
type PurchaseOrderServiceImpl struct {
purchaseOrderProcessor processor.PurchaseOrderProcessor
}
func NewPurchaseOrderService(purchaseOrderProcessor processor.PurchaseOrderProcessor) *PurchaseOrderServiceImpl {
return &PurchaseOrderServiceImpl{
purchaseOrderProcessor: purchaseOrderProcessor,
}
}
func (s *PurchaseOrderServiceImpl) CreatePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreatePurchaseOrderRequest) *contract.Response {
modelReq := transformer.CreatePurchaseOrderRequestToModel(req)
poResponse, err := s.purchaseOrderProcessor.CreatePurchaseOrder(ctx, apctx.OrganizationID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.PurchaseOrderModelResponseToResponse(poResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *PurchaseOrderServiceImpl) UpdatePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdatePurchaseOrderRequest) *contract.Response {
modelReq := transformer.UpdatePurchaseOrderRequestToModel(req)
poResponse, err := s.purchaseOrderProcessor.UpdatePurchaseOrder(ctx, id, apctx.OrganizationID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.PurchaseOrderModelResponseToResponse(poResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *PurchaseOrderServiceImpl) DeletePurchaseOrder(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
err := s.purchaseOrderProcessor.DeletePurchaseOrder(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
return contract.BuildSuccessResponse(map[string]interface{}{
"message": "Purchase order deleted successfully",
})
}
func (s *PurchaseOrderServiceImpl) GetPurchaseOrderByID(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
poResponse, err := s.purchaseOrderProcessor.GetPurchaseOrderByID(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.PurchaseOrderModelResponseToResponse(poResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *PurchaseOrderServiceImpl) ListPurchaseOrders(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListPurchaseOrdersRequest) *contract.Response {
modelReq := transformer.ListPurchaseOrdersRequestToModel(req)
filters := make(map[string]interface{})
if modelReq.Search != "" {
filters["search"] = modelReq.Search
}
if modelReq.Status != "" {
filters["status"] = modelReq.Status
}
if modelReq.VendorID != nil {
filters["vendor_id"] = *modelReq.VendorID
}
if modelReq.StartDate != nil {
filters["start_date"] = *modelReq.StartDate
}
if modelReq.EndDate != nil {
filters["end_date"] = *modelReq.EndDate
}
pos, totalPages, err := s.purchaseOrderProcessor.ListPurchaseOrders(ctx, apctx.OrganizationID, filters, modelReq.Page, modelReq.Limit)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := make([]contract.PurchaseOrderResponse, len(pos))
for i, po := range pos {
response := transformer.PurchaseOrderModelResponseToResponse(po)
if response != nil {
contractResponses[i] = *response
}
}
response := contract.ListPurchaseOrdersResponse{
PurchaseOrders: contractResponses,
TotalCount: len(contractResponses),
Page: modelReq.Page,
Limit: modelReq.Limit,
TotalPages: totalPages,
}
return contract.BuildSuccessResponse(response)
}
func (s *PurchaseOrderServiceImpl) GetPurchaseOrdersByStatus(ctx context.Context, apctx *appcontext.ContextInfo, status string) *contract.Response {
poResponses, err := s.purchaseOrderProcessor.GetPurchaseOrdersByStatus(ctx, apctx.OrganizationID, status)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := make([]contract.PurchaseOrderResponse, len(poResponses))
for i, po := range poResponses {
response := transformer.PurchaseOrderModelResponseToResponse(po)
if response != nil {
contractResponses[i] = *response
}
}
return contract.BuildSuccessResponse(contractResponses)
}
func (s *PurchaseOrderServiceImpl) GetOverduePurchaseOrders(ctx context.Context, apctx *appcontext.ContextInfo) *contract.Response {
poResponses, err := s.purchaseOrderProcessor.GetOverduePurchaseOrders(ctx, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := make([]contract.PurchaseOrderResponse, len(poResponses))
for i, po := range poResponses {
response := transformer.PurchaseOrderModelResponseToResponse(po)
if response != nil {
contractResponses[i] = *response
}
}
return contract.BuildSuccessResponse(contractResponses)
}
func (s *PurchaseOrderServiceImpl) UpdatePurchaseOrderStatus(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, status string) *contract.Response {
poResponse, err := s.purchaseOrderProcessor.UpdatePurchaseOrderStatus(ctx, id, apctx.OrganizationID, apctx.UserID, apctx.OutletID, status)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.PurchaseOrderServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.PurchaseOrderModelResponseToResponse(poResponse)
return contract.BuildSuccessResponse(contractResponse)
}
+122
View File
@@ -0,0 +1,122 @@
package service
import (
"apskel-pos-be/internal/appcontext"
"context"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/transformer"
"github.com/google/uuid"
)
type VendorService interface {
CreateVendor(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateVendorRequest) *contract.Response
UpdateVendor(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdateVendorRequest) *contract.Response
DeleteVendor(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
GetVendorByID(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response
ListVendors(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListVendorsRequest) *contract.Response
GetActiveVendors(ctx context.Context, apctx *appcontext.ContextInfo) *contract.Response
}
type VendorServiceImpl struct {
vendorProcessor processor.VendorProcessor
}
func NewVendorService(vendorProcessor processor.VendorProcessor) *VendorServiceImpl {
return &VendorServiceImpl{
vendorProcessor: vendorProcessor,
}
}
func (s *VendorServiceImpl) CreateVendor(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateVendorRequest) *contract.Response {
modelReq := transformer.CreateVendorRequestToModel(req)
vendorResponse, err := s.vendorProcessor.CreateVendor(ctx, apctx.OrganizationID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.VendorModelResponseToResponse(vendorResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *VendorServiceImpl) UpdateVendor(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID, req *contract.UpdateVendorRequest) *contract.Response {
modelReq := transformer.UpdateVendorRequestToModel(req)
vendorResponse, err := s.vendorProcessor.UpdateVendor(ctx, id, apctx.OrganizationID, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.VendorModelResponseToResponse(vendorResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *VendorServiceImpl) DeleteVendor(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
err := s.vendorProcessor.DeleteVendor(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
return contract.BuildSuccessResponse(map[string]interface{}{
"message": "Vendor deleted successfully",
})
}
func (s *VendorServiceImpl) GetVendorByID(ctx context.Context, apctx *appcontext.ContextInfo, id uuid.UUID) *contract.Response {
vendorResponse, err := s.vendorProcessor.GetVendorByID(ctx, id, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.VendorModelResponseToResponse(vendorResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *VendorServiceImpl) ListVendors(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.ListVendorsRequest) *contract.Response {
modelReq := transformer.ListVendorsRequestToModel(req)
filters := make(map[string]interface{})
if modelReq.Search != "" {
filters["search"] = modelReq.Search
}
if modelReq.IsActive != nil {
filters["is_active"] = *modelReq.IsActive
}
vendors, totalPages, err := s.vendorProcessor.ListVendors(ctx, apctx.OrganizationID, filters, modelReq.Page, modelReq.Limit)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := transformer.VendorModelResponsesToResponses(vendors)
response := contract.ListVendorsResponse{
Vendors: contractResponses,
TotalCount: len(contractResponses),
Page: modelReq.Page,
Limit: modelReq.Limit,
TotalPages: totalPages,
}
return contract.BuildSuccessResponse(response)
}
func (s *VendorServiceImpl) GetActiveVendors(ctx context.Context, apctx *appcontext.ContextInfo) *contract.Response {
vendorResponses, err := s.vendorProcessor.GetActiveVendors(ctx, apctx.OrganizationID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.VendorServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := transformer.VendorModelResponsesToResponses(vendorResponses)
return contract.BuildSuccessResponse(contractResponses)
}