mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
пересчет поправил редактирование с перепроведением галка автопроведения работает рекомендации починил
133 lines
4.4 KiB
Go
133 lines
4.4 KiB
Go
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)
|
||
}
|