71 lines
1.8 KiB
Go
Raw Permalink Normal View History

package repository
import (
"context"
"database/sql"
"time"
"github.com/muyuqingfeng/iloom/textile-service/internal/model"
)
type PaymentRepo struct {
db *sql.DB
}
func NewPaymentRepo(db *sql.DB) *PaymentRepo {
return &PaymentRepo{db: db}
}
func (r *PaymentRepo) ListByCompany(ctx context.Context, companyID string) ([]model.Payment, error) {
query := `
SELECT p.id, p.plan_id, p.from_company_id, p.to_company_id,
p.amount, p.quantity, p.price_per_meter, p.status, p.paid_at, p.created_at,
COALESCE(pp.plan_code, '') AS plan_code,
COALESCE(c.name, '') AS from_company_name
FROM ilm_payment p
LEFT JOIN ilm_production_plan pp ON p.plan_id = pp.id
LEFT JOIN ilm_company c ON p.from_company_id = c.id
WHERE p.to_company_id = ?
ORDER BY p.created_at DESC`
rows, err := r.db.QueryContext(ctx, query, companyID)
if err != nil {
return nil, err
}
defer rows.Close()
var payments []model.Payment
for rows.Next() {
var p model.Payment
if err := rows.Scan(
&p.ID, &p.PlanID, &p.FromCompanyID, &p.ToCompanyID,
&p.Amount, &p.Quantity, &p.PricePerMeter, &p.Status, &p.PaidAt, &p.CreatedAt,
&p.PlanCode, &p.FromCompanyName,
); err != nil {
return nil, err
}
payments = append(payments, p)
}
return payments, rows.Err()
}
func (r *PaymentRepo) Confirm(ctx context.Context, paymentID string) error {
now := time.Now()
query := `
UPDATE ilm_payment
SET status = 'paid', paid_at = ?
WHERE id = ?`
_, err := r.db.ExecContext(ctx, query, now, paymentID)
return err
}
func (r *PaymentRepo) CountPending(ctx context.Context, companyID string) (int, error) {
var count int
err := r.db.QueryRowContext(ctx,
`SELECT COUNT(*) FROM ilm_payment WHERE to_company_id = ? AND status = 'pending'`,
companyID,
).Scan(&count)
return count, err
}