feat: enhance cutting and purchase services by adding raw material attributes and updating related UI components for improved material management
This commit is contained in:
parent
8da733ec08
commit
944c0bc14a
@ -811,10 +811,15 @@ private function breakMaterialCircularReference(CuttingMaterial $material): void
|
||||
if ($price) {
|
||||
$rawMaterial = $price->rawMaterial;
|
||||
|
||||
$material->setAttribute('variant', $price->variant);
|
||||
|
||||
if ($rawMaterial) {
|
||||
$unitAbbreviation = $rawMaterial->unit->abbreviation();
|
||||
$price->setAttribute('unit_abbreviation', $unitAbbreviation);
|
||||
$material->setAttribute('unit_abbreviation', $unitAbbreviation);
|
||||
$material->setAttribute('raw_material_id', $rawMaterial->id);
|
||||
$material->setAttribute('raw_material_name', $rawMaterial->name);
|
||||
$material->setAttribute('raw_material_unit_label', $rawMaterial->unit->label());
|
||||
}
|
||||
|
||||
$price->unsetRelation('rawMaterial');
|
||||
|
||||
@ -795,10 +795,15 @@ private function breakItemCircularReference(PurchaseItem $item): void
|
||||
if ($price) {
|
||||
$rawMaterial = $price->rawMaterial;
|
||||
|
||||
$item->setAttribute('variant', $price->variant);
|
||||
|
||||
if ($rawMaterial) {
|
||||
$unitAbbreviation = $rawMaterial->unit->abbreviation();
|
||||
$price->setAttribute('unit_abbreviation', $unitAbbreviation);
|
||||
$item->setAttribute('unit_abbreviation', $unitAbbreviation);
|
||||
$item->setAttribute('raw_material_id', $rawMaterial->id);
|
||||
$item->setAttribute('raw_material_name', $rawMaterial->name);
|
||||
$item->setAttribute('raw_material_unit_label', $rawMaterial->unit->label());
|
||||
}
|
||||
|
||||
$price->unsetRelation('rawMaterial');
|
||||
|
||||
@ -17,7 +17,7 @@ function formatMaterialUsage(mat: any): string {
|
||||
}
|
||||
|
||||
function getMaterialUnit(mat: any): string {
|
||||
return mat.raw_material_price?.raw_material?.unit_abbreviation ?? '';
|
||||
return mat.unit_abbreviation ?? '';
|
||||
}
|
||||
|
||||
interface MaterialUsageGroup {
|
||||
@ -29,7 +29,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] {
|
||||
const groups: Record<string, number> = {};
|
||||
|
||||
materials.forEach((mat) => {
|
||||
const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? '';
|
||||
const unit = mat.unit_abbreviation ?? '';
|
||||
const usage = Number(mat.material_usage ?? 0);
|
||||
groups[unit] = (groups[unit] ?? 0) + usage;
|
||||
});
|
||||
@ -94,7 +94,7 @@ const totalCompleted = computed(() => props.cuttings.length);
|
||||
<span class="font-medium text-foreground">Bahan Baku:</span>
|
||||
<ul class="list-disc pl-4 space-y-0.5 text-muted-foreground">
|
||||
<li v-for="mat in cutting.materials" :key="mat.id">
|
||||
{{ mat.raw_material_price?.raw_material?.name }} ({{ mat.raw_material_price?.variant }}) - {{ formatMaterialUsage(mat) }} {{ getMaterialUnit(mat) }}
|
||||
{{ mat.raw_material_name }} ({{ mat.variant }}) - {{ formatMaterialUsage(mat) }} {{ getMaterialUnit(mat) }}
|
||||
</li>
|
||||
<li v-if="!cutting.materials.length">Belum ada bahan baku</li>
|
||||
</ul>
|
||||
|
||||
@ -59,10 +59,9 @@ function getGroupedMaterials(materials: any[]): GroupedCuttingMaterials[] {
|
||||
const groups: Record<number, GroupedCuttingMaterials> = {};
|
||||
|
||||
materials.forEach((item) => {
|
||||
const rawMaterial = item.raw_material_price?.raw_material;
|
||||
const rawMaterialId = rawMaterial?.id ?? 0;
|
||||
const rawMaterialName = rawMaterial?.name ?? 'Bahan Baku Tidak Diketahui';
|
||||
const unitLabel = rawMaterial?.unit_label;
|
||||
const rawMaterialId = item.raw_material_id ?? 0;
|
||||
const rawMaterialName = item.raw_material_name || 'Bahan Baku Tidak Diketahui';
|
||||
const unitLabel = item.raw_material_unit_label;
|
||||
|
||||
if (!groups[rawMaterialId]) {
|
||||
groups[rawMaterialId] = {
|
||||
@ -176,7 +175,7 @@ function getGroupedResults(results: any[]): GroupedCuttingResults[] {
|
||||
</TableRow>
|
||||
<TableRow v-for="material in group.items" :key="material.id">
|
||||
<TableCell class="pl-6 font-medium">
|
||||
{{ material.raw_material_price?.variant }}
|
||||
{{ material.variant }}
|
||||
</TableCell>
|
||||
<TableCell class="tabular-nums">
|
||||
{{ material.material_usage_formatted }}
|
||||
|
||||
@ -8,7 +8,7 @@ function formatMaterialUsage(mat: any): string {
|
||||
}
|
||||
|
||||
function getMaterialUnit(mat: any): string {
|
||||
return mat.raw_material_price?.raw_material?.unit_abbreviation ?? '';
|
||||
return mat.unit_abbreviation ?? '';
|
||||
}
|
||||
|
||||
interface MaterialUsageGroup {
|
||||
@ -20,7 +20,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] {
|
||||
const groups: Record<string, number> = {};
|
||||
|
||||
materials.forEach((mat) => {
|
||||
const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? '';
|
||||
const unit = mat.unit_abbreviation ?? '';
|
||||
const usage = Number(mat.material_usage ?? 0);
|
||||
groups[unit] = (groups[unit] ?? 0) + usage;
|
||||
});
|
||||
@ -66,8 +66,8 @@ defineProps<{
|
||||
<span class="font-medium text-foreground">Bahan Baku:</span>
|
||||
<ul class="list-disc pl-4 space-y-0.5 text-muted-foreground">
|
||||
<li v-for="mat in cutting.materials" :key="mat.id">
|
||||
{{ mat.raw_material_price?.raw_material?.name }} ({{
|
||||
mat.raw_material_price?.variant }}) - {{ formatMaterialUsage(mat) }} {{ getMaterialUnit(mat) }}
|
||||
{{ mat.raw_material_name }} ({{
|
||||
mat.variant }}) - {{ formatMaterialUsage(mat) }} {{ getMaterialUnit(mat) }}
|
||||
</li>
|
||||
<li v-if="!cutting.materials.length">Belum ada bahan baku</li>
|
||||
</ul>
|
||||
|
||||
@ -58,10 +58,9 @@ function getGroupedItems(items: PurchaseItemDetail[]): GroupedPurchaseItems[] {
|
||||
const groups: Record<number, GroupedPurchaseItems> = {};
|
||||
|
||||
items.forEach((item) => {
|
||||
const rawMaterial = item.raw_material_price?.raw_material;
|
||||
const rawMaterialId = rawMaterial?.id ?? 0;
|
||||
const rawMaterialName = rawMaterial?.name ?? 'Bahan Baku Tidak Diketahui';
|
||||
const unitLabel = rawMaterial?.unit_label;
|
||||
const rawMaterialId = item.raw_material_id ?? 0;
|
||||
const rawMaterialName = item.raw_material_name || 'Bahan Baku Tidak Diketahui';
|
||||
const unitLabel = item.raw_material_unit_label;
|
||||
|
||||
if (!groups[rawMaterialId]) {
|
||||
groups[rawMaterialId] = {
|
||||
@ -150,7 +149,7 @@ function getGroupedItems(items: PurchaseItemDetail[]): GroupedPurchaseItems[] {
|
||||
</TableRow>
|
||||
<TableRow v-for="item in group.items" :key="item.id">
|
||||
<TableCell class="pl-6 font-medium">
|
||||
{{ item.raw_material_price?.variant }}
|
||||
{{ item.variant }}
|
||||
</TableCell>
|
||||
<TableCell class="tabular-nums">
|
||||
{{ item.quantity_formatted }}
|
||||
|
||||
@ -14,6 +14,10 @@ export type CuttingStatusAction = {
|
||||
export type CuttingMaterialListItem = {
|
||||
id: number;
|
||||
material_usage_formatted: string;
|
||||
variant?: string;
|
||||
raw_material_id?: number;
|
||||
raw_material_name?: string;
|
||||
raw_material_unit_label?: string;
|
||||
raw_material_price?: {
|
||||
id: number;
|
||||
variant: string;
|
||||
|
||||
@ -8,12 +8,16 @@ export type PurchaseItemListItem = {
|
||||
id: number;
|
||||
raw_material_name: string;
|
||||
variant_name: string;
|
||||
variant?: string;
|
||||
quantity_formatted: string;
|
||||
unit_price_formatted: string;
|
||||
subtotal_formatted: string;
|
||||
};
|
||||
|
||||
export type PurchaseItemDetail = PurchaseItemListItem & {
|
||||
raw_material_id?: number;
|
||||
raw_material_name?: string;
|
||||
raw_material_unit_label?: string;
|
||||
raw_material_price?: {
|
||||
id: number;
|
||||
variant: string;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user