// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.30.0
// source: financial_transactions.sql

package generated

import (
	"context"

	"github.com/jackc/pgx/v5/pgtype"
)

const createTransaction = `-- name: CreateTransaction :one
INSERT INTO financial_transactions (
  fot_id, data_cobranca, tipo_evento, tipo_servico, professional_name, 
  whatsapp, cpf, tabela_free, valor_free, valor_extra, descricao_extra, 
  total_pagar, data_pagamento, pgto_ok
) VALUES (
  $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14
) RETURNING id, fot_id, data_cobranca, tipo_evento, tipo_servico, professional_name, whatsapp, cpf, tabela_free, valor_free, valor_extra, descricao_extra, total_pagar, data_pagamento, pgto_ok, criado_em, atualizado_em, profissional_id
`

type CreateTransactionParams struct {
	FotID            pgtype.UUID    `json:"fot_id"`
	DataCobranca     pgtype.Date    `json:"data_cobranca"`
	TipoEvento       pgtype.Text    `json:"tipo_evento"`
	TipoServico      pgtype.Text    `json:"tipo_servico"`
	ProfessionalName pgtype.Text    `json:"professional_name"`
	Whatsapp         pgtype.Text    `json:"whatsapp"`
	Cpf              pgtype.Text    `json:"cpf"`
	TabelaFree       pgtype.Text    `json:"tabela_free"`
	ValorFree        pgtype.Numeric `json:"valor_free"`
	ValorExtra       pgtype.Numeric `json:"valor_extra"`
	DescricaoExtra   pgtype.Text    `json:"descricao_extra"`
	TotalPagar       pgtype.Numeric `json:"total_pagar"`
	DataPagamento    pgtype.Date    `json:"data_pagamento"`
	PgtoOk           pgtype.Bool    `json:"pgto_ok"`
}

func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionParams) (FinancialTransaction, error) {
	row := q.db.QueryRow(ctx, createTransaction,
		arg.FotID,
		arg.DataCobranca,
		arg.TipoEvento,
		arg.TipoServico,
		arg.ProfessionalName,
		arg.Whatsapp,
		arg.Cpf,
		arg.TabelaFree,
		arg.ValorFree,
		arg.ValorExtra,
		arg.DescricaoExtra,
		arg.TotalPagar,
		arg.DataPagamento,
		arg.PgtoOk,
	)
	var i FinancialTransaction
	err := row.Scan(
		&i.ID,
		&i.FotID,
		&i.DataCobranca,
		&i.TipoEvento,
		&i.TipoServico,
		&i.ProfessionalName,
		&i.Whatsapp,
		&i.Cpf,
		&i.TabelaFree,
		&i.ValorFree,
		&i.ValorExtra,
		&i.DescricaoExtra,
		&i.TotalPagar,
		&i.DataPagamento,
		&i.PgtoOk,
		&i.CriadoEm,
		&i.AtualizadoEm,
		&i.ProfissionalID,
	)
	return i, err
}

const deleteTransaction = `-- name: DeleteTransaction :exec
DELETE FROM financial_transactions WHERE id = $1
`

func (q *Queries) DeleteTransaction(ctx context.Context, id pgtype.UUID) error {
	_, err := q.db.Exec(ctx, deleteTransaction, id)
	return err
}

const getTransaction = `-- name: GetTransaction :one
SELECT id, fot_id, data_cobranca, tipo_evento, tipo_servico, professional_name, whatsapp, cpf, tabela_free, valor_free, valor_extra, descricao_extra, total_pagar, data_pagamento, pgto_ok, criado_em, atualizado_em, profissional_id FROM financial_transactions WHERE id = $1
`

