package api import ( "context" "encoding/json" "fmt" "io" ) func (c *Client) executeRequest(ctx context.Context, request FiscalRequest, response interface{}) error { resp, err := c.resty.R(). SetContext(ctx). SetHeader("Authorization", c.token). SetBody(request). Post(c.apiBaseURL + "/fiscal/execute") if err != nil { return fmt.Errorf("request failed: %w", err) } if resp.IsError() { return fmt.Errorf("api error: %v", resp.Error()) } if resp.StatusCode() != 200 { return fmt.Errorf("unexpected status code: %d", resp.StatusCode()) } body, err := io.ReadAll(resp.Body) if err != nil { return fmt.Errorf("failed to read response: %w", err) } if err := json.Unmarshal(body, response); err != nil { return fmt.Errorf("failed to unmarshal response: %w", err) } return nil } func (c *Client) OpenShift(ctx context.Context, cashier string) (*SellResponse, error) { request := FiscalRequest{ Fiscal: Fiscal{ Task: TaskOpenShift, Cashier: cashier, }, } var response SellResponse if err := c.executeRequest(ctx, request, &response); err != nil { return nil, err } return &response, nil } func (c *Client) CloseShift(ctx context.Context, cashier string) (*ZReportResponse, error) { request := FiscalRequest{ Fiscal: Fiscal{ Task: TaskZReport, Cashier: cashier, }, } var response ZReportResponse if err := c.executeRequest(ctx, request, &response); err != nil { return nil, err } return &response, nil } type SellParams struct { Cashier string Source string Rows []ReceiptRow Pays []ReceiptPay Userinfo *Userinfo } func (c *Client) Sell(ctx context.Context, params SellParams) (*SellResponse, error) { receipt := NewReceipt(params.Rows, params.Pays) request := FiscalRequest{ Source: params.Source, Fiscal: Fiscal{ Task: TaskSell, Cashier: params.Cashier, Receipt: &receipt, }, } if params.Userinfo != nil { request.Userinfo = *params.Userinfo } var response SellResponse if err := c.executeRequest(ctx, request, &response); err != nil { return nil, err } return &response, nil }