Files
voltcerto/resources/views/web/contract/add_edit.blade.php

674 lines
41 KiB
PHP

@extends('layouts.app')
@section('content')
<main>
<div class="container-xl px-4 mt-4">
{{-- Botões de ação no topo --}}
@if(isset($contract))
<div class="d-flex mb-4">
<a href="{{ route('contract.renew.form', $contract->id) }}" class="btn btn-success me-2">
<i class="fas fa-sync-alt me-1"></i> Renovar Contrato
</a>
<a href="{{ route('contract.history', $contract->id) }}" class="btn btn-secondary">
<i class="fas fa-history me-1"></i> Consultar Histórico
</a>
</div>
@endif
<div class="col-lg-12">
<div class="card border-0 shadow rounded-4">
<div class="card-header bg-white py-4 px-4 border-bottom d-flex justify-content-between align-items-center">
<h4 class="mb-0 fw-bold text-primary">
<i class="fas fa-file-signature me-2"></i>
{{ isset($contract) ? 'Editar Contrato' : 'Criar Novo Contrato' }}
</h4>
</div>
<div class="card-body p-4">
<form method="POST" action="{{ isset($contract) ? route('contract.update', $contract->id) : route('contract.store') }}">
@csrf
@if(isset($contract))
@method('PUT')
@endif
{{-- Cliente --}}
<div class="card mb-4 border-start border-4 border-primary shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-user-tag me-2 text-primary"></i>
<span class="fw-semibold text-primary">Selecionar Cliente</span>
</div>
<div class="card-body">
<label class="form-label fw-semibold">Cliente</label>
<input type="text" class="form-control" id="client_autocomplete" placeholder="Pesquisar cliente..." autocomplete="on" value="{{ optional($contract->client ?? null)->name ?? '' }}">
<input type="hidden" name="client_id" id="client_id" value="{{ old('client_id', $contract->client->id ?? $clientId ?? '') }}">
<small class="form-text text-muted mt-1">Digite pelo menos 2 caracteres para pesquisar.</small>
</div>
</div>
{{-- Financeira --}}
@can('view_contract_summary')
<div class="card mb-4 border-start border-4 border-success shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-euro-sign me-2 text-success"></i>
<span class="fw-semibold text-success">Informação Financeira</span>
</div>
<div class="card-body">
<div class="mb-3">
<label for="contract_value" class="form-label fw-semibold">Valor do Contrato (€)</label>
<input type="number" step="0.01" class="form-control input-numeric" name="contract_value" id="contract_value"
value="{{ old('contract_value', $contract->contract_value ?? '') }}" placeholder="0.00">
</div>
<div class="mb-3">
<label for="commission_value" class="form-label fw-semibold">Valor da Comissão (€)</label>
<input type="number" step="0.01" class="form-control input-numeric" name="commission_value" id="commission_value"
value="{{ old('commission_value', $contract->commission_value ?? '') }}" placeholder="0.00">
</div>
<div class="mb-3">
<label for="profit_value" class="form-label fw-semibold">Lucro (€)</label>
<input type="number" step="0.01" class="form-control fw-bold input-numeric" name="profit_value" id="profit_value" readonly
value="{{ old('profit_value', $contract->profit_value ?? '') }}" placeholder="0.00">
</div>
<div class="col-md-4 mb-3">
<label class="form-label">Pago</label>
<div class="d-flex align-items-center gap-4">
<div class="form-check">
<input type="hidden" name="paid" value="0">
<input class="form-check-input" type="checkbox" name="paid" id="paid"
value="1"
{{ old('paid', $contract->paid ?? false) ? 'checked' : '' }}>
<label class="form-check-label" for="paid">Sim</label>
</div>
<div class="form-check">
<input type="hidden" name="chargeback" value="0">
<input class="form-check-input" type="checkbox" name="chargeback" id="chargeback"
value="1"
{{ old('chargeback', $contract->chargeback ?? false) ? 'checked' : '' }}>
<label class="form-check-label" for="chargeback">chargeback</label>
</div>
</div>
<div id="chargeback_fields" class="row g-3 mt-1" style="display: none;">
<div class="col-md-6">
<label for="chargeback_value" class="form-label">Valor Chargeback (€)</label>
<input type="number" step="0.01" max="-0.01" class="form-control" name="chargeback_value" id="chargeback_value"
value="{{ old('chargeback_value', $contract->chargeback_value ?? '') }}">
</div>
<div class="col-md-6">
<label for="chargeback_date" class="form-label">Data de Chargeback</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-calendar-day text-secondary"></i></span>
<input type="date" name="chargeback_date" id="chargeback_date" class="form-control datepicker"
value="{{ old('chargeback_date', isset($contract->chargeback_date) ? \Carbon\Carbon::parse($contract->chargeback_date)->format('d/m/Y') : '') }}">
</div>
</div>
</div>
</div>
{{-- Parcelamento --}}
<div class="border-top pt-3 mt-3">
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="installments_enabled" name="installments_enabled"
{{ old('installments_enabled', isset($contract) && $contract->installments->count() > 0 ? 'checked' : '') }}>
<label class="form-check-label fw-semibold" for="installments_enabled">Ativar Parcelamento</label>
</div>
<div id="installments_section" style="display: none;">
<div class="mb-3 col-md-4">
<label for="installments_count" class="form-label fw-semibold">Número de Parcelas</label>
<select id="installments_count" name="installments_count" class="form-select">
<option value="">-- Selecionar --</option>
@for($i=1; $i<=$installments_count; $i++)
<option value="{{ $i }}"
{{ old('installments_count', isset($contract) ? $contract->installments->count() : '') == $i ? 'selected' : '' }}>
{{ $i }}
</option>
@endfor
</select>
</div>
<div id="installments_fields">
@for($i = 1; $i <= $installments_count; $i++)
@php
$installment = old("installments.$i", isset($contract) && $contract->installments->count() >= $i ? $contract->installments[$i-1]->toArray() : []);
$due_date_for_input = '';
if (!empty($installment['due_date'])) {
$dt = \DateTime::createFromFormat('Y-m-d', $installment['due_date']);
if ($dt) {
$due_date_for_input = $dt->format('d/m/Y');
}
}
@endphp
<div class="row g-3 mb-3 installment-row installment-{{ $i }}" style="display:none;">
<div class="col-md-4">
<label class="form-label">Data da Parcela {{ $i }}</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-calendar-day text-secondary"></i></span>
<input type="date" name="installments[{{ $i }}][due_date]" class="form-control datepicker"
value="{{ $due_date_for_input }}">
</div>
</div>
<div class="col-md-4">
<label class="form-label">Valor (€)</label>
<input type="number" step="0.01" name="installments[{{ $i }}][amount]" class="form-control"
value="{{ $installment['amount'] ?? '' }}">
</div>
<div class="col-md-4 d-flex align-items-center">
<div class="form-check mt-4">
<input type="hidden" name="installments[{{ $i }}][paid]" value="0">
<input type="checkbox" name="installments[{{ $i }}][paid]" value="1"
class="form-check-input"
{{ isset($installment['paid']) && $installment['paid'] ? 'checked' : '' }}>
<label class="form-check-label">Pago</label>
</div>
</div>
</div>
@endfor
</div>
</div>
</div>
</div>
</div>
@endcan
{{-- Informações Gerais --}}
<div class="card mb-4 border-start border-4 border-info shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-info-circle me-2 text-info"></i>
<span class="fw-semibold text-info">Informações Gerais</span>
</div>
<div class="card-body">
<div class="row g-4">
<div class="col-md-4">
<label class="form-label">Código do Contrato</label>
<input class="form-control" name="code" type="text" required value="{{ old('code', $contract->code ?? '') }}">
</div>
<div class="col-md-4">
<label class="form-label">Tipo</label>
<select name="supply_type" id="supply_type" class="form-select" required>
<option value="">-- Selecionar Tipo --</option>
<option value="cpe" {{ old('supply_type', $contract->supply_type ?? '') == 'cpe' ? 'selected' : '' }}>CPE (Luz)</option>
<option value="cui" {{ old('supply_type', $contract->supply_type ?? '') == 'cui' ? 'selected' : '' }}>CUI (Gás)</option>
</select>
</div>
<div class="col-md-4">
<label class="form-label">Tipo de Contrato</label>
<select name="contract_type_id" class="form-select" required>
<option value="">-- Selecionar Tipo --</option>
@foreach ($contractTypes as $type)
<option value="{{ $type->id }}" {{ old('contract_type_id', $contract->contract_type_id ?? '') == $type->id ? 'selected' : '' }}>
{{ $type->description }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">Vendedor</label>
<select name="seller_id" class="form-select" required>
@foreach ($sellers as $seller)
<option value="{{ $seller->id }}" {{ old('seller_id', $contract->seller_id ?? '') == $seller->id ? 'selected' : '' }}>
{{ $seller->name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">Tipologia</label>
<select name="typology_id" class="form-select" required>
<option value="">-- Selecionar Tipo --</option>
@foreach ($typology as $type)
<option value="{{ $type->id }}" {{ old('typology_id', $contract->typology_id ?? '') == $type->id ? 'selected' : '' }}>
{{ $type->description }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">GO/KI *</label>
<input class="form-control input-numeric" name="go_ki" type="number" step="0.01" required value="{{ old('go_ki', $contract->go_ki ?? '') }}">
</div>
</div>
<div class="row g-4 mt-3">
<div class="col-md-12">
<label class="form-label">Morada de Fornecimento</label>
<input class="form-control" name="supply_address" id="supply_address" type="text" value="{{ old('supply_address', $contract->supply_address ?? '') }}">
</div>
</div>
</div>
</div>
{{-- Características Técnicas --}}
<div class="card mb-4 border-start border-4 border-secondary shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-bolt me-2 text-secondary"></i>
<span class="fw-semibold text-secondary">Características Técnicas</span>
</div>
<div class="card-body">
<div class="row g-4">
{{-- CPE AREA --}}
<div class="col-md-4 power-consumption-group">
<label class="form-label">Potência (kWh)</label>
<select name="power_tier_id" class="form-select">
<option value="">-- Selecionar Potência --</option>
@foreach ($powerTiers as $tier)
<option value="{{ $tier->id }}" {{ old('power_tier_id', $contract->power_tier_id ?? '') == $tier->id ? 'selected' : '' }}>
{{ $tier->name }}
</option>
@endforeach
</select>
</div>
{{-- CUI AREA --}}
<div class="col-md-4 escalon-group">
<label class="form-label">Escalão</label>
<select name="cui_tier_id" id="cui_tier_id" class="form-select">
<option value="">-- Selecionar Escalão --</option>
@foreach ($cui_tiers as $tier)
<option value="{{ $tier->id }}" {{ old('escalon_id', $contract->cui_tier_id ?? '') == $tier->id ? 'selected' : '' }}>
{{ $tier->name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">Consumo Anual (kWh)</label>
<input class="form-control decimal-input" name="annual_consumption" type="text"
value="{{ old('annual_consumption', isset($contract) && isset($contract->annual_consumption) && fmod($contract->annual_consumption, 1) == 0 ? (int) $contract->annual_consumption : ($contract->annual_consumption ?? '')) }}">
</div>
</div>
</div>
</div>
{{-- Método de Pagamento --}}
<div class="card mb-4 border-start border-4 border-success shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-credit-card me-2 text-success"></i>
<span class="fw-semibold text-success">Método de Pagamento</span>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Método de Pagamento</label>
<select name="payment_method_id" class="form-select" required>
<option value="">-- Selecionar --</option>
@foreach ($paymentMethods as $method)
<option value="{{ $method->id }}"
{{ old('payment_method_id', $contract->payment_method_id ?? '') == $method->id ? 'selected' : '' }}>
{{ $method->name }}
</option>
@endforeach
</select>
@error('payment_method_id')
<div class="text-danger mt-2 small">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label class="form-label">Método de Envio</label>
<select name="delivery_method" id="delivery_method" class="form-select" required>
<option value="">-- Selecionar --</option>
<option value="correio" {{ old('delivery_method', $contract->delivery_method ?? '') == 'correio' ? 'selected' : '' }}>Correio</option>
<option value="email" {{ old('delivery_method', $contract->delivery_method ?? '') == 'email' ? 'selected' : '' }}>Email</option>
</select>
</div>
</div>
<div class="row mt-4">
<div class="col-md-6" id="delivery_email_group">
<label class="form-label">Email de Envio</label>
<input class="form-control" name="delivery_email" id="delivery_email" type="email" value="{{ old('delivery_email', $contract->delivery_email ?? '') }}">
</div>
</div>
</div>
</div>
{{-- Datas do Contrato --}}
<div class="card mb-4 border-start border-4 border-warning shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-calendar-alt me-2 text-warning"></i>
<span class="fw-semibold text-warning">Datas do Contrato</span>
</div>
<div class="card-body">
<div class="row g-4">
{{-- Data de Contrato --}}
<div class="col-md-4">
<label class="form-label">Contrato</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-calendar-day text-secondary"></i></span>
<input type="date" name="contract_date" class="form-control datepicker"
value="{{ old('contract_date', isset($contract->contract_date) ? \Carbon\Carbon::parse($contract->contract_date)->format('d/m/Y') : '') }}">
</div>
</div>
{{-- Data de Ativação --}}
<div class="col-md-4">
<label class="form-label">Ativação</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-bolt text-success"></i></span>
<input type="date" name="activation_date" class="form-control datepicker"
value="{{ old('activation_date', isset($contract->activation_date) ? \Carbon\Carbon::parse($contract->activation_date)->format('d/m/Y') : '') }}">
</div>
</div>
{{-- Data de Renovação --}}
<div class="col-md-4">
<label class="form-label">Renovação</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-sync-alt text-primary"></i></span>
<input type="date" name="validity" class="form-control datepicker"
value="{{ old('validity', isset($contract->validity) ? \Carbon\Carbon::parse($contract->validity)->format('d/m/Y') : '') }}">
</div>
</div>
{{-- Data de Renovação --}}
<div class="col-md-4">
<label class="form-label">Fim de Contrato</label>
<div class="input-group">
<span class="input-group-text bg-light"><i class="fas fa-calendar-times text-danger"></i></span>
<input type="date" name="contract_end_date" class="form-control datepicker"
value="{{ old('contract_end_date', isset($contract->contract_end_date) ? \Carbon\Carbon::parse($contract->contract_end_date)->format('d/m/Y') : '') }}">
</div>
</div>
</div>
</div>
</div>
{{-- Outras Informações --}}
<div class="card mb-4 border-start border-4 border-dark shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-clipboard-list me-2 text-dark"></i>
<span class="fw-semibold text-dark">Outras Informações</span>
</div>
<div class="card-body">
<div class="row g-4">
<div class="col-md-4">
<label class="form-label">Antigo Comercializador</label>
<select name="previous_supplier_id" class="form-select" id="previous_supplier_select">
<option value="">-- Selecionar --</option>
@foreach ($suppliers as $supplier)
<option value="{{ $supplier->id }}"
data-color="{{ $supplier->color }}"
style="background-color: {{ $supplier->color }};"
{{ old('previous_supplier_id', $contract->previous_supplier_id ?? '') == $supplier->id ? 'selected' : '' }}>
{{ $supplier->name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">Novo Comercializador</label>
<select name="new_supplier_id" class="form-select" id="new_supplier_select">
<option value="">-- Selecionar --</option>
@foreach ($suppliers as $supplier)
<option value="{{ $supplier->id }}"
data-color="{{ $supplier->color }}"
style="background-color: {{ $supplier->color }};"
{{ old('new_supplier_id', $contract->new_supplier_id ?? '') == $supplier->id ? 'selected' : '' }}>
{{ $supplier->name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<label class="form-label">Estado do Contrato</label>
<select name="status_id" id="status_id" class="form-select" required>
<option value="">-- Selecionar Estado --</option>
@foreach ($contractStatus as $status)
<option value="{{ $status->id }}" {{ old('status_id', $contract->status_id ?? '') == $status->id ? 'selected' : '' }}>
{{ $status->description }}
</option>
@endforeach
</select>
</div>
</div>
</div>
</div>
{{-- Notas --}}
<div class="card mb-4 border-start border-4 border-muted shadow-sm">
<div class="card-header bg-light d-flex align-items-center">
<i class="fas fa-sticky-note me-2 text-muted"></i>
<span class="fw-semibold text-muted">Notas</span>
</div>
<div class="card-body">
<textarea class="form-control" name="notes" rows="3">{{ old('notes', $contract->notes ?? '') }}</textarea>
</div>
</div>
{{-- Botões --}}
<div class="d-flex justify-content-end">
<a href="{{ isset($clientId) ? route('client.detail', ['id' => $clientId]) : route('contract.list') }}" class="btn btn-outline-secondary me-2">
Cancelar
</a>
<button class="btn btn-primary px-4" type="submit">
<i class="fas fa-save me-2"></i> {{ isset($contract) ? 'Atualizar' : 'Gravar Contrato' }}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</main>
<script>
$(document).ready(function () {
function loadClientInfo(clientID) {
// AJAX Client
$.ajax({
url: "{{ route('utils.ajax.clients.search.id') }}",
type: 'POST',
dataType: 'json',
cache: false,
data: {
_token: '{{ csrf_token() }}',
id: clientID
}
}).done(function (data) {
$('#delivery_method').val("email");
$('#delivery_email').val(data.email);
$('#client_autocomplete').val(data.name);
$('#supply_address').val(data.address + " " + data.locality);
toggleEmailField();
});
}
loadClientInfo($('#client_id').val());
// Installment
const installmentsEnabled = $('#installments_enabled');
const installmentsSection = $('#installments_section');
const installmentsCount = $('#installments_count');
const chargeback = $('#chargeback');
const chargebackFields = $('#chargeback_fields');
function toggleChargebackFields() {
const isChargeback = chargeback.is(':checked');
chargebackFields.toggle(isChargeback);
$('#chargeback_value, #chargeback_date').prop('required', isChargeback);
if (isChargeback) {
$('#status_id').val('6');
}
}
chargeback.on('change', function () {
if (!chargeback.is(':checked')) {
$('#chargeback_value, #chargeback_date').val('');
}
toggleChargebackFields();
});
toggleChargebackFields();
function toggleInstallmentsSection() {
if (installmentsEnabled.is(':checked')) {
installmentsSection.show();
} else {
installmentsSection.hide();
$('.installment-row').hide();
}
}
function toggleInstallmentsFields() {
const count = parseInt(installmentsCount.val()) || 0;
$('.installment-row').hide();
for (let i = 1; i <= count; i++) {
$(`.installment-${i}`).show();
}
}
installmentsEnabled.on('change', toggleInstallmentsSection);
installmentsCount.on('change', toggleInstallmentsFields);
toggleInstallmentsSection();
toggleInstallmentsFields();
function toggleTechnicalFields() {
const supplyType = $('#supply_type').val();
if (supplyType === 'cpe') {
$('.power-consumption-group').show();
$('.escalon-group').hide();
} else if (supplyType === 'cui') {
$('.power-consumption-group').hide();
$('.escalon-group').show();
} else {
$('.power-consumption-group').hide();
$('.escalon-group').hide();
}
}
$('#supply_type').on('change', toggleTechnicalFields);
toggleTechnicalFields();
$('#client_autocomplete').autocomplete({
source: function(request, response) {
$.ajax({
url: '{{ route('utils.ajax.clients.search.name') }}',
dataType: 'json',
data: {
term: request.term
},
success: function(data) {
response(data);
}
});
},
minLength: 2,
select: function (event, ui) {
$('#client_autocomplete').val(ui.item.label);
$('#client_id').val(ui.item.id);
loadClientInfo(ui.item.id);
return false;
}
});
const deliveryMethod = $('#delivery_method');
const deliveryEmailGroup = $('#delivery_email_group');
function toggleEmailField() {
if (deliveryMethod.val() === 'email') {
deliveryEmailGroup.show();
} else {
deliveryEmailGroup.hide();
deliveryEmailGroup.find('input').val('');
}
}
toggleEmailField();
deliveryMethod.on('change', toggleEmailField);
function calculateProfit() {
const contract = parseFloat($('#contract_value').val()) || 0;
const commission = parseFloat($('#commission_value').val()) || 0;
const chargeback = parseFloat($('#chargeback_value').val()) || 0;
const profit = contract - Math.abs(commission) + chargeback;
const $profitField = $('#profit_value');
$profitField.val(profit.toFixed(2));
$profitField.removeClass('is-valid is-invalid text-success text-danger border-success border-danger');
if (profit > 0) {
$profitField.addClass('is-valid text-success border-success');
} else if (profit < 0) {
$profitField.addClass('is-invalid text-danger border-danger');
}
}
$('#contract_value, #commission_value, #chargeback_value').on('input', calculateProfit);
calculateProfit();
function applyColor(selectId) {
const color = $(`#${selectId} option:selected`).data('color') || '#ffffff';
$(`#${selectId}`).css({
'border': `2px solid ${color}`,
'box-shadow': `0 0 0 0.1rem ${color}33`
});
}
applyColor('new_supplier_select');
applyColor('previous_supplier_select');
$('#new_supplier_select').on('change', function () {
applyColor('new_supplier_select');
});
$('#previous_supplier_select').on('change', function () {
applyColor('previous_supplier_select');
});
});
const duplicateCodeMessage = @json($errors->first('duplicate_code'));
if (duplicateCodeMessage) {
const form = document.querySelector('form');
const submitConfirmed = () => {
let confirmation = form.querySelector('input[name="confirm_duplicate"]');
if (!confirmation) {
confirmation = document.createElement('input');
confirmation.type = 'hidden';
confirmation.name = 'confirm_duplicate';
form.appendChild(confirmation);
}
confirmation.value = '1';
form.submit();
};
if (window.Swal) {
Swal.fire({
title: 'CPE/CUI já existente',
text: duplicateCodeMessage,
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Aceitar e gravar',
cancelButtonText: 'Cancelar',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
submitConfirmed();
}
});
} else if (window.confirm(`${duplicateCodeMessage}\n\nDeseja continuar?`)) {
submitConfirmed();
}
}
</script>
@endsection