func (q *Queries) GetTransaction(ctx context.Context, id pgtype.UUID) (FinancialTransaction, error) {
	row := q.db.QueryRow(ctx, getTransaction, id)
	var i FinancialTransaction
	err := row.Scan(
		&i.ID,
		&i.FotID,
		&i.DataCobranca,
		&i.TipoEvento,
		&i.TipoServico,
		&i.ProfessionalName,
		&i.Whatsapp,
		&i.Cpf,
		&i.TabelaFree,
		&i.ValorFree,
		&i.ValorExtra,
		&i.DescricaoExtra,
		&i.TotalPagar,
		&i.DataPagamento,
		&i.PgtoOk,
		&i.CriadoEm,
		&i.AtualizadoEm,
		&i.ProfissionalID,
	)
	return i, err
}

const listTransactions = `-- name: ListTransactions :many
SELECT t.id, t.fot_id, t.data_cobranca, t.tipo_evento, t.tipo_servico, t.professional_name, t.whatsapp, t.cpf, t.tabela_free, t.valor_free, t.valor_extra, t.descricao_extra, t.total_pagar, t.data_pagamento, t.pgto_ok, t.criado_em, t.atualizado_em, t.profissional_id, f.fot as fot_numero
FROM financial_transactions t
LEFT JOIN cadastro_fot f ON t.fot_id = f.id
ORDER BY t.data_cobranca DESC
`

type ListTransactionsRow struct {
	ID               pgtype.UUID        `json:"id"`
	FotID            pgtype.UUID        `json:"fot_id"`
	DataCobranca     pgtype.Date        `json:"data_cobranca"`
	TipoEvento       pgtype.Text        `json:"tipo_evento"`
	TipoServico      pgtype.Text        `json:"tipo_servico"`
	ProfessionalName pgtype.Text        `json:"professional_name"`
	Whatsapp         pgtype.Text        `json:"whatsapp"`
	Cpf              pgtype.Text        `json:"cpf"`
	TabelaFree       pgtype.Text        `json:"tabela_free"`
	ValorFree        pgtype.Numeric     `json:"valor_free"`
	ValorExtra       pgtype.Numeric     `json:"valor_extra"`
	DescricaoExtra   pgtype.Text        `json:"descricao_extra"`
	TotalPagar       pgtype.Numeric     `json:"total_pagar"`
	DataPagamento    pgtype.Date        `json:"data_pagamento"`
	PgtoOk           pgtype.Bool        `json:"pgto_ok"`
	CriadoEm         pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm     pgtype.Timestamptz `json:"atualizado_em"`
	ProfissionalID   pgtype.UUID        `json:"profissional_id"`
	FotNumero        pgtype.Int4        `json:"fot_numero"`
}

