100 lines
3.1 KiB
JavaScript
100 lines
3.1 KiB
JavaScript
const { query } = require('../database/db');
|
|
|
|
class ChickenCount {
|
|
static async upsert(date, kandangId, filename, totalCount) {
|
|
const result = await query(`
|
|
INSERT INTO chicken_counting (date, kandang_id, filename, total_count)
|
|
VALUES ($1, $2, $3, $4)
|
|
ON CONFLICT (date, kandang_id)
|
|
DO UPDATE SET
|
|
filename = EXCLUDED.filename,
|
|
total_count = EXCLUDED.total_count,
|
|
updated_at = NOW()
|
|
RETURNING *
|
|
`, [date, kandangId, filename, totalCount]);
|
|
|
|
// Fetch with kandang name
|
|
const record = await query(`
|
|
SELECT cc.*, k.name as kandang_name
|
|
FROM chicken_counting cc
|
|
JOIN kandangs k ON cc.kandang_id = k.id
|
|
WHERE cc.id = $1
|
|
`, [result.rows[0].id]);
|
|
|
|
return this.formatRecord(record.rows[0]);
|
|
}
|
|
|
|
static async insertIfNotExists(date, kandangId, filename, totalCount) {
|
|
// Check if record already exists
|
|
const existing = await query(`
|
|
SELECT cc.*, k.name as kandang_name
|
|
FROM chicken_counting cc
|
|
JOIN kandangs k ON cc.kandang_id = k.id
|
|
WHERE cc.date = $1 AND cc.kandang_id = $2
|
|
`, [date, kandangId]);
|
|
|
|
if (existing.rows.length > 0) {
|
|
// Record exists, return existing data without updating
|
|
return {
|
|
...this.formatRecord(existing.rows[0]),
|
|
skipped: true
|
|
};
|
|
}
|
|
|
|
// Record doesn't exist, insert new
|
|
const result = await query(`
|
|
INSERT INTO chicken_counting (date, kandang_id, filename, total_count)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING *
|
|
`, [date, kandangId, filename, totalCount]);
|
|
|
|
// Fetch with kandang name
|
|
const record = await query(`
|
|
SELECT cc.*, k.name as kandang_name
|
|
FROM chicken_counting cc
|
|
JOIN kandangs k ON cc.kandang_id = k.id
|
|
WHERE cc.id = $1
|
|
`, [result.rows[0].id]);
|
|
|
|
return {
|
|
...this.formatRecord(record.rows[0]),
|
|
skipped: false
|
|
};
|
|
}
|
|
|
|
static async getByDateRange(startDate, endDate, kandangId) {
|
|
let sql = `
|
|
SELECT cc.*, k.name as kandang_name
|
|
FROM chicken_counting cc
|
|
JOIN kandangs k ON cc.kandang_id = k.id
|
|
WHERE cc.date >= $1 AND cc.date <= $2
|
|
`;
|
|
const params = [startDate, endDate];
|
|
|
|
if (kandangId) {
|
|
sql += ` AND cc.kandang_id = $3`;
|
|
params.push(kandangId);
|
|
}
|
|
|
|
sql += ` ORDER BY cc.date ASC`;
|
|
|
|
const result = await query(sql, params);
|
|
return result.rows.map(row => this.formatRecord(row));
|
|
}
|
|
|
|
static formatRecord(record) {
|
|
return {
|
|
id: record.id,
|
|
date: record.date,
|
|
kandangId: record.kandang_id,
|
|
kandangName: record.kandang_name,
|
|
filename: record.filename,
|
|
totalCount: record.total_count,
|
|
createdAt: record.created_at,
|
|
updatedAt: record.updated_at
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = ChickenCount;
|