Crear ordenes de compra
Comprar curso

53. Crear ordenes de compra


4 comentarios

Inicia sesión para comentar

Comentarios:

  • Ariel Sf

    Ariel Sf hace 3 semanas

    Hola Victor, primero antes que nada muy buen curso, contenido, explicaciones y soluciones a los problemas que van apareciendo, perfecto, pero eso ya es algo habitual en tus cursos. Si se puede pedir algo más, te pediria 'como modificar una orden de compra, agregar algun producto faltante, modificar alguna cantidad, quitrar algun producto…. y aunque ya tenes videos que lo explicas, agregar roles y permisos, a veces no son los mismos los que venden que los que compran, y estaria bueno que cada uno tenga sus roles. Agradecido por todo lo aprendido.. 

  • Victor Arana Flores

    Victor Arana Flores hace 1 mes

    Vista del componente

    <div x-data="{
        products: @entangle('products'),
    
        total: @entangle('total'),
    
        removeProduct(index) {
            this.products.splice(index, 1);
        },
    
        init()
        {
            this.$watch('products', (newProducts) => {
                
                let total = 0;
    
                newProducts.forEach(product => {
                    total += product.quantity * product.price;
                });
    
                this.total = total;
            });
        }
    }">
        
        <x-wire-card>
    
            <form wire:submit="save" class="space-y-4">
    
                <div class="grid lg:grid-cols-4 gap-4">
                    <x-wire-native-select
                        label="Tipo de comprobante"
                        wire:model="voucher_type">
    
                        <option value="1">
                            Factura
                        </option>
    
                        <option value="2">
                            Boleta
                        </option>
    
                    </x-wire-native-select>
    
                    <x-wire-input
                        label="Serie"
                        wire:model="serie"
                        placeholder="Serie del comprobante"
                        disabled />
    
                    <x-wire-input
                        label="Correlativo"
                        wire:model="correlative"
                        placeholder="Correlativo del comprobante"
                        disabled />
    
                    <x-wire-input
                        label="Fecha"
                        wire:model="date"
                        type="date" />
                </div>
    
                <x-wire-select
                    label="Proveedor"
                    wire:model="supplier_id"
                    placeholder="Seleccione un proveedor"
                    :async-data="[
                        'api' => route('api.suppliers.index'),
                        'method' => 'POST',
                    ]"
                    option-label="name"
                    option-value="id"
                />
    
                <div class="lg:flex lg:space-x-4">
                    <x-wire-select
                        label="Producto"
                        wire:model="product_id"
                        placeholder="Seleccione un producto"
                        :async-data="[
                            'api' => route('api.products.index'),
                            'method' => 'POST',
                        ]"
                        option-label="name"
                        option-value="id"
                        class="flex-1"
                    />
    
                    <div class="flex-shrink-0">
                        <x-wire-button 
                            wire:click="addProduct"
                            spinner="addProduct"
                            class="w-full mt-4 lg:mt-6.5">
                            Agregar producto
                        </x-wire-button>
                    </div>
                </div>
    
                <div class="overflow-x-auto w-full">
                    <table class="w-full text-sm text-left">
                        <thead>
                            <tr class="text-gray-700 border-y bg-blue-50">
                                <th class="py-2 px-4">
                                    Producto
                                </th>
                                <th class="py-2 px-4">
                                    Cantidad
                                </th>
                                <th class="py-2 px-4">
                                    Precio
                                </th>
                                <th class="py-2 px-4">
                                    Subtotal
                                </th>
                                <th class="py-2 px-4"></th>
                            </tr>
                        </thead>
    
                        <tbody>
    
    
                            <template x-for="(product, index) in products" :key="product.id">
    
                                <tr class="border-b">
                                    <td class="px-4 py-1" x-text="product.name">
                                    </td>
                                    <td class="px-4 py-1">
                                        <x-wire-input
                                            x-model="product.quantity"
                                            type="number"
                                            class="w-20"
                                        />
                                    </td>
                                    <td class="px-4 py-1">
    
                                        <x-wire-input
                                            x-model="product.price"
                                            type="number"
                                            class="w-20"
                                            step="0.01"
                                        />
                                    </td>
                                    <td class="px-4 py-1"
                                        x-text="(product.quantity * product.price).toFixed(2)">
                                    </td>
                                    <td class="px-4 py-1">
                                        <x-wire-mini-button
                                            rounded
                                            x-on:click="removeProduct(index)"
                                            icon="trash"
                                            red
                                        />
                                    </td>
                                </tr>
    
                            </template>
    
                            <template x-if="products.length === 0">
                                <tr>
                                    <td colspan="5" class="text-center text-gray-500 py-4">
                                        No hay productos agregados.
                                    </td>
                                </tr>
                            </template>
    
                        </tbody>
                    </table>
                </div>
                
    
                <div class="flex items-center space-x-4">
    
                    <x-label>
                        Observaciones
                    </x-label>
    
                    <x-wire-input
                        class="flex-1"
                        wire:model="observation"
                    />
    
                    <div>
                        Total: S/. <span x-text="total.toFixed(2)"></span>
                    </div>
    
                </div>
                
                <div class="flex justify-end">
                    <x-wire-button 
                        type="submit" 
                        icon="check"
                        spinner="save"
                        >
                        Guardar
                    </x-wire-button>
                </div>
    
            </form>
    
        </x-wire-card>
    
    </div>
    
  • Victor Arana Flores

    Victor Arana Flores hace 1 mes

    Clase del componente

    <?php
    
    namespace App\Livewire\Admin;
    
    use App\Models\Product;
    use App\Models\PurchaseOrder;
    use Livewire\Component;
    
    class PurchaseOrderCreate extends Component
    {
        public $voucher_type = 1;
    
        public $serie = 'OC01';
        public $correlative;
    
        public $date;
    
        public $supplier_id;
    
        public $total = 0;
    
        public $observation;
    
        public $product_id;
    
        public $products = [];
    
        public function boot()
        {
            //Verificar si hay errores de validación previos
            $this->withValidator(function ($validator) {
                if($validator->fails()){
                    
                    $errors = $validator->errors()->toArray();
    
                    $html = "<ul class='text-left'>";
    
                    foreach ($errors as $error) {
                        $html .= "<li>{$error[0]}</li>";
                    }
    
                    $html .= "</ul>";
    
                    $this->dispatch('swal', [
                        'icon' => 'error',
                        'title' => 'Error de validación',
                        'html' => $html,
                    ]);
    
                }
            });
        }
    
        public function mount()
        {
            $this->correlative = PurchaseOrder::max('correlative') + 1;
        }
    
        public function addProduct()
        {
            $this->validate([
                'product_id' => 'required|exists:products,id',
            ],[],[
                'product_id' => 'producto',
            ]);
    
            $existing = collect($this->products)
                ->firstWhere('id', $this->product_id);
    
            if ($existing) {
    
                $this->dispatch('swal', [
                    'icon' => 'warning',
                    'title' => 'Producto ya agregado',
                    'text' => 'El producto ya se encuentra en la lista.',
                ]);
    
                return;
            }
    
            $product = Product::find($this->product_id);
    
            $this->products[] = [
                'id' => $product->id,
                'name' => $product->name,
                'quantity' => 1,
                'price' => 0,
                'subtotal' => 0,
            ];
    
            $this->reset('product_id');
        }
    
        public function save()
        {
            $this->validate([
                'voucher_type' => 'required|in:1,2',
                'date' => 'nullable|date',
                'supplier_id' => 'required|exists:suppliers,id',
                'total' => 'required|numeric|min:0',
                'observation' => 'nullable|string|max:255',
                'products' => 'required|array|min:1',
                'products.*.id' => 'required|exists:products,id',
                'products.*.quantity' => 'required|numeric|min:1',
                'products.*.price' => 'required|numeric|min:0',
            ],[],[
                'voucher_type' => 'tipo de comprobante',
                'supplier_id' => 'proveedor',
                'observation' => 'observación',
                'products.*.id' => 'producto',
                'products.*.quantity' => 'cantidad',
                'products.*.price' => 'precio',
            ]);
    
            $purchaseOrder = PurchaseOrder::create([
                'voucher_type' => $this->voucher_type,
                'serie' => $this->serie,
                'correlative' => $this->correlative,
                'date' => $this->date ?? now(),
                'supplier_id' => $this->supplier_id,
                'total' => $this->total,
                'observation' => $this->observation,
            ]);
    
            foreach ($this->products as $product) {
                $purchaseOrder->products()->attach($product['id'], [
                    'quantity' => $product['quantity'],
                    'price' => $product['price'],
                    'subtotal' => $product['quantity'] * $product['price'],
                ]);
            }
    
            session()->flash('swal', [
                'icon' => 'success',
                'title' => '¡Bien hecho!',
                'text' => 'Orden de compra creada exitosamente.',
            ]);
    
            return redirect()->route('admin.purchase-orders.index');
        }
    
        public function render()
        {
            return view('livewire.admin.purchase-order-create');
        }
    }
  • Juliolopez456cesar

    Juliolopez456cesar hace 1 mes

    me puedes pasar el codigo de PurchaseOrderCreate porfavor

    • Victor Arana Flores hace 1 mes

      Hola Julio, acabo de publicarlo en un comentario de esta misma lección.