Files
rmser/internal/transport/http/handlers/invoices.go
SERTY 88620f3fb6 0202-финиш перед десктопом
пересчет поправил
редактирование с перепроведением
галка автопроведения работает
рекомендации починил
2026-02-02 13:53:38 +03:00

133 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"go.uber.org/zap"
"rmser/internal/services/drafts"
invService "rmser/internal/services/invoices"
"rmser/internal/services/sync"
"rmser/pkg/logger"
)
type InvoiceHandler struct {
service *invService.Service
draftsService *drafts.Service
syncService *sync.Service
}
func NewInvoiceHandler(service *invService.Service, syncService *sync.Service) *InvoiceHandler {
return &InvoiceHandler{service: service, syncService: syncService}
}
// SendInvoice godoc
// @Summary Создать приходную накладную в iikoRMS
// @Description Принимает JSON с данными накладной и отправляет их в iiko
// @Tags invoices
// @Accept json
// @Produce json
// @Param input body invService.CreateRequestDTO true "Invoice Data"
// @Success 200 {object} map[string]string "created_number"
// @Failure 400 {object} map[string]string
// @Failure 500 {object} map[string]string
func (h *InvoiceHandler) SendInvoice(c *gin.Context) {
var req invService.CreateRequestDTO
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Неверный формат JSON: " + err.Error()})
return
}
userID := c.MustGet("userID").(uuid.UUID)
docNum, err := h.service.SendInvoiceToRMS(req, userID)
if err != nil {
logger.Log.Error("Ошибка отправки накладной", zap.Error(err))
// Возвращаем 502 Bad Gateway, т.к. ошибка скорее всего на стороне RMS
c.JSON(http.StatusBadGateway, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"created_number": docNum,
})
}
// GetInvoice godoc
// @Summary Получить детали накладной
// @Description Возвращает детали синхронизированной накладной по ID
// @Tags invoices
// @Produce json
// @Param id path string true "Invoice ID"
// @Success 200 {object} invService.InvoiceDetailsDTO
// @Failure 400 {object} map[string]string
// @Failure 404 {object} map[string]string
// @Failure 500 {object} map[string]string
func (h *InvoiceHandler) GetInvoice(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "ID накладной обязателен"})
return
}
uuidID, err := uuid.Parse(id)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Неверный формат ID"})
return
}
dto, err := h.service.GetInvoice(uuidID)
if err != nil {
logger.Log.Error("Ошибка получения накладной", zap.Error(err), zap.String("id", id))
c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка получения накладной"})
return
}
c.JSON(http.StatusOK, dto)
}
// SyncInvoices godoc
// @Summary Запустить синхронизацию накладных
// @Description Запускает синхронизацию накладных для пользователя
// @Tags invoices
// @Produce json
// @Success 200 {object} map[string]string
// @Failure 500 {object} map[string]string
func (h *InvoiceHandler) SyncInvoices(c *gin.Context) {
userID := c.MustGet("userID").(uuid.UUID)
err := h.syncService.SyncInvoicesOnly(userID)
if err != nil {
logger.Log.Error("Ошибка синхронизации накладных", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка синхронизации"})
return
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"message": "Синхронизация запущена",
})
}
// GetStats godoc
// @Summary Получить статистику по накладным
// @Description Возвращает статистику по накладным для текущего пользователя
// @Tags invoices
// @Produce json
// @Success 200 {object} invService.InvoiceStatsDTO
// @Failure 500 {object} map[string]string
func (h *InvoiceHandler) GetStats(c *gin.Context) {
userID := c.MustGet("userID").(uuid.UUID)
stats, err := h.service.GetStats(userID)
if err != nil {
logger.Log.Error("Ошибка получения статистики", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка получения статистики"})
return
}
c.JSON(http.StatusOK, stats)
}