func (q *Queries) ListTransactions(ctx context.Context) ([]ListTransactionsRow, error) {
	rows, err := q.db.Query(ctx, listTransactions)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListTransactionsRow
	for rows.Next() {
		var i ListTransactionsRow
		if err := rows.Scan(
			&i.ID,
			&i.FotID,
			&i.DataCobranca,
			&i.TipoEvento,
			&i.TipoServico,
			&i.ProfessionalName,
			&i.Whatsapp,
			&i.Cpf,
			&i.TabelaFree,
			&i.ValorFree,
			&i.ValorExtra,
			&i.DescricaoExtra,
			&i.TotalPagar,
			&i.DataPagamento,
			&i.PgtoOk,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.ProfissionalID,
			&i.FotNumero,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const listTransactionsByFot = `-- name: ListTransactionsByFot :many
SELECT id, fot_id, data_cobranca, tipo_evento, tipo_servico, professional_name, whatsapp, cpf, tabela_free, valor_free, valor_extra, descricao_extra, total_pagar, data_pagamento, pgto_ok, criado_em, atualizado_em, profissional_id FROM financial_transactions 
WHERE fot_id = $1 
ORDER BY data_cobranca DESC
`

func (q *Queries) ListTransactionsByFot(ctx context.Context, fotID pgtype.UUID) ([]FinancialTransaction, error) {
	rows, err := q.db.Query(ctx, listTransactionsByFot, fotID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []FinancialTransaction
	for rows.Next() {
		var i FinancialTransaction
		if err := rows.Scan(
			&i.ID,
			&i.FotID,
			&i.DataCobranca,
			&i.TipoEvento,
			&i.TipoServico,
			&i.ProfessionalName,
			&i.Whatsapp,
			&i.Cpf,
			&i.TabelaFree,
			&i.ValorFree,
			&i.ValorExtra,
			&i.DescricaoExtra,
			&i.TotalPagar,
			&i.DataPagamento,
			&i.PgtoOk,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.ProfissionalID,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const listTransactionsByProfessional = `-- name: ListTransactionsByProfessional :many
SELECT t.id, t.fot_id, t.data_cobranca, t.tipo_evento, t.tipo_servico, t.professional_name, t.whatsapp, t.cpf, t.tabela_free, t.valor_free, t.valor_extra, t.descricao_extra, t.total_pagar, t.data_pagamento, t.pgto_ok, t.criado_em, t.atualizado_em, t.profissional_id, f.fot as fot_numero, e.nome as empresa_nome, c.nome as curso_nome
FROM financial_transactions t
LEFT JOIN cadastro_fot f ON t.fot_id = f.id
LEFT JOIN empresas e ON f.empresa_id = e.id
LEFT JOIN cursos c ON f.curso_id = c.id
WHERE 
  t.profissional_id = $1 
  OR (
     $2::text <> '' AND 
     REGEXP_REPLACE(t.cpf, '\D', '', 'g') = REGEXP_REPLACE($2, '\D', '', 'g')
  )
ORDER BY t.data_cobranca DESC
`

type ListTransactionsByProfessionalParams struct {
	ProfissionalID pgtype.UUID `json:"profissional_id"`
	Column2        string      `json:"column_2"`
}

type ListTransactionsByProfessionalRow struct {
	ID               pgtype.UUID        `json:"id"`
	FotID            pgtype.UUID        `json:"fot_id"`
	DataCobranca     pgtype.Date        `json:"data_cobranca"`
	TipoEvento       pgtype.Text        `json:"tipo_evento"`
	TipoServico      pgtype.Text        `json:"tipo_servico"`
	ProfessionalName pgtype.Text        `json:"professional_name"`
	Whatsapp         pgtype.Text        `json:"whatsapp"`
	Cpf              pgtype.Text        `json:"cpf"`
	TabelaFree       pgtype.Text        `json:"tabela_free"`
	ValorFree        pgtype.Numeric     `json:"valor_free"`
	ValorExtra       pgtype.Numeric     `json:"valor_extra"`
	DescricaoExtra   pgtype.Text        `json:"descricao_extra"`
	TotalPagar       pgtype.Numeric     `json:"total_pagar"`
	DataPagamento    pgtype.Date        `json:"data_pagamento"`
	PgtoOk           pgtype.Bool        `json:"pgto_ok"`
	CriadoEm         pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm     pgtype.Timestamptz `json:"atualizado_em"`
	ProfissionalID   pgtype.UUID        `json:"profissional_id"`
	FotNumero        pgtype.Int4        `json:"fot_numero"`
	EmpresaNome      pgtype.Text        `json:"empresa_nome"`
	CursoNome        pgtype.Text        `json:"curso_nome"`
}

func (q *Queries) ListTransactionsByProfessional(ctx context.Context, arg ListTransactionsByProfessionalParams) ([]ListTransactionsByProfessionalRow, error) {
	rows, err := q.db.Query(ctx, listTransactionsByProfessional, arg.ProfissionalID, arg.Column2)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListTransactionsByProfessionalRow
	for rows.Next() {
		var i ListTransactionsByProfessionalRow
		if err := rows.Scan(
			&i.ID,
			&i.FotID,
			&i.DataCobranca,
			&i.TipoEvento,
			&i.TipoServico,
			&i.ProfessionalName,
			&i.Whatsapp,
			&i.Cpf,
			&i.TabelaFree,
			&i.ValorFree,
			&i.ValorExtra,
			&i.DescricaoExtra,
			&i.TotalPagar,
			&i.DataPagamento,
			&i.PgtoOk,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.ProfissionalID,
			&i.FotNumero,
			&i.EmpresaNome,
			&i.CursoNome,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const sumTotalByFot = `-- name: SumTotalByFot :one
SELECT COALESCE(SUM(total_pagar), 0)::NUMERIC 
FROM financial_transactions 
WHERE fot_id = $1
`

func (q *Queries) SumTotalByFot(ctx context.Context, fotID pgtype.UUID) (pgtype.Numeric, error) {
	row := q.db.QueryRow(ctx, sumTotalByFot, fotID)
	var column_1 pgtype.Numeric
	err := row.Scan(&column_1)
	return column_1, err
}

const updateTransaction = `-- name: UpdateTransaction :one
UPDATE financial_transactions SET 
  fot_id = $2, data_cobranca = $3, tipo_evento = $4, tipo_servico = $5, 
  professional_name = $6, whatsapp = $7, cpf = $8, tabela_free = $9, 
  valor_free = $10, valor_extra = $11, descricao_extra = $12, 
  total_pagar = $13, data_pagamento = $14, pgto_ok = $15,
  atualizado_em = NOW()
WHERE id = $1
RETURNING id, fot_id, data_cobranca, tipo_evento, tipo_servico, professional_name, whatsapp, cpf, tabela_free, valor_free, valor_extra, descricao_extra, total_pagar, data_pagamento, pgto_ok, criado_em, atualizado_em, profissional_id
`

type UpdateTransactionParams struct {
	ID               pgtype.UUID    `json:"id"`
	FotID            pgtype.UUID    `json:"fot_id"`
	DataCobranca     pgtype.Date    `json:"data_cobranca"`
	TipoEvento       pgtype.Text    `json:"tipo_evento"`
	TipoServico      pgtype.Text    `json:"tipo_servico"`
	ProfessionalName pgtype.Text    `json:"professional_name"`
	Whatsapp         pgtype.Text    `json:"whatsapp"`
	Cpf              pgtype.Text    `json:"cpf"`
	TabelaFree       pgtype.Text    `json:"tabela_free"`
	ValorFree        pgtype.Numeric `json:"valor_free"`
	ValorExtra       pgtype.Numeric `json:"valor_extra"`
	DescricaoExtra   pgtype.Text    `json:"descricao_extra"`
	TotalPagar       pgtype.Numeric `json:"total_pagar"`
	DataPagamento    pgtype.Date    `json:"data_pagamento"`
	PgtoOk           pgtype.Bool    `json:"pgto_ok"`
}

func (q *Queries) UpdateTransaction(ctx context.Context, arg UpdateTransactionParams) (FinancialTransaction, error) {
	row := q.db.QueryRow(ctx, updateTransaction,
		arg.ID,
		arg.FotID,
		arg.DataCobranca,
		arg.TipoEvento,
		arg.TipoServico,
		arg.ProfessionalName,
		arg.Whatsapp,
		arg.Cpf,
		arg.TabelaFree,
		arg.ValorFree,
		arg.ValorExtra,
		arg.DescricaoExtra,
		arg.TotalPagar,
		arg.DataPagamento,
		arg.PgtoOk,
	)
	var i FinancialTransaction
	err := row.Scan(
		&i.ID,
		&i.FotID,
		&i.DataCobranca,
		&i.TipoEvento,
		&i.TipoServico,
		&i.ProfessionalName,
		&i.Whatsapp,
		&i.Cpf,
		&i.TabelaFree,
		&i.ValorFree,
		&i.ValorExtra,
		&i.DescricaoExtra,
		&i.TotalPagar,
		&i.DataPagamento,
		&i.PgtoOk,
		&i.CriadoEm,
		&i.AtualizadoEm,
		&i.ProfissionalID,
	)
	return i, err
}
